Java httpClient介紹以及使用示例
Java 開發(fā)語言中實現(xiàn)HTTP請求的方法主要有兩種:一種是JAVA的標(biāo)準(zhǔn)類HttpUrlConnection,比較原生的實現(xiàn)方法;另一種是第三方開源框架HTTPClient。
HttpClient相比傳統(tǒng)JDK自帶的URLConnection,增加了易用性和靈活性,它不僅是客戶端發(fā)送Http請求變得容易,而且也方便了開發(fā)人員測試接口(基于Http協(xié)議的),即提高了開發(fā)的效率,也方便提高代碼的健壯性。
一、HttpClient簡單介紹
HttpClient是Apache Jakarta Common下的子項目,用來提供高效的、最新的、功能豐富的支持HTTP協(xié)議的客戶端編程工具包,并且它支持HTTP協(xié)議最新的版本和建議。HttpClient已經(jīng)應(yīng)用在很多的項目中,比如Apache Jakarta上很著名的另外兩個開源項目Cactus和HTMLUnit都使用了HttpClient。
HTTPClient對HTTP的封裝性比較不錯,通過它基本上能夠滿足我們大部分的需求。HttpClient3.1 是 org.apache.commons.httpclient下操作遠(yuǎn)程 url的工具包,雖然已不再更新,但實現(xiàn)工作中使用httpClient3.1的代碼還是很多。HttpClient4.5 是org.apache.http.client下操作遠(yuǎn)程 url的工具包。
二、HttpClient特性
- 基于標(biāo)準(zhǔn)、純凈的java語言。實現(xiàn)了Http1.0和Http1.1。
- 以可擴(kuò)展的面向?qū)ο蟮慕Y(jié)構(gòu)實現(xiàn)了Http全部的方法(GET, POST, PUT, DELETE, HEAD, OPTIONS, and TRACE)。
- 支持HTTPS協(xié)議。
- 通過Http代理建立透明的連接。
- 利用CONNECT方法通過Http代理建立隧道的https連接。
- Basic, Digest, NTLMv1, NTLMv2, NTLM2 Session, SNPNEGO/Kerberos認(rèn)證方案。
- 插件式的自定義認(rèn)證方案。
- 便攜可靠的套接字工廠使它更容易的使用第三方解決方案。
- 連接管理器支持多線程應(yīng)用。支持設(shè)置最大連接數(shù),同時支持設(shè)置每個主機(jī)的最大連接數(shù),發(fā)現(xiàn)并關(guān)閉過期的連接。
- 自動處理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è)置連接超時的能力。
- 實驗性的支持http1.1 response caching。
- 源代碼基于Apache License 可免費(fèi)獲取。
三、使用方法
使用HttpClient發(fā)送請求、接收響應(yīng)很簡單,一般需要如下幾步即可。
- 創(chuàng)建HttpClient對象。
- 創(chuàng)建請求方法的實例,并指定請求URL。如果需要發(fā)送GET請求,創(chuàng)建HttpGet對象;如果需要發(fā)送POST請求,創(chuàng)建HttpPost對象。
- 如果需要發(fā)送請求參數(shù),可調(diào)用HttpGet、HttpPost共同的setParams(HetpParams params)方法來添加請求參數(shù);對于HttpPost對象而言,也可調(diào)用setEntity(HttpEntity entity)方法來設(shè)置請求參數(shù)。
- 調(diào)用HttpClient對象的execute(HttpUriRequest request)發(fā)送請求,該方法返回一個HttpResponse。
- 調(diào)用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可獲取服務(wù)器的響應(yīng)頭;調(diào)用HttpResponse的getEntity()方法可獲取HttpEntity對象,該對象包裝了服務(wù)器的響應(yīng)內(nèi)容。程序可通過該對象獲取服務(wù)器的響應(yīng)內(nèi)容。
- 釋放連接。無論執(zhí)行方法是否成功,都必須釋放連接
四、使用示例
HttpClient 為第三方Http 客戶端類庫;在開發(fā)過程中主要是發(fā)送Http協(xié)議的Post請求和Get請求。其中Post請求使用HttpPost對象構(gòu)建、Get請求使用HttpGet對象構(gòu)建。
HttpGet 請求
public static void main(String[] args) throws Exception { // 格式化請求url // String cmd=String.format("http://%s:%s@%s",username,password,split[1]); // 請求地址 String url = "https://blog.csdn.net/amosjob/article/details/82775290"; // 創(chuàng)建默認(rèn)的客戶端實例 CloseableHttpClient httpclient = HttpClients.createDefault(); // 創(chuàng)建get請求實例 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請求 返回響應(yīng)實體 HttpResponse response = httpclient.execute(httpGet); // 獲取響應(yīng)碼 int statusCode = response.getStatusLine().getStatusCode(); // 獲取全部的請求頭 Header[] allHeaders = response.getAllHeaders(); System.out.println("響應(yīng)狀態(tài)碼:" + statusCode); for (int i = 0; i < allHeaders.length; i++) { System.out.println("全部的請求頭:" + allHeaders[i]); } // 獲取響應(yīng)消息實體 HttpEntity entity = response.getEntity(); //打印輸出網(wǎng)頁的內(nèi)容(可刪除) if (entity != null) { // 推薦該辦法打印內(nèi)容 System.out.println("響應(yīng)的內(nèi)容:"+EntityUtils.toString(entity)); // 也可以使用這個方法 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 請求
public static void main(String[] args) throws Exception { // 請求地址 String url = "https://passport.csdn.net/account/login"; // 創(chuàng)建默認(rèn)的客戶端實例 CloseableHttpClient httpclient = HttpClients.createDefault(); // 創(chuàng)建POST對象 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請求 返回響應(yīng)實體 HttpResponse response = httpclient.execute(httpPost); // 獲取響應(yīng)碼 int statusCode = response.getStatusLine().getStatusCode(); // 獲取全部的請求頭 Header[] allHeaders = response.getAllHeaders(); System.out.println("響應(yīng)狀態(tài)碼:" + statusCode); for (int i = 0; i < allHeaders.length; i++) { System.out.println("全部的請求頭:" + allHeaders[i]); } // 獲取響應(yīng)消息實體 HttpEntity entity = response.getEntity(); // 打印輸出網(wǎng)頁的內(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的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
springBoot項目中的全局異常處理和自定義異常處理實現(xiàn)
異常是由于程序邏輯錯誤、運(yùn)行環(huán)境問題、用戶輸入錯誤等原因?qū)е碌囊环N非正常的狀態(tài)或事件,本文主要介紹了springBoot項目中的全局異常處理和自定義異常處理實現(xiàn),具有一定的參考價值,感興趣的可以了解一下2024-08-08SpringBoot?整合?EasyExcel?實現(xiàn)自由導(dǎo)入導(dǎo)出功能
在實際的業(yè)務(wù)系統(tǒng)開發(fā)過程中,操作 Excel 實現(xiàn)數(shù)據(jù)的導(dǎo)入導(dǎo)出基本上是個非常常見的需求,這篇文章主要介紹了SpringBoot?整合?EasyExcel?實現(xiàn)自由導(dǎo)入導(dǎo)出功能,需要的朋友可以參考下2024-06-06