Android中使用HttpURLConnection实现GET POST JSON数据与下载图片
Android中使用HttpURLConnection实现GET POST JSON数据与下载图片
Android6.0中把Apache HTTP Client全部的包与类都标记为deprecated不再建议使用
全部跟HTTP相关的数据请求与提交操作都通过HttpURLConnection类实现,现实是
非常多Android开发人员一直都Apache HTTP Client来做andoirdclient与后台HTTP接口数
据交互,本人刚刚用HttpURLConnection做了一个android的APP。不小心踩到了几个
坑,总结下最经常使用的就通过HttpURLConnection来POST提交JSON数据与GET请求
JSON数据。此外就是下载图片,下载图片分为显示运行进度与不显示运行进度两种。
当中提交
数据的时候涉及中文一定要先把中文转码成utf-8之后在POST提交,否则就会一直遇到
HTTP 400的错误。
一:GET请求JSON数据的样例
- public UserDto execute(String... params) {
- InputStream inputStream = null;
- HttpURLConnection urlConnection = null;
- try {
- // read responseURLEncoder.encode(para, "GBK");
- String urlWithParams = DOMAIN_ADDRESS + MEMBER_REQUEST_TOKEN_URL + "?userName=" + java.net.URLEncoder.encode(params[0],"utf-8") + "&password=" + params[1];
- URL url = new URL(urlWithParams);
- urlConnection = (HttpURLConnection) url.openConnection();
- /* optional request header */
- urlConnection.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
- /* optional request header */
- urlConnection.setRequestProperty("Accept", "application/json");
- /* for Get request */
- urlConnection.setRequestMethod("GET");
- int statusCode = urlConnection.getResponseCode();
- /* 200 represents HTTP OK */
- if (statusCode == 200) {
- inputStream = new BufferedInputStream(urlConnection.getInputStream());
- String response = HttpUtil.convertInputStreamToString(inputStream);
- Gson gson = new Gson();
- UserDto dto = gson.fromJson(response, UserDto.class);
- if (dto != null && dto.getToken() != null) {
- Log.i("token", "find the token = " + dto.getToken());
- }
- return dto;
- }
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- if (inputStream != null) {
- try {
- inputStream.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- if (urlConnection != null) {
- urlConnection.disconnect();
- }
- }
- return null;
- }
二:POST提交JSON数据
- public Map<String, String> execute(NotificationDto dto) {
- InputStream inputStream = null;
- HttpURLConnection urlConnection = null;
- try {
- URL url = new URL(getUrl);
- urlConnection = (HttpURLConnection) url.openConnection();
- /* optional request header */
- urlConnection.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
- /* optional request header */
- urlConnection.setRequestProperty("Accept", "application/json");
- dto.setCreator(java.net.URLEncoder.encode(dto.getCreator(), "utf-8"));
- // read response
- /* for Get request */
- urlConnection.setRequestMethod("POST");
- urlConnection.setDoOutput(true);
- DataOutputStream wr = new DataOutputStream(urlConnection.getOutputStream());
- Gson gson = new Gson();
- String jsonString = gson.toJson(dto);
- wr.writeBytes(jsonString);
- wr.flush();
- wr.close();
- // try to get response
- int statusCode = urlConnection.getResponseCode();
- if (statusCode == 200) {
- inputStream = new BufferedInputStream(urlConnection.getInputStream());
- String response = HttpUtil.convertInputStreamToString(inputStream);
- Map<String, String> resultMap = gson.fromJson(response, Map.class);
- if (resultMap != null && resultMap.size() > 0) {
- Log.i("applyDesigner", "please check the map with key");
- }
- return resultMap;
- }
- }
- catch(Exception e)
- {
- e.printStackTrace();
- }
- finally
- {
- if (inputStream != null) {
- try {
- inputStream.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- if (urlConnection != null) {
- urlConnection.disconnect();
- }
- }
- return null;
- }
三:下载图片显示下载进度
- package com.example.demo;
- import java.io.ByteArrayInputStream;
- import java.io.ByteArrayOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.net.HttpURLConnection;
- import java.net.URL;
- import android.graphics.Bitmap;
- import android.graphics.BitmapFactory;
- import android.os.AsyncTask;
- import android.os.Handler;
- import android.os.Message;
- import android.util.Log;
- public class ImageLoadTask extends AsyncTask<String, Void, Bitmap> {
- private Handler handler;
- public ImageLoadTask(Handler handler) {
- this.handler = handler;
- }
- protected void onPostExecute(Bitmap result) {
- Message msg = new Message();
- msg.obj = result;
- handler.sendMessage(msg);
- }
- protected Bitmap doInBackground(String... getUrls) {
- InputStream inputStream = null;
- HttpURLConnection urlConnection = null;
- try {
- // open connection
- URL url = new URL(getUrls[0]);
- urlConnection = (HttpURLConnection) url.openConnection();
- /* for Get request */
- urlConnection.setRequestMethod("GET");
- int fileLength = urlConnection.getContentLength();
- int statusCode = urlConnection.getResponseCode();
- if (statusCode == 200) {
- inputStream = urlConnection.getInputStream();
- byte data[] = new byte[4096];
- long total = 0;
- int count;
- ByteArrayOutputStream output = new ByteArrayOutputStream();
- while ((count = inputStream.read(data)) != -1) {
- total += count;
- // publishing the progress....
- if (fileLength > 0 && handler != null) {
- handler.sendEmptyMessage(((int) (total * 100 / fileLength)) - 1);
- }
- output.write(data, 0, count);
- }
- ByteArrayInputStream bufferInput = new ByteArrayInputStream(output.toByteArray());
- Bitmap bitmap = BitmapFactory.decodeStream(bufferInput);
- inputStream.close();
- bufferInput.close();
- output.close();
- Log.i("image", "already get the image by uuid : " + getUrls[0]);
- handler.sendEmptyMessage(100);
- return bitmap;
- }
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- if (inputStream != null) {
- try {
- inputStream.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- if (urlConnection != null) {
- urlConnection.disconnect();
- }
- }
- return null;
- }
- }
总结:使用HttpURLConnection提交JSON数据的时候编码方式为UTF-8
全部中文字符请一定要预先转码为UTF-8,然后在后台server相应的API
中解码为UTF-8,不然就会报错HTTP 400。
Android中使用HttpURLConnection实现GET POST JSON数据与下载图片的更多相关文章
- HttpURLConnection从网上获取Json数据并解析详解
HttpURLConnection从网上获取Json数据并解析 1.HttpURLConnection请求数据的步骤 (1)构造一个URL接口地址: URL url = new URL("h ...
- Android 学习笔记之Volley(七)实现Json数据加载和解析...
学习内容: 1.使用Volley实现异步加载Json数据... Volley的第二大请求就是通过发送请求异步实现Json数据信息的加载,加载Json数据有两种方式,一种是通过获取Json对象,然后 ...
- android中使用Intent在activity之间传递数据
android中intent传递数据的简单使用: 1.使用intent传递数据: 首先将需要传递的数据放入到intent中 Intent intent = new Intent(MainActivit ...
- Android通过类对象的方式实现JSON数据的解析
1.通过主Activity的Button按钮实现数据的解析 public class MainActivity extends Activity { //定义一个包含Json格式的字符对象 priva ...
- 关于iOS中几种第三方对XML/JSON数据解析的使用
Json XML 大数据时代,我们需要从网络中获取海量的新鲜的各种信息,就不免要跟着两个家伙打交道,这是两种结构化的数据交换格式.一般来讲,我们会从网络获取XML或者Json格式的数据,这些数据有着特 ...
- js中对cookie的操作及json数据与cookie结合的用法
cookie的使用 添加cookie 添加cookie:document.cookie = “key=value”; // 一次写入一个键值对 document.cookie = 'test1=hel ...
- Android中Textview显示Html,图文混排,支持图片点击放大
本文首发于网易云社区 对于呈现Html文本来说,Android提供的Webview控件可以得到很好的效果,但使用Webview控件的弊端是效率相对比较低,对于呈现简单的html文本的话,杀鸡不必使用牛 ...
- Django中数据传输编码格式、ajax发送json数据、ajax发送文件、django序列化组件、ajax结合sweetalert做二次弹窗、批量增加数据
前后端传输数据的编码格式(contentType) 提交post请求的两种方式: form表单 ajax请求 前后端传输数据的编码格式 urlencoded formdata(form表单里的) ja ...
- android中使用intent来实现Activity带数据跳转
大家都知道startActivity()是用来切换跳转Activity的.如果想要在另个Activity中出书数据的话.只需要在源activity中使用intent.putExtra()方法传出数据. ...
随机推荐
- nodeJS(2)深了解: nodeJS 项目架构详解(app.js + Express + Http)
简略了解:nodeJS 深了解(1): Node.js + Express 构建网站预备知识 环境: 环境: win7 + nodeJS 版本(node): 新建 nodeJS 项目: 名称为: te ...
- linux之软硬链接【转】
链接---------是一种在共享文件和访问它的用户的若干目录项之间建立联系的一种方法. Linux中包括两种链接:硬链接(Hard Link)和软链接(Soft Link),软链接又称为符号链接(S ...
- 【CodeChef】PARADE(费用流,最短路)
题意: 思路: #include<cstdio> #include<iostream> #include<algorithm> #include<cstrin ...
- 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---56
以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:
- Swift Perfect 基础项目
brew install mysql@5.7 && brew link mysql@5.7 --force Package.swift import PackageDescriptio ...
- springBoot 环境
环境约束 jdk1.8:Spring Boot 推荐jdk1.7及以上:maven3.x:maven 3.3以上版本:Apache Maven 3.3.9.IntelliJIDEA2017:Intel ...
- AC日记——[NOI2006]最大获利 bzoj 1497
1497 思路: 最小割: 来,上代码: #include <cstdio> #include <cstring> #include <iostream> #inc ...
- openshift scc解析
SCC使用UserID,FsGroupID以及supplemental group ID和SELinux label等策略,通过校验Pod定义的ID是否在有效范围内来限制pod的权限.如果校验失败,则 ...
- 10.1综合强化刷题 Day2 morning
一道图论神题(god) Time Limit:1000ms Memory Limit:128MB 题目描述 LYK有一张无向图G={V,E},这张无向图有n个点m条边组成.并且这是一张带权图,只有 ...
- http重定向https
server { listen 80; server_name localhost; return 301 https://$host$request_uri; } server { listen 4 ...