fiddler抓包查清apache的httpclient中文亂碼問(wèn)題

原文:https://mp.weixin.qq.com/s?__biz=Mzg2NTAyNTc5NQ==&tempkey=MTA1Ml9CR1ZrdkN5andGalM4TzRnVnpmeXV5Y1Npd1dQS3dvdldPRE16VW5CT3Z3bXBuNjJSbmFYTndHbERNZncwUmpaY2pabU5fc2hZM1duRjBOTHJTb05BNEUtSXo2dVhpME1Ibi1LekhjZzBEd3dGa2cxOXhOR0duVjFDemx4RHBiaXhZaDg5c3otZS04cG1jbFg2ZGdFeElsRFBGQkNXNFdxVU1RX2FRfn4%3D&chksm=4e612bd37916a2c5e15842e0e1c283c7d6d2d89fd23d901295063934235884939a2381e41e97#rd

今天要和第三方公司對(duì)接一個(gè)服務(wù)。通過(guò)rest服務(wù)傳文件和一些參數(shù)過(guò)去。難度不大,先用postman調(diào)用了一下,順利返回結(jié)果。于是開(kāi)寫,因?yàn)楸容^熟悉apache.httpcomponents的httpclient,寫的也比較順手。所以直接寫了代碼,測(cè)試總是失敗。因?yàn)榉?wù)提供者沒(méi)有人員支持,我只能得到一個(gè)失敗錯(cuò)誤,沒(méi)有任何有效信息。

一次次檢查自己的代碼,確實(shí)沒(méi)有什么問(wèn)題。眼看著交工的dead line要到了,沒(méi)辦法。趕緊把以前的一份用java原生的HttpUrlConnection發(fā)送POST請(qǐng)求的代碼拿來(lái)改了改,測(cè)試成功。

但是心里覺(jué)得太奇怪,沒(méi)道理httpclient不好使啊。

我倒要看看他們發(fā)出的包到底有什么不一樣。

使用Fiddler抓包

抓包工具我這邊使用的是fiddler。關(guān)于fiddler的基本操作這里就不講了。

使用postman的請(qǐng)求包:

image
image

對(duì)代碼進(jìn)行抓包。這里有點(diǎn)操作需要講講了。

首先看下你的抓包工具監(jiān)聽(tīng)的端口是啥,默認(rèn)是8888.

image

然后需要對(duì)代碼進(jìn)行一些改造。fiddler可以方便的抓取瀏覽器,操作系統(tǒng)的http請(qǐng)求,但是我們?cè)诖a里發(fā)出的http,fiddler是抓不到的。需要在代碼里設(shè)置代理。

java HttpUrlConnection的請(qǐng)求包:

設(shè)置代理的代碼:

Proxy proxy = new Proxy(java.net.Proxy.Type.HTTP,
     new InetSocketAddress("127.0.0.1", 8888));
URL realUrl = new URL(url);
HttpURLConnection urlConnection = (HttpURLConnection) realUrl.openConnection(proxy);
image
image

使用apache commons 的HttpClient

設(shè)置代理的代碼:

//設(shè)置代理IP、端口、協(xié)議(請(qǐng)分別替換)
HttpHost proxy = new HttpHost("127.0.0.1", 8888, "http");

//把代理設(shè)置到請(qǐng)求配置
RequestConfig defaultRequestConfig = RequestConfig.custom()
      .setProxy(proxy)
      .build();
CloseableHttpClient client = HttpClients.custom().setDefaultRequestConfig(defaultRequestConfig).build();
image
image

通過(guò)抓包,發(fā)現(xiàn)了問(wèn)題的根源原來(lái)是中文亂碼。又是編碼問(wèn)題。

問(wèn)題解決:

通過(guò)自定義一個(gè)contentType

ContentType contentType = ContentType.create("text/plain", Charset.forName("UTF-8"));

然后在addTextBody時(shí),指明使用自定義的這個(gè)contentType

builder.addTextBody(entry.getKey(), entry.getValue(), ContentType.TEXT_PLAIN);

測(cè)試,好了

image

text/plain和一個(gè)ContentType.TEXT_PLAIN很像啊,

改成ContentType.TEXT_PLAIN試試,發(fā)現(xiàn)也不行。我們來(lái)對(duì)比下:

ContentType.create("text/plain", Charset.forName("UTF-8"));
ContentType TEXT_PLAIN = create("text/plain", Consts.ISO_8859_1);
最后發(fā)現(xiàn)是編碼格式的問(wèn)題。

一句話,記?。和ㄟ^(guò)httpClient發(fā)送form表單中有中文的,要設(shè)置編碼格式為ContentType.create("text/plain", Charset.forName("UTF-8"));

源碼可參考:https://github.com/jedyang/demo

具體源碼可查閱號(hào):技術(shù)筆記與開(kāi)源分享

qrcode_for_gh_197e7b195c6b_258.jpg
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容