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 blocke.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 blocke.printStackTrace();}}
以上就是Java httpClient介紹以及使用示例的詳細(xì)內(nèi)容,更多關(guān)于Java httpClient的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!
相關(guān)文章:
1. IntelliJ IDEA設(shè)置條件斷點(diǎn)的方法步驟2. IntelliJ Idea2017如何修改緩存文件的路徑3. IIS Express 取代 ASP.NET Development Server的配置方法4. 一篇文章帶你了解JavaScript-對(duì)象5. Express 框架中使用 EJS 模板引擎并結(jié)合 silly-datetime 庫(kù)進(jìn)行日期格式化的實(shí)現(xiàn)方法6. Spring-Richclient 0.1.0 發(fā)布7. javascript設(shè)計(jì)模式 ? 建造者模式原理與應(yīng)用實(shí)例分析8. HTML <!DOCTYPE> 標(biāo)簽9. 淺談SpringMVC jsp前臺(tái)獲取參數(shù)的方式 EL表達(dá)式10. Python使用oslo.vmware管理ESXI虛擬機(jī)的示例參考
