浅谈StringEntity 和 UrlEncodedFormEntity之间的区别

网友投稿 1284 2023-01-08

浅谈StringEntity 和 UrlEncodedFormEntity之间的区别

浅谈StringEntity 和 UrlEncodedFormEntity之间的区别

StringEntity 和 UrlEncodedFormEntity的区别

一、UrlEncodedFormEntity

//设置请求方式与参数

URI uri = new URI(uriStr);

HttpPost httpPost = new HttpPost(uri);

httpPost.getParams().setParameter("http.socket.timeout", new Integer(500000));

httpPost.setHeader("Content-type", "text/plain; charset=UTF-8");

httpPost.setHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows 2000)");

httpPost.setHeader("IConnection", "close");

List nvps = new ArrayList();

nvps.add(new BasicNameValuePair("KEY1", "VALUE1"));

//...

httpPost.setEntity(new UrlEncodedFormEntity(nvps));

//执行请求

HttpClient httpclient = new DefaultHttpClient();

httpclient.getParams().setParameter("Content-Encoding", "UTF-8");

HttpResponse response = httpclient.execute(httpPost);

//获取返回

HttpEntity entity = response.getEntity();

BufferedReader in = new BufferedReader(new InputStreamReader(entity.getContent(), "UTF-8"));

StringBuffer buffer = new StringBuffer();

String line = null;

while ((line = in.readLine()) != null) {

buffer.append(line);

}

return buffer.toString();

使用 UrlEncodedFormEntity 来设置 body,消息体内容类似于“KEY1=VALUE1&KEY2=VALUE2&…”这种形式,服务端接收以后也要依据这种协议形式做处理。

二、StringEntity

有时候我们不想使用上述格式来传值,而是想使用json格式来设置body,就可以使用这个类的实例

JSONObject jsonObject = new JSONObject();

jsonObject.put("KEY1", "VALUE1");

jsonObject.put("KEY2", "VALUE2");

httpPost.setEntity(new StringEntity(jsonObject.toString()));

可以看出,UrlEncodedFormEntity()的形式比较单一,只能是普通的键值对,局限性相对较大。

而StringEntity()的形式比较自由,只要是字符串放进去,不论格式都可以。

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 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.getJSONGOASmxbdvnObject(“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 getPershttp://onList(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请求GOASmxbdvn

HttpPost post = new HttpPost(testUrl);

//生成装载param的entity

StringEntity 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 param = new ArrayList();

param.add(new BasicNameValuePair("key1","value1"));

param.add(new BasicNameValuePair("key2","value2"));

//定义HttpClient

CloseableHttpClient client = HttpClients.createDefault();

//创建post请求

HttpPost post = new HttpPost(testUrl);

//生成装载param的entity

HttpEntity 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则适合于传统表单格式的参数形式。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:web 移动应用开发框架(移动端的框架)
下一篇:金融小程序页面设计图案(金融小程序页面设计图案大全)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~