Java httpClient介紹以及使用示例
Java 開(kāi)發(fā)語(yǔ)言中實(shí)現(xiàn)HTTP請(qǐng)求的方法主要有兩種:一種是JAVA的標(biāo)準(zhǔn)類HttpUrlConnection,比較原生的實(shí)現(xiàn)方法;另一種是第三方開(kāi)源框架HTTPClient。
HttpClient相比傳統(tǒng)JDK自帶的URLConnection,增加了易用性和靈活性,它不僅是客戶端發(fā)送Http請(qǐng)求變得容易,而且也方便了開(kāi)發(fā)人員測(cè)試接口(基于Http協(xié)議的),即提高了開(kāi)發(fā)的效率,也方便提高代碼的健壯性。
一、HttpClient簡(jiǎn)單介紹
HttpClient是Apache Jakarta Common下的子項(xiàng)目,用來(lái)提供高效的、最新的、功能豐富的支持HTTP協(xié)議的客戶端編程工具包,并且它支持HTTP協(xié)議最新的版本和建議。HttpClient已經(jīng)應(yīng)用在很多的項(xiàng)目中,比如Apache Jakarta上很著名的另外兩個(gè)開(kāi)源項(xiàng)目Cactus和HTMLUnit都使用了HttpClient。
HTTPClient對(duì)HTTP的封裝性比較不錯(cuò),通過(guò)它基本上能夠滿足我們大部分的需求。HttpClient3.1 是 org.apache.commons.httpclient下操作遠(yuǎn)程 url的工具包,雖然已不再更新,但實(shí)現(xiàn)工作中使用httpClient3.1的代碼還是很多。HttpClient4.5 是org.apache.http.client下操作遠(yuǎn)程 url的工具包。
二、HttpClient特性
- 基于標(biāo)準(zhǔn)、純凈的java語(yǔ)言。實(shí)現(xiàn)了Http1.0和Http1.1。
- 以可擴(kuò)展的面向?qū)ο蟮慕Y(jié)構(gòu)實(shí)現(xiàn)了Http全部的方法(GET, POST, PUT, DELETE, HEAD, OPTIONS, and TRACE)。
- 支持HTTPS協(xié)議。
- 通過(guò)Http代理建立透明的連接。
- 利用CONNECT方法通過(guò)Http代理建立隧道的https連接。
- Basic, Digest, NTLMv1, NTLMv2, NTLM2 Session, SNPNEGO/Kerberos認(rèn)證方案。
- 插件式的自定義認(rèn)證方案。
- 便攜可靠的套接字工廠使它更容易的使用第三方解決方案。
- 連接管理器支持多線程應(yīng)用。支持設(shè)置最大連接數(shù),同時(shí)支持設(shè)置每個(gè)主機(jī)的最大連接數(shù),發(fā)現(xiàn)并關(guān)閉過(guò)期的連接。
- 自動(dòng)處理Set-Cookie中的Cookie。
- 插件式的自定義Cookie策略。
- Request的輸出流可以避免流中內(nèi)容直接緩沖到socket服務(wù)器。
- Response的輸入流可以有效的從socket服務(wù)器直接讀取相應(yīng)內(nèi)容。
- 在http1.0和http1.1中利用KeepAlive保持持久連接。
- 直接獲取服務(wù)器發(fā)送的response code和 headers。
- 設(shè)置連接超時(shí)的能力。
- 實(shí)驗(yàn)性的支持http1.1 response caching。
- 源代碼基于Apache License 可免費(fèi)獲取。
三、使用方法
使用HttpClient發(fā)送請(qǐng)求、接收響應(yīng)很簡(jiǎn)單,一般需要如下幾步即可。
- 創(chuàng)建HttpClient對(duì)象。
- 創(chuàng)建請(qǐng)求方法的實(shí)例,并指定請(qǐng)求URL。如果需要發(fā)送GET請(qǐng)求,創(chuàng)建HttpGet對(duì)象;如果需要發(fā)送POST請(qǐng)求,創(chuàng)建HttpPost對(duì)象。
- 如果需要發(fā)送請(qǐng)求參數(shù),可調(diào)用HttpGet、HttpPost共同的setParams(HetpParams params)方法來(lái)添加請(qǐng)求參數(shù);對(duì)于HttpPost對(duì)象而言,也可調(diào)用setEntity(HttpEntity entity)方法來(lái)設(shè)置請(qǐng)求參數(shù)。
- 調(diào)用HttpClient對(duì)象的execute(HttpUriRequest request)發(fā)送請(qǐng)求,該方法返回一個(gè)HttpResponse。
- 調(diào)用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可獲取服務(wù)器的響應(yīng)頭;調(diào)用HttpResponse的getEntity()方法可獲取HttpEntity對(duì)象,該對(duì)象包裝了服務(wù)器的響應(yīng)內(nèi)容。程序可通過(guò)該對(duì)象獲取服務(wù)器的響應(yīng)內(nèi)容。
- 釋放連接。無(wú)論執(zhí)行方法是否成功,都必須釋放連接
四、使用示例
HttpClient 為第三方Http 客戶端類庫(kù);在開(kāi)發(fā)過(guò)程中主要是發(fā)送Http協(xié)議的Post請(qǐng)求和Get請(qǐng)求。其中Post請(qǐng)求使用HttpPost對(duì)象構(gòu)建、Get請(qǐng)求使用HttpGet對(duì)象構(gòu)建。
HttpGet 請(qǐng)求
public static void main(String[] args) throws Exception {
// 格式化請(qǐng)求url
// String cmd=String.format("http://%s:%s@%s",username,password,split[1]);
// 請(qǐng)求地址
String url = "https://blog.csdn.net/amosjob/article/details/82775290";
// 創(chuàng)建默認(rèn)的客戶端實(shí)例
CloseableHttpClient httpclient = HttpClients.createDefault();
// 創(chuàng)建get請(qǐng)求實(shí)例
HttpGet httpGet = new HttpGet(url);
// 設(shè)置頭部信息
httpGet.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; rv:6.0.2) Gecko/20100101 Firefox/6.0.2");
// httpGet.addHeader("x-api-key", "XXX");
// httpGet.addHeader("x-lang", "en-US");
// 執(zhí)行GET請(qǐng)求 返回響應(yīng)實(shí)體
HttpResponse response = httpclient.execute(httpGet);
// 獲取響應(yīng)碼
int statusCode = response.getStatusLine().getStatusCode();
// 獲取全部的請(qǐng)求頭
Header[] allHeaders = response.getAllHeaders();
System.out.println("響應(yīng)狀態(tài)碼:" + statusCode);
for (int i = 0; i < allHeaders.length; i++) {
System.out.println("全部的請(qǐng)求頭:" + allHeaders[i]);
}
// 獲取響應(yīng)消息實(shí)體
HttpEntity entity = response.getEntity();
//打印輸出網(wǎng)頁(yè)的內(nèi)容(可刪除)
if (entity != null) {
// 推薦該辦法打印內(nèi)容
System.out.println("響應(yīng)的內(nèi)容:"+EntityUtils.toString(entity));
// 也可以使用這個(gè)方法
InputStream inputStream = entity.getContent();
InputStreamReader streamReader = new InputStreamReader(inputStream);
int line;
line = streamReader.read() ;
while (line!= -1) {
System.out.print((char)line);
line = streamReader.read() ;
}
}
// 關(guān)閉連接
try {
httpclient.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
HttpPost 請(qǐng)求
public static void main(String[] args) throws Exception {
// 請(qǐng)求地址
String url = "https://passport.csdn.net/account/login";
// 創(chuàng)建默認(rèn)的客戶端實(shí)例
CloseableHttpClient httpclient = HttpClients.createDefault();
// 創(chuàng)建POST對(duì)象
HttpPost httpPost = new HttpPost(url);
// 傳參數(shù)
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("username", "admin"));
params.add(new BasicNameValuePair("password", "12345"));
try {
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(params);
httpPost.setEntity(entity);
} catch (Exception e) {
e.printStackTrace();
}
// 執(zhí)行GET請(qǐng)求 返回響應(yīng)實(shí)體
HttpResponse response = httpclient.execute(httpPost);
// 獲取響應(yīng)碼
int statusCode = response.getStatusLine().getStatusCode();
// 獲取全部的請(qǐng)求頭
Header[] allHeaders = response.getAllHeaders();
System.out.println("響應(yīng)狀態(tài)碼:" + statusCode);
for (int i = 0; i < allHeaders.length; i++) {
System.out.println("全部的請(qǐng)求頭:" + allHeaders[i]);
}
// 獲取響應(yīng)消息實(shí)體
HttpEntity entity = response.getEntity();
// 打印輸出網(wǎng)頁(yè)的內(nèi)容(可刪除)
if (entity != null) {
System.out.println("響應(yīng)的內(nèi)容:"+EntityUtils.toString(entity));
}
// 關(guān)閉連接
try {
httpclient.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
以上就是Java httpClient介紹以及使用示例的詳細(xì)內(nèi)容,更多關(guān)于Java httpClient的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Springboot?配置線程池創(chuàng)建線程及配置?@Async?異步操作線程池詳解
這篇文章主要介紹了Springboot?配置線程池創(chuàng)建線程及配置?@Async?異步操作線程池詳解,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09
hibernate 配置數(shù)據(jù)庫(kù)方言的實(shí)現(xiàn)方法
這篇文章主要介紹了hibernate 配置數(shù)據(jù)庫(kù)方言的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05
springboot中非容器類如何獲取配置文件數(shù)據(jù)
這篇文章主要介紹了springboot中非容器類如何獲取配置文件數(shù)據(jù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01
Mybatis之a(chǎn)ssociation和collection用法
這篇文章主要介紹了Mybatis之a(chǎn)ssociation和collection用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
JavaCV實(shí)現(xiàn)多個(gè)MP4視頻的合并
這篇文章主要為大家詳細(xì)介紹了如何使用javacv和ffmpeg框架實(shí)現(xiàn)簡(jiǎn)單快速的合并mp4文件的視頻和音頻,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-10-10
swagger配置正式環(huán)境中不可訪問(wèn)的問(wèn)題
這篇文章主要介紹了swagger配置正式環(huán)境中不可訪問(wèn)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06
詳解SpringMVC注解@initbinder解決類型轉(zhuǎn)換問(wèn)題
本篇文章主要介紹了詳解SpringMVC注解@initbinder解決類型轉(zhuǎn)換問(wèn)題,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-03-03

