Android中使用HttpURLConnection实现GET POST JSON数据与下载图片

Android6.0中把Apache HTTP Client所有的包与类都标记为deprecated不再建议使用

所有跟HTTP相关的数据请求与提交操作都通过HttpURLConnection类实现,现实是

很多Android开发者一直都Apache HTTP Client来做andoird客户端与后台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 responseint 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 connectionURL 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,然后在后台服务器对应的API

中解码为UTF-8,不然就会报错HTTP 400。

Android中使用HttpURLConnection实现GET POST JSON数据与下载图片相关推荐

  1. modify sql_在SQL Server中使用JSON_MODIFY()修改JSON数据

    modify sql This article explores JSON_MODIFY() function to modify JSON Data in the SQL Server. 本文探讨了 ...

  2. ASP.NET中使用JObject和JArray解析Json数据 (实用、赞)

    原文出处:ASP.NET中使用JObject和JArray解析Json数据 - 谢友海 - 博客园 本章将和大家分享如何在ASP.NET中使用JObject和JArray解析Json数据.话不多说,下 ...

  3. ASP.NET中使用JObject和JArray解析Json数据

    本章将和大家分享如何在ASP.NET中使用JObject和JArray解析Json数据.话不多说,下面我们直接来看一个示例. 数据样例(模拟接口返回的Json字符串),如下所示: {"cod ...

  4. php模拟post提交json数据,如何在PHP中利用curl模拟post提交json数据

    如何在PHP中利用curl模拟post提交json数据 发布时间:2021-02-05 16:30:19 来源:亿速云 阅读:63 作者:Leah 本篇文章为大家展示了如何在PHP中利用curl模拟p ...

  5. Android使用HttpURLConnection返回并解析JSON数据,以聚合数据API之星座配对为例

    目录 一.实现效果 二.注册聚合网并申请key 三.Android Studio具体实现 3.1 导入json解析所需依赖包 3.2 构造显示界面layout 3.3 核心代码 3.3.1 使用Htt ...

  6. Android中关于Volley的使用(一)加载图片

    在Android中,如果我们要展示的图片是存储在网络上的时候,我们就必须通过HttpClient或者HttpUrlConnection这两个类来进行关于网络方面的操作,比如下面中利用GridView来 ...

  7. java json相加_JAVA,当某个json数据中一个字段与另一个json数据中的字段值相同时,对两个json进行合并且相加,...

    展开全部 要判断json数据的字段62616964757a686964616fe78988e69d8331333365636634与其他数据是否相同,那么肯定是要先解析json数据.解析json数据的 ...

  8. android中调用fft函数,J使用PCM数据在Android中转换FFT(JTransforms FFT in Android from PCM data)...

    J使用PCM数据在Android中转换FFT(JTransforms FFT in Android from PCM data) 我一直在玩这个游戏已经有一段时间了,我无法弄清楚我在这里要做的事情. ...

  9. datagrid php json,thinkphp和easyui结合中,datagrid等容器获取json数据的方法

    一直使用两者进行前后台开发,非常方便,但在datagrid中获取json数据并显示的时候碰到了问题,网上资料非常的少,基本都是jsp和php的,thinkphp框架的就没有了,可能非常简单,但本人刚学 ...

最新文章

  1. 9000亿投资浪费在数字化转型,罪魁祸首在DevOps?
  2. Tools and Strategies for Long-Read Sequencing and De Novo Assembly of Plant Genomes
  3. 系统优化怎么做-数据库优化
  4. 电子书网站推荐(收藏系列)
  5. 【Linux系统编程】Linux文件操作
  6. 东莞理工c语言作业,东莞理工学院C语言网上作业..doc
  7. 一个男人关心的东西决定他的层次(转)
  8. asp.net core利用DI实现自定义用户系统,脱离ControllerBase.User
  9. LeetCode 1897. 重新分配字符使所有字符串都相等
  10. 【R图秀】情人节快乐!
  11. 2019蓝桥杯参赛感受
  12. 电动车结构及其工作原理
  13. 2012移动开发者经济学
  14. 在移动硬盘上安装ubuntu18.04过程记录
  15. Kinect使用系列
  16. java兔子繁殖总数_Java 兔子繁殖迭代问题
  17. 看京东和淘宝的地址薄设计----填写订单的场景下
  18. 《机器学习实战》学习笔记第十一章 —— Apriori算法
  19. 常见的编码格式/txt文件乱码
  20. Linux-系统的初始化和服务

热门文章

  1. identifier is too long 异常处理
  2. 解决 Electron 5.0 版本出现 require is not defined 的问题
  3. 打开 VMware Workstation 14 Pro 中的虚拟机出现 “此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态” 解决方法
  4. XmlPullParser文件解析android
  5. svn安装使用subversion
  6. Linux下redis的安装及部署
  7. java中osend,如何从java o javafx向windows任务栏发送信息
  8. C语言求一个文件的长度,求二进制文件的长度
  9. wps单文件版_局域网共享精灵,轻松实现文件共享amp;打印机共享
  10. L1-012 计算指数