欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談StringEntity 和 UrlEncodedFormEntity之間的區(qū)別

 更新時間:2021年06月19日 16:49:55   作者:老周聊架構  
這篇文章主要介紹了StringEntity 和 UrlEncodedFormEntity之間的區(qū)別,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

StringEntity 和 UrlEncodedFormEntity的區(qū)別

一、UrlEncodedFormEntity

//設置請求方式與參數(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í)行請求
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&…”這種形式,服務端接收以后也要依據(jù)這種協(xié)議形式做處理。

二、StringEntity

有時候我們不想使用上述格式來傳值,而是想使用json格式來設置body,就可以使用這個類的實例。

JSONObject jsonObject = new JSONObject();
jsonObject.put("KEY1", "VALUE1");
jsonObject.put("KEY2", "VALUE2");
httpPost.setEntity(new StringEntity(jsonObject.toString()));

可以看出,UrlEncodedFormEntity()的形式比較單一,只能是普通的鍵值對,局限性相對較大。

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

HttpClient發(fā)送Post請求:StringEntity 和 UrlEncodedFormEntity

一. json簡介

JSON是一種取代XML的數(shù)據(jù)結構,和XML相比,它更小巧但描述能力卻不差,由于它的小巧所以網絡傳輸數(shù)據(jù)將減少更多流量從而加快速度。

JSON就是一串字符串 只不過元素會使用特定的符號標注。

a. {} 雙括號表示對象

b. [] 中括號表示數(shù)組

c. “” 雙引號內是屬性或值

d. : 冒號表示后者是前者的值(這個值可以是字符串、數(shù)字、也可以是另一個數(shù)組或對象)

所以 {“name”: “Michael”} 可以理解為是一個包含name為Michael的對象。而[{“name”: “Michael”},{“name”: “Jerry”}]就表示包含兩個對象的數(shù)組。當然了,可以使用{“name”:[“Michael”,“Jerry”]}來簡化,這是一個擁有一個name數(shù)組的對象。

JSON格式數(shù)據(jù)的優(yōu)點:

A.數(shù)據(jù)格式比較簡單,易于讀寫,格式都是壓縮的,占用帶寬小,是非常輕量級的數(shù)據(jù)格式;

B.易于解析,客戶端JavaScript可以簡單的通過eval()進行JSON數(shù)據(jù)的讀??;

C.支持多種語言,其中在Java端有豐富的工具操作和解析JSON;

D.因為JSON格式能直接為服務器端代碼使用,大大簡化了服務器端和客戶端的代碼開發(fā)量,且完成任務不變,并且易于維護;

二. JSONObject 、JSONArray

1,JSONObject

json對象,就是一個鍵對應一個值,使用的是大括號{ },如:{key:value}

2,JSONArray

json數(shù)組,使用中括號[ ],只不過數(shù)組里面的項也是json鍵值對格式的Json對象中添加的是鍵值對,JSONArray中添加的是Json對象

JSONObject Json = new JSONObject();
JSONArray JsonArray = new JSONArray();
Json.put(“key”, “value”);//JSONObject對象中添加鍵值對
JsonArray.add(Json);//將JSONObject對象添加到Json數(shù)組中

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數(shù)組格式的字符串可以通過方法直接轉換為JSONArray的格式:

JSONArray.fromObject(String)
JSONArray getJsonArray=JSONArray.fromObject(arrayStr);//將結果轉換成JSONArray對象的形式
JSONObject getJsonObj = getJsonArray.getJSONObject(0);//獲取json數(shù)組中的第一項
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字符串:分為以下三種情況,一個JavaBean,一個List數(shù)組,一個嵌套Map的List數(shù)組

//完成對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進行解析 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對于移動設備來說,尤其對于網絡環(huán)境較差和流量限制的情況下,相對于XML格式的數(shù)據(jù)傳輸會更節(jié)省流量,傳輸效率更高。在這三種解析方式中FastJson是效率最高的,推薦使用。

四. HttpClient發(fā)送Post請求:StringEntity 和 UrlEncodedFormEntity

1.StringEntity

StringEntity有兩個參數(shù),一個是具體的參數(shù)值(string串),另一個是ContentType,默認是text/plain,編碼格式是:ISO_5598_1。

使用httpclient時,盡量指定編碼方式來初始化StringEntity。

使用HttpClient來發(fā)送請求獲取數(shù)據(jù):拼接出來的body本質是一串Sring,所以可以用StringEntity,使用方法如下:

//構造測試數(shù)據(jù)
JSONObject param = new JSONObject();
param.put("key","value");
//CloseableHttpClient:建立一個可以關閉的httpClient
//這樣使得創(chuàng)建出來的HTTP實體,可以被Java虛擬機回收掉,不至于出現(xiàn)一直占用資源的情況。
CloseableHttpClient client = HttpClients.createDefault(); 
//創(chuàng)建post請求
HttpPost post = new HttpPost(testUrl);  
//生成裝載param的entity
StringEntity entity = new StringEntity(param.toString(), "utf-8");   
post.setEntity(entity);
//執(zhí)行請求
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會將參數(shù)以key1=value1&key2=value2的鍵值對形式發(fā)出。類似于傳統(tǒng)的application/x-www-form-urlencoded表單上傳。

//構造測試數(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請求
HttpPost post = new HttpPost(testUrl);
//生成裝載param的entity
HttpEntity entity = new UrlEncodedFormEntity(param, "utf-8");
post.setEntity(entity);
//執(zhí)行請求
CloseableHttpResponse response = client.execute(post);
//返回string格式的結果
String result  = EntityUtils.toString(response.getEntity(), "utf-8");
//關閉鏈接
post.releaseConnection();
client.close(); 

StringEntity可以用來靈活設定參數(shù)格式形式,而UrlEncodeFormEntity則適合于傳統(tǒng)表單格式的參數(shù)形式。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Java JVM虛擬機運行機制

    Java JVM虛擬機運行機制

    JVM(Java虛擬機)一種用于計算設備的規(guī)范,可用不同的方式(軟件或硬件)加以實現(xiàn)。接下來通過本文給大家簡單介紹Java JVM虛擬機運行機制,感興趣的朋友一起看看吧
    2017-03-03
  • ssm開發(fā)使用redis作為緩存的使用步驟

    ssm開發(fā)使用redis作為緩存的使用步驟

    在開發(fā)中經常遇到大量的重復的,高并發(fā)的查詢,此時可以使用redis緩存。這篇文章主要介紹了ssm開發(fā)使用redis作為緩存的使用步驟,感興趣的小伙伴們可以參考一下
    2018-11-11
  • Java超詳細講解ArrayList與順序表的用法

    Java超詳細講解ArrayList與順序表的用法

    ArrayList 類是一個可以動態(tài)修改的數(shù)組,與普通數(shù)組的區(qū)別就是它是沒有固定大小的限制,我們可以添加或刪除元素。ArrayList 繼承了 AbstractList ,并實現(xiàn)了 List 接口,順序表是將元素順序地存放在一塊連續(xù)的存儲區(qū)里,元素間的順序關系由它們的存儲順序自然表示
    2022-06-06
  • MyBatis-Plus多表聯(lián)查(動態(tài)查詢)的項目實踐

    MyBatis-Plus多表聯(lián)查(動態(tài)查詢)的項目實踐

    本文主要介紹了MyBatis-Plus多表聯(lián)查(動態(tài)查詢)的項目實踐,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-08-08
  • Java類如何實現(xiàn)一個類的障眼法(JadClipse的bug)

    Java類如何實現(xiàn)一個類的障眼法(JadClipse的bug)

    這篇文章主要介紹了Java類實現(xiàn)一個類的障眼法(JadClipse的bug),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • Java創(chuàng)建線程的七種方法總結(全網最全面)

    Java創(chuàng)建線程的七種方法總結(全網最全面)

    線程是Java中的基本執(zhí)行單元,它允許程序在同一時間執(zhí)行多個任務,下面這篇文章主要給大家總結介紹了關于Java創(chuàng)建線程的七種方法,文中通過實例代碼將這七種方法介紹的非常詳細,需要的朋友可以參考下
    2023-05-05
  • SpringBoot中MybatisX插件的簡單使用教程(圖文)

    SpringBoot中MybatisX插件的簡單使用教程(圖文)

    MybatisX 是一款基于 IDEA 的快速開發(fā)插件,方便在使用mybatis以及mybatis-plus開始時簡化繁瑣的重復操作,本文主要介紹了SpringBoot中MybatisX插件的簡單使用教程,感興趣的可以了解一下
    2023-06-06
  • Spring security 自定義過濾器實現(xiàn)Json參數(shù)傳遞并兼容表單參數(shù)(實例代碼)

    Spring security 自定義過濾器實現(xiàn)Json參數(shù)傳遞并兼容表單參數(shù)(實例代碼)

    這篇文章主要介紹了Spring security 自定義過濾器實現(xiàn)Json參數(shù)傳遞并兼容表單參數(shù),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • IDEA SpringBoot:Cannot resolve configuration property配置文件問題

    IDEA SpringBoot:Cannot resolve configuration&

    這篇文章主要介紹了IDEA SpringBoot:Cannot resolve configuration property配置文件問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • spring控制事務的三種方式小結

    spring控制事務的三種方式小結

    這篇文章主要介紹了spring控制事務的三種方式小結,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10

最新評論