淺談StringEntity 和 UrlEncodedFormEntity之間的區(qū)別
StringEntity 和 UrlEncodedFormEntity的區(qū)別
一、UrlEncodedFormEntity
//設(shè)置請(qǐng)求方式與參數(shù) 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)); //執(zhí)行請(qǐng)求 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 來(lái)設(shè)置 body,消息體內(nèi)容類似于“KEY1=VALUE1&KEY2=VALUE2&…”這種形式,服務(wù)端接收以后也要依據(jù)這種協(xié)議形式做處理。
二、StringEntity
有時(shí)候我們不想使用上述格式來(lái)傳值,而是想使用json格式來(lái)設(shè)置body,就可以使用這個(gè)類的實(shí)例。
JSONObject jsonObject = new JSONObject(); jsonObject.put("KEY1", "VALUE1"); jsonObject.put("KEY2", "VALUE2"); httpPost.setEntity(new StringEntity(jsonObject.toString()));
可以看出,UrlEncodedFormEntity()的形式比較單一,只能是普通的鍵值對(duì),局限性相對(duì)較大。
而StringEntity()的形式比較自由,只要是字符串放進(jìn)去,不論格式都可以。
HttpClient發(fā)送Post請(qǐng)求:StringEntity 和 UrlEncodedFormEntity
一. json簡(jiǎn)介
JSON是一種取代XML的數(shù)據(jù)結(jié)構(gòu),和XML相比,它更小巧但描述能力卻不差,由于它的小巧所以網(wǎng)絡(luò)傳輸數(shù)據(jù)將減少更多流量從而加快速度。
JSON就是一串字符串 只不過(guò)元素會(huì)使用特定的符號(hào)標(biāo)注。
a. {} 雙括號(hào)表示對(duì)象
b. [] 中括號(hào)表示數(shù)組
c. “” 雙引號(hào)內(nèi)是屬性或值
d. : 冒號(hào)表示后者是前者的值(這個(gè)值可以是字符串、數(shù)字、也可以是另一個(gè)數(shù)組或?qū)ο?
所以 {“name”: “Michael”} 可以理解為是一個(gè)包含name為Michael的對(duì)象。而[{“name”: “Michael”},{“name”: “Jerry”}]就表示包含兩個(gè)對(duì)象的數(shù)組。當(dāng)然了,可以使用{“name”:[“Michael”,“Jerry”]}來(lái)簡(jiǎn)化,這是一個(gè)擁有一個(gè)name數(shù)組的對(duì)象。
JSON格式數(shù)據(jù)的優(yōu)點(diǎn):
A.數(shù)據(jù)格式比較簡(jiǎn)單,易于讀寫(xiě),格式都是壓縮的,占用帶寬小,是非常輕量級(jí)的數(shù)據(jù)格式;
B.易于解析,客戶端JavaScript可以簡(jiǎn)單的通過(guò)eval()進(jìn)行JSON數(shù)據(jù)的讀??;
C.支持多種語(yǔ)言,其中在Java端有豐富的工具操作和解析JSON;
D.因?yàn)镴SON格式能直接為服務(wù)器端代碼使用,大大簡(jiǎn)化了服務(wù)器端和客戶端的代碼開(kāi)發(fā)量,且完成任務(wù)不變,并且易于維護(hù);
二. JSONObject 、JSONArray
1,JSONObject
json對(duì)象,就是一個(gè)鍵對(duì)應(yīng)一個(gè)值,使用的是大括號(hào){ },如:{key:value}
2,JSONArray
json數(shù)組,使用中括號(hào)[ ],只不過(guò)數(shù)組里面的項(xiàng)也是json鍵值對(duì)格式的Json對(duì)象中添加的是鍵值對(duì),JSONArray中添加的是Json對(duì)象
JSONObject Json = new JSONObject(); JSONArray JsonArray = new JSONArray(); Json.put(“key”, “value”);//JSONObject對(duì)象中添加鍵值對(duì) JsonArray.add(Json);//將JSONObject對(duì)象添加到Json數(shù)組中
3,JSONObject與Map
Map map和json都是鍵值對(duì),不同的是map中鍵值對(duì)中間用等號(hào)分開(kāi),json中鍵值對(duì)中間用冒號(hào)分開(kāi)。json就是一種特殊形式的map。
Map<String,String> strmap=new JSONObject();
這里的需求是:request對(duì)象獲取的map,想要返回json格式也不用白費(fèi)力了。
[{name1:{name2:{name3:‘value1',name4:‘value2'}}},{}]
取出name4值過(guò)程步驟:
1,將以上字符串轉(zhuǎn)換為JSONArray對(duì)象;
2,取出對(duì)象的第一項(xiàng),JSONObject對(duì)象;
3,取出name1的值JSONObject對(duì)象;
4,取出name2的值JSONObject對(duì)象;
5,取出name4的值value2。
示例中json數(shù)組格式的字符串可以通過(guò)方法直接轉(zhuǎn)換為JSONArray的格式:
JSONArray.fromObject(String) JSONArray getJsonArray=JSONArray.fromObject(arrayStr);//將結(jié)果轉(zhuǎn)換成JSONArray對(duì)象的形式 JSONObject getJsonObj = getJsonArray.getJSONObject(0);//獲取json數(shù)組中的第一項(xiàng) String result=getJsonObj.getJSONObject(“name1”).getJSONObject(“name2”).getJSONObject(“name4”);
三. json解析
1.傳統(tǒng)的JSON解析
1、生成json字符串
public static String createJsonString(String key, Object value) { JSONObject jsonObject = new JSONObject(); jsonObject.put(key, value); return jsonObject.toString(); }
2、解析JSON字符串:分為以下三種情況,一個(gè)JavaBean,一個(gè)List數(shù)組,一個(gè)嵌套Map的List數(shù)組
//完成對(duì)json數(shù)據(jù)的解析 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的數(shù)組 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進(jìn)行解析 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對(duì)于移動(dòng)設(shè)備來(lái)說(shuō),尤其對(duì)于網(wǎng)絡(luò)環(huán)境較差和流量限制的情況下,相對(duì)于XML格式的數(shù)據(jù)傳輸會(huì)更節(jié)省流量,傳輸效率更高。在這三種解析方式中FastJson是效率最高的,推薦使用。
四. HttpClient發(fā)送Post請(qǐng)求:StringEntity 和 UrlEncodedFormEntity
1.StringEntity
StringEntity有兩個(gè)參數(shù),一個(gè)是具體的參數(shù)值(string串),另一個(gè)是ContentType,默認(rèn)是text/plain,編碼格式是:ISO_5598_1。
使用httpclient時(shí),盡量指定編碼方式來(lái)初始化StringEntity。
使用HttpClient來(lái)發(fā)送請(qǐng)求獲取數(shù)據(jù):拼接出來(lái)的body本質(zhì)是一串Sring,所以可以用StringEntity,使用方法如下:
//構(gòu)造測(cè)試數(shù)據(jù) JSONObject param = new JSONObject(); param.put("key","value"); //CloseableHttpClient:建立一個(gè)可以關(guān)閉的httpClient //這樣使得創(chuàng)建出來(lái)的HTTP實(shí)體,可以被Java虛擬機(jī)回收掉,不至于出現(xiàn)一直占用資源的情況。 CloseableHttpClient client = HttpClients.createDefault(); //創(chuàng)建post請(qǐng)求 HttpPost post = new HttpPost(testUrl); //生成裝載param的entity StringEntity entity = new StringEntity(param.toString(), "utf-8"); post.setEntity(entity); //執(zhí)行請(qǐng)求 CloseableHttpResponse response = TestConfig.httpClient.execute(post); //返回string格式的結(jié)果 String result = EntityUtils.toString(response.getEntity(), "utf-8"); //關(guān)閉鏈接 post.releaseConnection(); client.close();
2.UrlEncodedFormEntity
ContentType就是application/x-www-form-urlencoded,urlEncodeFormEntity會(huì)將參數(shù)以key1=value1&key2=value2的鍵值對(duì)形式發(fā)出。類似于傳統(tǒng)的application/x-www-form-urlencoded表單上傳。
//構(gòu)造測(cè)試數(shù)據(jù) List<NameValuePair> param = new ArrayList<NameValuePair>(); param.add(new BasicNameValuePair("key1","value1")); param.add(new BasicNameValuePair("key2","value2")); //定義HttpClient CloseableHttpClient client = HttpClients.createDefault(); //創(chuàng)建post請(qǐng)求 HttpPost post = new HttpPost(testUrl); //生成裝載param的entity HttpEntity entity = new UrlEncodedFormEntity(param, "utf-8"); post.setEntity(entity); //執(zhí)行請(qǐng)求 CloseableHttpResponse response = client.execute(post); //返回string格式的結(jié)果 String result = EntityUtils.toString(response.getEntity(), "utf-8"); //關(guān)閉鏈接 post.releaseConnection(); client.close();
StringEntity可以用來(lái)靈活設(shè)定參數(shù)格式形式,而UrlEncodeFormEntity則適合于傳統(tǒng)表單格式的參數(shù)形式。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
ssm開(kāi)發(fā)使用redis作為緩存的使用步驟
在開(kāi)發(fā)中經(jīng)常遇到大量的重復(fù)的,高并發(fā)的查詢,此時(shí)可以使用redis緩存。這篇文章主要介紹了ssm開(kāi)發(fā)使用redis作為緩存的使用步驟,感興趣的小伙伴們可以參考一下2018-11-11MyBatis-Plus多表聯(lián)查(動(dòng)態(tài)查詢)的項(xiàng)目實(shí)踐
本文主要介紹了MyBatis-Plus多表聯(lián)查(動(dòng)態(tài)查詢)的項(xiàng)目實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08Java類如何實(shí)現(xiàn)一個(gè)類的障眼法(JadClipse的bug)
這篇文章主要介紹了Java類實(shí)現(xiàn)一個(gè)類的障眼法(JadClipse的bug),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12Java創(chuàng)建線程的七種方法總結(jié)(全網(wǎng)最全面)
線程是Java中的基本執(zhí)行單元,它允許程序在同一時(shí)間執(zhí)行多個(gè)任務(wù),下面這篇文章主要給大家總結(jié)介紹了關(guān)于Java創(chuàng)建線程的七種方法,文中通過(guò)實(shí)例代碼將這七種方法介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05SpringBoot中MybatisX插件的簡(jiǎn)單使用教程(圖文)
MybatisX 是一款基于 IDEA 的快速開(kāi)發(fā)插件,方便在使用mybatis以及mybatis-plus開(kāi)始時(shí)簡(jiǎn)化繁瑣的重復(fù)操作,本文主要介紹了SpringBoot中MybatisX插件的簡(jiǎn)單使用教程,感興趣的可以了解一下2023-06-06Spring security 自定義過(guò)濾器實(shí)現(xiàn)Json參數(shù)傳遞并兼容表單參數(shù)(實(shí)例代碼)
這篇文章主要介紹了Spring security 自定義過(guò)濾器實(shí)現(xiàn)Json參數(shù)傳遞并兼容表單參數(shù),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01IDEA SpringBoot:Cannot resolve configuration&
這篇文章主要介紹了IDEA SpringBoot:Cannot resolve configuration property配置文件問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07