java apache httpclient快速使用

http報(bào)文的2個(gè)主要項(xiàng):頭部(headers)、實(shí)體(entity/body)。
apache httpclient 提供大量builder等鏈?zhǔn)秸{(diào)用(和靜態(tài))方法,因此如果發(fā)現(xiàn)不能new一個(gè)對(duì)象,請(qǐng)查閱相關(guān)工具類(lèi)中是否有靜態(tài)方法可用。
httpclient文檔
httpclient各種MIME實(shí)體的文檔
httpclient core文檔
官方文檔比較零散,比如在httpclient文檔中經(jīng)常出現(xiàn)繼承自某個(gè)類(lèi),而這個(gè)類(lèi)沒(méi)有超鏈接點(diǎn)擊,要自己去httpclient core文檔中找。建議maven導(dǎo)入時(shí)把文檔也給下載下來(lái),IDE中直接看也很方便


基本步驟

CloseableHttpClient httpclient = HttpClients.createDefault();
HttpGet httpget = new HttpGet("http://www.itdecent.cn");
CloseableHttpResponse response = httpclient.execute(httpget);
//......
response.close();

1.CloseableHttpClient,反正就是用這個(gè),和HttpClient接口的差異自行查詢文檔
2.HttpClients,提供了幾個(gè)很方便的創(chuàng)建CloseableHttpClient的方法。也可用HttpClientBuilder.create().build(),看你喜歡記哪個(gè)
3.HttpGet,代表get方式請(qǐng)求。注意看它繼承的方法,如:setUrl讓你更改url而無(wú)需再new和設(shè)置;setConfig讓你設(shè)置超時(shí)等設(shè)置,詳細(xì)文檔跳轉(zhuǎn)自行查詢
4.CloseableHttpResponse代表響應(yīng)報(bào)文,查文檔調(diào)方法即可
5.復(fù)用問(wèn)題。即上面httpclient.execute是線程安全的,可以調(diào)用多次且請(qǐng)求之間不會(huì)互相影響。要注意的是其返回的CloseableHttpResponse對(duì)象要及時(shí)調(diào)用close方法關(guān)閉,否則可能導(dǎo)致其內(nèi)部線程池耗盡,無(wú)法再發(fā)出請(qǐng)求而超時(shí)。
6.HttpPost 代表post請(qǐng)求


參數(shù)設(shè)置

看HttpGet和HttpPost,他們繼承的setXXX方法,看單詞就能知道要搞什么了。get方式太簡(jiǎn)單,大不了自己拼裝字符串到url再u(mài)rlencoded什么的,不做解析,下面是post如何設(shè)置請(qǐng)求實(shí)體:

1.直接new單個(gè)實(shí)體

httpPost.setEntity(new StringEntity(data));

各種常見(jiàn)可直接new的Entity有:ByteArrayEntity, FileEntity, InputStreamEntity, SerializableEntity, StringEntity。詳細(xì)見(jiàn)文章開(kāi)頭給出的core文檔

2.生成復(fù)合型實(shí)體:

方法1:new一個(gè)MultipartEntity和各個(gè)MIME的body,然后MultipartEntity.addPart
其常見(jiàn)的各種body有:ByteArrayBody, FileBody, InputStreamBody, StringBody,和上面的基本對(duì)應(yīng),詳細(xì)見(jiàn)文章開(kāi)頭的MIME實(shí)體文檔

MultipartEntity entity = new MultipartEntity();

StringBody sb=new StringBody("data");
entity.addPart("參數(shù)名1",sb);

FileBody fileBody = new FileBody(file);
entity.addPart("參數(shù)名2", fileBody);

httpPost.setEntity(entity);

方法2:借助MultipartEntityBuilder,鏈?zhǔn)秸{(diào)用

HttpEntity entity = MultipartEntityBuilder.create().addXXXBody(...).addXXXBody(...).setXXX(...).build();
httpPost.setEntity(entity);

3.用List<NameValuePair>之類(lèi)的,請(qǐng)右轉(zhuǎn)百度


注意

請(qǐng)確保了解application/x-www-form-urlencoded、multipart/form-data、application/json,了解你自己在做什么,不要出現(xiàn)一些神奇的組合。

1.比如網(wǎng)站接收application/json的MIME格式,那么在httpclient中請(qǐng)手動(dòng)設(shè)置content-type這個(gè)header,實(shí)體部分直接用StringEntity,不需要url編碼
2.application/x-www-form-urlencoded(需要編碼)、multipart/form-data(不需要編碼)??梢院?jiǎn)單理解為有二進(jìn)制流(文件上傳)時(shí)必須使用multipart/form-data
可右轉(zhuǎn)unicode和url編碼及相關(guān)細(xì)節(jié)

最后編輯于
?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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