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数据与下载图片的更多相关文章

  1. HttpURLConnection从网上获取Json数据并解析详解

    HttpURLConnection从网上获取Json数据并解析 1.HttpURLConnection请求数据的步骤 (1)构造一个URL接口地址: URL url = new URL("h ...

  2. Android 学习笔记之Volley(七)实现Json数据加载和解析...

    学习内容: 1.使用Volley实现异步加载Json数据...   Volley的第二大请求就是通过发送请求异步实现Json数据信息的加载,加载Json数据有两种方式,一种是通过获取Json对象,然后 ...

  3. android中使用Intent在activity之间传递数据

    android中intent传递数据的简单使用: 1.使用intent传递数据: 首先将需要传递的数据放入到intent中 Intent intent = new Intent(MainActivit ...

  4. Android通过类对象的方式实现JSON数据的解析

    1.通过主Activity的Button按钮实现数据的解析 public class MainActivity extends Activity { //定义一个包含Json格式的字符对象 priva ...

  5. 关于iOS中几种第三方对XML/JSON数据解析的使用

    Json XML 大数据时代,我们需要从网络中获取海量的新鲜的各种信息,就不免要跟着两个家伙打交道,这是两种结构化的数据交换格式.一般来讲,我们会从网络获取XML或者Json格式的数据,这些数据有着特 ...

  6. js中对cookie的操作及json数据与cookie结合的用法

    cookie的使用 添加cookie 添加cookie:document.cookie = “key=value”; // 一次写入一个键值对 document.cookie = 'test1=hel ...

  7. Android中Textview显示Html,图文混排,支持图片点击放大

    本文首发于网易云社区 对于呈现Html文本来说,Android提供的Webview控件可以得到很好的效果,但使用Webview控件的弊端是效率相对比较低,对于呈现简单的html文本的话,杀鸡不必使用牛 ...

  8. Django中数据传输编码格式、ajax发送json数据、ajax发送文件、django序列化组件、ajax结合sweetalert做二次弹窗、批量增加数据

    前后端传输数据的编码格式(contentType) 提交post请求的两种方式: form表单 ajax请求 前后端传输数据的编码格式 urlencoded formdata(form表单里的) ja ...

  9. android中使用intent来实现Activity带数据跳转

    大家都知道startActivity()是用来切换跳转Activity的.如果想要在另个Activity中出书数据的话.只需要在源activity中使用intent.putExtra()方法传出数据. ...

随机推荐

  1. 排列计数(permutation)

    排列计数(permutation) 题目描述 求有多少种长度为n的序列A,满足以下条件: 1) 1~n这n个数在序列中各出现了一次 2) 若第i个数A[i]的值为i,则称i是稳定的.序列恰好有m个数是 ...

  2. 0-Broadcast机制原理简要介绍

    Broadcast机制简要介绍 来源: http://blog.csdn.net/luoshengyang/article/details/6730748 导语 广播机制在Android系统中,也不算 ...

  3. vue的v-for循环普通数组、对象数组、对象、数字

    如下 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8& ...

  4. JavaScript 的新特性:类的 #private 字段

    这是什么,如何使用,为什么需要? 一边听“Noise Pollution” —— Portugal. The Man,一边阅读本文简直就是享受 JavaScript 标准的第二阶段(Stage 2)加 ...

  5. cf 341D lahub and xors

    题目大意 给定初始值为\(0\)的\(n*n\)矩阵 两种操作 矩形内异或一个值 求矩阵内异或和 \(n\le 1000\) 分析 二维线段树标记不下传貌似直接可做 有没有更简便的方法? 考虑异或的特 ...

  6. (一) Spring基础概述

    1.历史 第一阶段:xml配置 在Spring1.x时代,使用Spring开发满眼都是xml配置的Bean,随着项目的扩大,我们需要把xml配置文件分布放到不同配置文件中,需要频繁的在开发的类和配置文 ...

  7. 介绍一个牛X的样式counter

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  8. eclipse在linux環境下安裝注意事项

    文件如果安装在非home文件夹下必须为eclipse授权 sudo chmod -R 777 /usr/tools/eclipse

  9. OpenGL ES 画直线代码实例

    http://blog.csdn.net/yexiaozi_007/article/details/7978620 以画xyz坐标轴为例,很多人会遇到用glcolor设置了颜色,但是直线画出来还是黑色 ...

  10. hdu 1385(Floyed+打印路径好题)

    Minimum Transport Cost Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/O ...