關於HttpClient的學習心得,請求參數中文亂碼問題


最近調用了一個第三方接口,接口文檔限定是 HTTPS post 請求 參數是 json格式。然后隨便在網上找了一份HttpClient的工具代碼,然后直接調用post的請求,參數也覺得沒有問題,返回值也正常,但是后來發現參數中的中文全部變成了問號傳遞過去了,后來發現是參數傳遞時編碼沒有指定,現記錄下來以供以后學習查看,有遇到和我一樣問題的初學者可以減少差詢問題的時間。

代碼如下:

  HttpClient httpClient = null;
HttpPost httpPost = null;
String result = null;
HttpResponse response = null;
try {
     
     httpClient=new DefaultHttpClient();//1創建httpclient對象
     httpPost = new HttpPost(url);//2因為是post請求所以創建httppost對象
        httpPost.addHeader("Content-Type", "application/json");//3設置請求頭參數和參數類型
StringEntity se = new StringEntity(jsonstr,"UTF-8");//4設置參數內容,並制定編碼格式(之前問題就在這里缺少了 “UTF-8”這個參數,就出現問號了)
se.setContentType("text/json");//設置格式類型
se.setContentEncoding(new BasicHeader("Content-Type", "application/json"));
httpPost.setEntity(se);//參數封裝到post中
response = httpClient.execute(httpPost);//執行請求方法,返回response響應參數
if (response.getEntity()!=null){//判斷響應是否為空
result = EntityUtils.toString(response.getEntity(), charset);//指定響應參數編碼然后返回
}
} catch (IOException e) {
e.printStackTrace();
}
return result;
}


后續和第三方的技術人員要了一個他們公司的demo,研究學習了一下,發現他們使用的是PoolingHttpClientConnectionManager用了連接池
查了資料才知道,頻繁的創建連接(三次握手)斷開連接(四次揮手)會消耗很對資源,所以使用連接池技術方便下次調用。

public static void init() {//demo中的初始化方法,其中設置了相關的請求參數和連接數

connMgr = new PoolingHttpClientConnectionManager();

connMgr.setMaxTotal(500);//設置整個連接池最大連接數 根據自己的場景決定
connMgr.setDefaultMaxPerRoute(connMgr.getMaxTotal());

RequestConfig.Builder configBuilder = RequestConfig.custom();

configBuilder.setConnectTimeout(1000);//設置最大連接數

configBuilder.setSocketTimeout(1000);//設置服務端連接超時

configBuilder.setConnectionRequestTimeout(2000);//設置請求連接超時

configBuilder.setStaleConnectionCheckEnabled(true);
requestConfig = configBuilder.build();

}

//加載初始化配置信息,獲取一個httpclient的連接對象

CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(createSSLConnSocketFactory()).setConnectionManager(connMgr).setDefaultRequestConfig(requestConfig)
.setRetryHandler(httpRequestRetryHandler).build();

 剩下的代碼都一樣了,get,post 參數自定。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM