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

简介: Android中使用HttpURLConnection实现GET POST JSON数据与下载图片Android6.0中把Apache HTTP Client所有的包与类都标记为deprecated不再建议使用所有跟HTTP相关的数据请求与提交操作都通过HttpURLConnection类实...

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 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,然后在后台服务器对应的API

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

目录
相关文章
|
1月前
|
JSON API 数据格式
postman如何发送json请求其中file字段是一个图片
postman如何发送json请求其中file字段是一个图片
140 4
|
1月前
|
存储 大数据 数据库
Android经典面试题之Intent传递数据大小为什么限制是1M?
在 Android 中,使用 Intent 传递数据时存在约 1MB 的大小限制,这是由于 Binder 机制的事务缓冲区限制、Intent 的设计初衷以及内存消耗和性能问题所致。推荐使用文件存储、SharedPreferences、数据库存储或 ContentProvider 等方式传递大数据。
76 0
|
3月前
|
JSON Java Android开发
Android 开发者必备秘籍:轻松攻克 JSON 格式数据解析难题,让你的应用更出色!
【8月更文挑战第18天】在Android开发中,解析JSON数据至关重要。JSON以其简洁和易读成为首选的数据交换格式。开发者可通过多种途径解析JSON,如使用内置的`JSONObject`和`JSONArray`类直接操作数据,或借助Google提供的Gson库将JSON自动映射为Java对象。无论哪种方法,正确解析JSON都是实现高效应用的关键,能帮助开发者处理网络请求返回的数据,并将其展示给用户,从而提升应用的功能性和用户体验。
96 1
|
3月前
|
存储 缓存 Java
Android项目架构设计问题之优化业务接口数据的加载效率如何解决
Android项目架构设计问题之优化业务接口数据的加载效率如何解决
47 0
|
5月前
|
JSON JavaScript 测试技术
掌握JMeter:深入解析如何提取和利用JSON数据
Apache JMeter教程展示了如何提取和使用JSON数据。创建测试计划,包括HTTP请求和JSON Extractor,设置变量前缀和JSON路径表达式来提取数据。通过Debug Sampler和View Results Tree监听器验证提取结果,然后在后续请求和断言中使用这些数据。此方法适用于复杂测试场景,提升性能和自动化测试效率。
|
3月前
|
存储 JSON API
淘系API接口(解析返回的json数据)商品详情数据解析助力开发者
——在成长的路上,我们都是同行者。这篇关于商品详情API接口的文章,希望能帮助到您。期待与您继续分享更多API接口的知识,请记得关注Anzexi58哦! 淘宝API接口(如淘宝开放平台提供的API)允许开发者获取淘宝商品的各种信息,包括商品详情。然而,需要注意的是,直接访问淘宝的商品数据API通常需要商家身份或开发者权限,并且需要遵循淘宝的API使用协议。
淘系API接口(解析返回的json数据)商品详情数据解析助力开发者
|
1月前
|
JSON JavaScript API
商品详情数据接口解析返回的JSON数据(API接口整套流程)
商品详情数据接口解析返回的JSON数据是API接口使用中的一个重要环节,它涉及从发送请求到接收并处理响应的整个流程。以下是一个完整的API接口使用流程,包括如何解析返回的JSON数据:
|
3月前
|
JSON 前端开发 API
【淘系】商品详情属性解析(属性规格详情图sku等json数据示例返回参考),淘系API接口系列
在淘宝(或天猫)平台上,商品详情属性(如属性规格、详情图、SKU等)是商家在发布商品时设置的,用于描述商品的详细信息和不同规格选项。这些信息对于消费者了解商品特性、进行购买决策至关重要。然而,直接通过前端页面获取这些信息的结构化数据(如JSON格式)并非直接暴露给普通用户或开发者,因为这涉及到平台的商业机密和数据安全。 不过,淘宝平台提供了丰富的API接口(如淘宝开放平台API),允许有资质的开发者或合作伙伴通过编程方式获取商品信息。这些API接口通常需要注册开发者账号、申请应用密钥(App Key)和秘钥(App Secret),并遵守淘宝的API使用协议。
|
2月前
|
存储 JSON API
Python编程:解析HTTP请求返回的JSON数据
使用Python处理HTTP请求和解析JSON数据既直接又高效。`requests`库的简洁性和强大功能使得发送请求、接收和解析响应变得异常简单。以上步骤和示例提供了一个基础的框架,可以根据你的具体需求进行调整和扩展。通过合适的异常处理,你的代码将更加健壮和可靠,为用户提供更加流畅的体验。
173 0
|
4月前
|
存储 JSON JavaScript
使用JSONObject解析与生成JSON数据
使用JSONObject解析与生成JSON数据
下一篇
无影云桌面