AI智能
改变未来

HttpClient发送Post请求:StringEntity 和 UrlEncodedFormEntity


一. json简介

JSON是一种取代XML的数据结构,和XML相比,它更小巧但描述能力却不差,由于它的小巧所以网络传输数据将减少更多流量从而加快速度。
JSON就是一串字符串 只不过元素会使用特定的符号标注。
a. {} 双括号表示对象
b. [] 中括号表示数组
c. “” 双引号内是属性或值
d. : 冒号表示后者是前者的值(这个值可以是字符串、数字、也可以是另一个数组或对象)
所以 {“name”: “Michael”} 可以理解为是一个包含name为Michael的对象。而[{“name”: “Michael”},{“name”: “Jerry”}]就表示包含两个对象的数组。当然了,可以使用{“name”:[“Michael”,“Jerry”]}来简化,这是一个拥有一个name数组的对象。

JSON格式数据的优点:
  A.数据格式比较简单,易于读写,格式都是压缩的,占用带宽小,是非常轻量级的数据格式;
  B.易于解析,客户端JavaScript可以简单的通过eval()进行JSON数据的读取;
  C.支持多种语言,其中在Java端有丰富的工具操作和解析JSON;
  D.因为JSON格式能直接为服务器端代码使用,大大简化了服务器端和客户端的代码开发量,且完成任务不变,并且易于维护;

二. JSONObject 、JSONArray

1,JSONObject
json对象,就是一个键对应一个值,使用的是大括号{ },如:{key:value}

2,JSONArray
json数组,使用中括号[ ],只不过数组里面的项也是json键值对格式的
Json对象中添加的是键值对,JSONArray中添加的是Json对象

JSONObject Json = new JSONObject();
JSONArray JsonArray = new JSONArray();
Json.put(“key”, “value”);//JSONObject对象中添加键值对
JsonArray.add(Json);//将JSONObject对象添加到Json数组中

3,JSONObject与Map
Map map和json都是键值对,不同的是map中键值对中间用等号分开,json中键值对中间用冒号分开。json就是一种特殊形式的map。
Map<String,String> strmap=new JSONObject();
这里的需求是:request对象获取的map,想要返回json格式也不用白费力了。

[{name1:{name2:{name3:‘value1’,name4:‘value2’}}},{}]
取出name4值过程步骤:1,将以上字符串转换为JSONArray对象;2,取出对象的第一项,JSONObject对象;3,取出name1的值JSONObject对象;4,取出name2的值JSONObject对象;5,取出name4的值value2。
示例中json数组格式的字符串可以通过方法直接转换为JSONArray的格式:
  JSONArray.fromObject(String)
JSONArray getJsonArray=JSONArray.fromObject(arrayStr);//将结果转换成JSONArray对象的形式
JSONObject getJsonObj = getJsonArray.getJSONObject(0);//获取json数组中的第一项
String result=getJsonObj.getJSONObject(“name1”).getJSONObject(“name2”).getJSONObject(“name4”);

三. json解析

1.传统的JSON解析

1、生成json字符串

public static String createJsonString(String key, Object value) {JSONObject jsonObject = new JSONObject();jsonObject.put(key, value);return jsonObject.toString();}

2、解析JSON字符串:分为以下三种情况,一个JavaBean,一个List数组,一个嵌套Map的List数组

//完成对json数据的解析public class JsonTools {public static Person getPerson(String key, String jsonString) {Person person = new Person();try {JSONObject jsonObject = new JSONObject(jsonString);JSONObject personObject = jsonObject.getJSONObject(\"person\");person.setId(personObject.getInt(\"id\"));person.setName(personObject.getString(\"name\"));person.setAddress(personObject.getString(\"address\"));} catch (Exception e) {// TODO: handle exception}return person;}public static List getPersons(String key, String jsonString) {List list = new ArrayList();try {JSONObject jsonObject = new JSONObject(jsonString);// 返回json的数组JSONArray jsonArray = jsonObject.getJSONArray(key);for (int i = 0; i < jsonArray.length(); i++) {JSONObject jsonObject2 = jsonArray.getJSONObject(i);Person person = new Person();person.setId(jsonObject2.getInt(\"id\"));person.setName(jsonObject2.getString(\"name\"));person.setAddress(jsonObject2.getString(\"address\"));list.add(person);}} catch (Exception e) {// TODO: handle exception}return list;}public static List getList(String key, String jsonString) {List list = new ArrayList();try {JSONObject jsonObject = new JSONObject(jsonString);JSONArray jsonArray = jsonObject.getJSONArray(key);for (int i = 0; i < jsonArray.length(); i++) {String msg = jsonArray.getString(i);list.add(msg);}} catch (Exception e) {// TODO: handle exception}return list;}public static List> listKeyMaps(String key,String jsonString) {List> list = new ArrayList>();try {JSONObject jsonObject = new JSONObject(jsonString);JSONArray jsonArray = jsonObject.getJSONArray(key);for (int i = 0; i < jsonArray.length(); i++) {JSONObject jsonObject2 = jsonArray.getJSONObject(i);Map map = new HashMap();Iterator iterator = jsonObject2.keys();while (iterator.hasNext()) {String json_key = iterator.next();Object json_value = jsonObject2.get(json_key);if (json_value == null) {json_value = \"\";}map.put(json_key, json_value);}list.add(map);}} catch (Exception e) {// TODO: handle exception}return list;}}

2.JSON解析之GSON

1、生成JSON字符串

import com.google.gson.Gson;public class JsonUtils {public static String createJsonObject(Object obj) {Gson gson = new Gson();String str = gson.toJson(obj);return str;}}

2、解析JSON

public class GsonTools {public GsonTools() {// TODO Auto-generated constructor stub}/*** @param* @param jsonString* @param cls* @return*/public static  T getPerson(String jsonString, Class cls) {T t = null;try {Gson gson = new Gson();t = gson.fromJson(jsonString, cls);} catch (Exception e) {// TODO: handle exception}return t;}/*** 使用Gson进行解析 List* @param* @param jsonString* @param cls* @return*/public static  List getPersons(String jsonString, Class cls) {List list = new ArrayList();try {Gson gson = new Gson();list = gson.fromJson(jsonString, new TypeToken>() {}.getType());} catch (Exception e) {}return list;}/*** @param jsonString* @return*/public static List getList(String jsonString) {List list = new ArrayList();try {Gson gson = new Gson();list = gson.fromJson(jsonString, new TypeToken>() {}.getType());} catch (Exception e) {// TODO: handle exception}return list;}public static List> listKeyMaps(String jsonString) {List> list = new ArrayList>();try {Gson gson = new Gson();list = gson.fromJson(jsonString,new TypeToken>>() {}.getType());} catch (Exception e) {// TODO: handle exception}return list;}}

3.JSON解析之FastJSON

public class JsonTool {public static  T getPerson(String jsonstring, Class cls) {T t = null;try {t = JSON.parseObject(jsonstring, cls);} catch (Exception e) {// TODO: handle exception}return t;}public static  List getPersonList(String jsonstring, Class cls) {List list = new ArrayList();try {list = JSON.parseArray(jsonstring, cls);} catch (Exception e) {// TODO: handle exception}return list;}public static  List> getPersonListMap1( String jsonstring) {List> list = new ArrayList>();try {list = JSON.parseObject(jsonstring,new TypeReference>>() {}.getType());} catch (Exception e) {// TODO: handle exception}return list;}}

JSON对于移动设备来说,尤其对于网络环境较差和流量限制的情况下,相对于XML格式的数据传输会更节省流量,传输效率更高。在这三种解析方式中FastJson是效率最高的,推荐使用。

四. HttpClient发送Post请求:StringEntity 和 UrlEncodedFormEntity

1.StringEntity

StringEntity有两个参数,一个是具体的参数值(string串),另一个是ContentType,默认是text/plain,编码格式是:ISO_5598_1。
使用httpclient时,尽量指定编码方式来初始化StringEntity。
使用HttpClient来发送请求获取数据:拼接出来的body本质是一串Sring,所以可以用StringEntity,使用方法如下:

//构造测试数据JSONObject param = new JSONObject();param.put(\"key\",\"value\");//CloseableHttpClient:建立一个可以关闭的httpClient//这样使得创建出来的HTTP实体,可以被Java虚拟机回收掉,不至于出现一直占用资源的情况。CloseableHttpClient client = HttpClients.createDefault();//创建post请求HttpPost post = new HttpPost(testUrl);//生成装载param的entityStringEntity entity = new StringEntity(param.toString(), \"utf-8\");post.setEntity(entity);//执行请求CloseableHttpResponse response = TestConfig.httpClient.execute(post);//返回string格式的结果String result  = EntityUtils.toString(response.getEntity(), \"utf-8\");//关闭链接post.releaseConnection();client.close();

2.UrlEncodedFormEntity

ContentType就是application/x-www-form-urlencoded,urlEncodeFormEntity会将参数以key1=value1&key2=value2的键值对形式发出。类似于传统的application/x-www-form-urlencoded表单上传。

//构造测试数据List<NameValuePair> param = new ArrayList<NameValuePair>();param.add(new BasicNameValuePair(\"key1\",\"value1\"));param.add(new BasicNameValuePair(\"key2\",\"value2\"));//定义HttpClientCloseableHttpClient client = HttpClients.createDefault();//创建post请求HttpPost post = new HttpPost(testUrl);//生成装载param的entityHttpEntity entity = new UrlEncodedFormEntity(param, \"utf-8\");post.setEntity(entity);//执行请求CloseableHttpResponse response = client.execute(post);//返回string格式的结果String result  = EntityUtils.toString(response.getEntity(), \"utf-8\");//关闭链接post.releaseConnection();client.close();

StringEntity可以用来灵活设定参数格式形式,而UrlEncodeFormEntity则适合于传统表单格式的参数形式。

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » HttpClient发送Post请求:StringEntity 和 UrlEncodedFormEntity