浅谈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<NameValuePair> nvps = new ArrayList<NameValuePair>(); 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<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的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<NameValuePair> param = new ArrayList<NameValuePair>(); 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则适合于传统表单格式的参数形式。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。