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()方法传出数据. ...
随机推荐
- http2新特性
1.二进制分帧 http1.x是文本格式传输,http2二进制格式传输,并且被切分未过个帧发送,帧可以根据头部流标识重新组装. 2. 单一长连接 同一个域名使用一个TCP连接,(http1 ...
- idea工具开发注意事项
pom.xml中不需要有包 <dependency> <groupId>javax</groupId> <artifactId>javaee-api&l ...
- StringBuilder与StringBuffer
转:http://www.cnblogs.com/pepcod/archive/2013/02/16/2913557.html JAVA中用于处理字符串常用的有三个类: java.lang.Strin ...
- Vue.js笔记 — vue-router路由懒加载
用vue.js写单页面应用时,会出现打包后的JavaScript包非常大,影响页面加载,我们可以利用路由的懒加载去优化这个问题,当我们用到某个路由后,才去加载对应的组件,这样就会更加高效,实现代码如下 ...
- 美食节(bzoj 2879)
Description CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节.作为一个喜欢尝鲜的美食客,小M自然不愿意错过这场盛宴.他很快就尝遍了美食节所有的美食.然而,尝鲜的欲望是难以满足的.尽 ...
- java修炼
java程序员修炼之道——大牛告诉我们应该好好学习与修炼以下知识与技能 ———————————————————— 一:Java语言学习(对线程(thread),串行化,反射,网络编程,JNI技术, ...
- CSDN数据库下载地址 CSDN 用户名密码泄漏,600万数据下载
原文发布时间为:2011-12-21 -- 来源于本人的百度文章 [由搬家工具导入] 12月21日消息,下午有网友爆料称国内最大的开发者社区CSDN.NET的安全系统遭到黑客攻击,CSDN数据库中的6 ...
- [LeetCode] Climbing Stairs 斐波那契数列
You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb ...
- hdu 3001 Travelling 经过所有点(最多两次)的最短路径 三进制状压dp
题目链接 题意 给定一个\(N\)个点的无向图,求从任意一个点出发,经过所有点的最短路径长度(每个点至多可以经过两次). 思路 状态表示.转移及大体思路 与 poj 3311 Hie with the ...
- C# 的 String.CompareTo Equals和==的比较
String.CompareTo 语法 public int CompareTo( string strB) 返回值 小于 0,实例小于参数 strB: 0,实例等于参数 strB: 大于 0, ...