今天要和第三方公司對(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)求包:
對(duì)代碼進(jìn)行抓包。這里有點(diǎn)操作需要講講了。
首先看下你的抓包工具監(jiān)聽(tīng)的端口是啥,默認(rèn)是8888.
然后需要對(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);
使用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();
通過(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è)試,好了
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)源分享
