HttpClient是一個客戶端的HTTP通訊實作庫。 HttpClient的目標是發送和接收HTTP封包。
Http協定的重要性相信不用我多說了,HttpClient相比傳統JDK自帶的URLConnection,增加了易用性和靈活性(具體區別,日後我們再討論),它不僅是客戶端發送Http請求變得容易,而且也方便了開發人員測試介面(基於Http協定的),即提高了開發的效率,也方便提高程式碼的健全性。因此熟練HttpClient是很重要的必修內容,掌握HttpClient後,相信對於Http協議的了解會更加深入。
一、簡介
HttpClient是Apache Jakarta Common下的子項目,用來提供高效的、最新的、功能豐富的支援HTTP協定的客戶端程式設計工具包,並且它支援HTTP協定的最新版本和建議。 HttpClient已經應用在很多的專案中,像是Apache Jakarta上很著名的另外兩個開源專案Cactus和HTMLUnit都使用了HttpClient。
下載網址: http://hc.apache.org/downloads.cgi
二、特性
1. 基於標準、純淨的java語言。實現了Http1.0和Http1.1
2. 以可擴展的物件導向的結構實現了Http全部的方法(GET, POST, PUT, DELETE, HEAD, OPTIONS, and TRACE)。
3. 支援HTTPS協定。
4. 透過Http代理建立透明的連線。
5. 利用CONNECT方法透過Http代理建立隧道的https連接。
6. Basic, Digest, NTLMv1, NTLMv2, NTLM2 Session, SNPNEGO/Kerberos認證方案。
7. 插件式的自訂認證方案。
8. 便攜可靠的套接字工廠使它更容易的使用第三方解決方案。
9. 連線管理器支援多執行緒應用。支援設定最大連線數,同時支援設定每個主機的最大連線數,發現並關閉過期的連線。
10. 自動處理Set-Cookie中的Cookie。
11. 插件式的自訂Cookie策略。
12. Request的輸出流可以避免流中內容直接緩衝到socket伺服器。
13. Response的輸入流可以有效的從socket伺服器直接讀取對應內容。
14. 在http1.0和http1.1中利用KeepAlive保持持久連線。
15. 直接取得伺服器發送的response code和headers。
16. 設定連線超時的能力。
17. 實驗性的支持http1.1 response caching。
18. 原始碼基於Apache License 可免費取得。
三、使用方法
使用HttpClient發送請求、接收回應很簡單,一般需要以下幾個步驟即可。
1. 建立HttpClient物件。
2. 建立請求方法的實例,並指定請求URL。如果需要傳送GET請求,建立HttpGet物件;如果需要傳送POST請求,建立HttpPost物件。
3. 如果需要傳送請求參數,可呼叫HttpGet、HttpPost共同的setParams(HetpParams params)方法來新增請求參數;對於HttpPost物件而言,也可呼叫setEntity(HttpEntity entity)方法來設定請求參數。
4. 呼叫HttpClient物件的execute(HttpUriRequest request)傳送請求,該方法傳回一個HttpResponse。
5. 呼叫HttpResponse的getAllHeaders()、getHeaders(String name)等方法可取得伺服器的回應頭;呼叫HttpResponse的getEntity()方法可取得HttpEntity對象,該物件包裝了伺服器的回應內容。程式可透過該物件取得伺服器的回應內容。
6. 釋放連線。無論執行方法是否成功,都必須釋放連接
四、實例
package com.test; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.security.KeyManagementException; import javaore.import java.security.KeyManagementException; import javaore. security.KeyStoreException; import java.security.NoSuchAlgorithmException; import java.security.cert.CertificateException; import java.util.ArrayList; import java.util.List; import javax.net.ssl.SSLContext; importjava.util.List; import javax.net.ssl.SSLContext; import org. apache.http.NameValuePair; import org.apache.http.ParseException; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.CloseablecodedFormEntity; import org.apache.http.client.甲基http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.conn.ssl.SSLConnectionSocketFactory; import org.apache.http.conn.ssl.SSLContexts; import org.apache.http.conn.ssl. TrustSelfSignedStrategy; import org.apache.http.entity.ContentType; import org.apache.http.entity.mime.MultipartEntityBuilder; import org.apache.http.entity.mime.content.FileBody; import org.apache.http.entity.mime.content .StringBody; import org.apache.http.impl.client.CloseableHttpClient; import org。 () { get(); } /** * HttpClient連接SSL */ public void ssl() { CloseableHttpClient httpclient = null; try { KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); FileInputStream instream = new FileInputStream(new Files"d://catcat. )); try { // 載入keyStore d://tomcat.keystore trustStore.load(instream, "123456".toCharArray()); } catch (CertificateException e) { e.printStackTrace(); } finally { try { instream.close(); } catch (Exception ignore) { } } // // // try { instream.close(); } catch (Exception ignore) { } } // //相信自己的CA和所有自簽署的憑證SSLContext sslcontext = SSLContexts.custom().loadTrustMaterial(trustStore, new TrustSelfSignedStrategy()).build(); // 只允許使用TLSv1協定SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, new String[ }Tullv. SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER); httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build(); // 建立http請求(get方式) HttpGet httpget = new HttpGet("https://localhost:8443/myDemo/Ajax/serivceJ.action"); System.out.println("executing request" + httpget.getRequestLine()); CloseableHttpResponse response = httpclient.execute(httpget); response = httpclient.execute(httpget); responsetry { HttpEntity entity = response.getEntity(); System.out.println("----------------------------------------"); System.out.println(response.getStatusLine()); if (entity != null) { System.out.println("Response content length: " + entity.getContentLength()); System.out.println(EntityUtils.toString (entity)); EntityUtils.consume(entity); } } finally { response.close(); } } catch (ParseException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (KeyManagementException e) { e.printStackTrace(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (KeyStoreException e) { e.printStackTrace(); } finally { if (httpclient != null) { try { httpclient.close(); } catch (IOException e) { e.printStackTrace(); } } } } /** * post方式提交表單(模擬使用者登入要求) */ public void postForm() { // 建立預設的httpClient實例. CloseableHttpClient httpclient = HttpClients.createDefault(); // 建立httppost HttpPost httppost = new HttpPost("http://localhost:8080/myDemo/Ajax/serivceJ.action"); // 建立參數佇列List<namevaluepair> formparams = new ArListnamevalue >(); formparams.add(new BasicNameValuePair("username", "admin")); formparams.add(new BasicNameValuePair("password", "123456")); UrlEncodedFormEntity uefEntity; try { uefEntity = new UrlEncodedFormEntity(formparams, "UTF-8"); httppost.Entity(uefEntity); .out.println("executing request " + httppost.getURI()); CloseableHttpResponse response = httpclient.execute(httppost); try { HttpEntity entity = response.getEntity(); if (entity != null) { System.out.println("------- -------------------------------"); System.out.println("Response content: " + EntityUtils.toString( entity, "UTF-8")); System.out.println("----------------------------------- ---"); } } finally { response.close(); } } catch (ClientProtocolException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e1) { e1.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { // 關閉連線,釋放資源try { httpclient.close(); } catch (IOException e) { e.printStackTrace(); } } } /** * 發送post請求存取本機應用程式並根據傳遞參數不同返回不同結果* / public void post() { // 建立預設的httpClient實例. CloseableHttpClient httpclient = HttpClients.createDefault(); // 建立httppost HttpPost httppost = new HttpPost("http://localhost:8080/myDemo/Ajax/serivceJ.action"); // 建立參數佇列List<namevaluepair> formparams = new ArrayList<namevaluepair>(); formparams.add(new BasicNameValuePair( "type", "house")); UrlEncodedFormEntity uefEntity; try { uefEntity = new UrlEncodedFormEntity(formparams, "UTF-8"); httppost.setEntity(uefEntity); System.out.println("executing request " + httppost.getURI()); CloseableHttpResponse response = httpclient.execute(httppost.try { HttpEntity entity = response.getEntity(); if (entity != null) { System.out.println("-------------------------------------- "); System.out.println("Response content: " + EntityUtils.toString(entity, "UTF-8")); System.out.println("-------------- ------------------------"); } } finally { response.close(); } } catch (ClientProtocolException e) { e.printStackTrace() ; } catch (UnsupportedEncodingException e1) { e1.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { // 關閉連線,釋放資源try { httpclient.close(); } catch (IOException e) { e.printStackTrace(); } } } /** * 傳送get請求*/ public void get() { CloseableHttpClient httpclient = HttpClients.createDefault(); try { // 建立httpget. HttpGet httpget = new HttpGet("http://www.baidu.com/"); System.out.println("executing request " + httpget.getURI ()); // 執行get請求. CloseableHttpResponse response = httpclient.execute(httpget); try { // 取得回應實體HttpEntity entity = response.getEntity(); System.out.println("-------------------- ------------------"); // 印出回應狀態System.out.println(response.getStatusLine()); if (entity != null) { // 列印回應內容長度System.out.println("Response content length: " + entity.getContentLength()); // 列印回應內容System.out.println("Response content: " + EntityUtils.toString(entity)); } System.out.println("------ ------------------------------"); } finally { response.close(); } } catch (ClientProtocolException e) { e.printStackTrace(); } catch (ParseException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { // 關閉連線,釋放資源try { httpclient.close(); } catch (IOException e) { e .printStackTrace(); } } } /** * 上傳檔案*/ public void upload() { CloseableHttpClient httpclient = HttpClients.createDefault(); try { HttpPost httppost = new HttpPost("http://localhost:8080/myDemo/Ajax/serivceFile.action"); FileBody bin = new FileBody(new File("F://image// sendpix0.jpg")); StringBody comment = new StringBody("A binary file of some kind", ContentType.TEXT_PLAIN); HttpEntity reqEntity = MultipartEntityBuilder.create().addPart("bin", bin).addPart("comment", comment).build(); httppost.setEntity(reqEntity); System.out.println("executing request " + httppost.getRequestLine()); CloseableHttpResponse response = httpclient.execute(httppost); try { System.out.println("------------------------------- ---------"); System.out.println(response.getStatusLine()); HttpEntity resEntity = response.getEntity(); if (resEntity != null) { System.out.println("Response content length: " + resEntity.getContentLength()); } EntityUtils.consume(resEntity); } finally { response.close(); } } catch (ClientProtocolException e) { e.printStackTrace(); } catch (Exception e) { eIOprintStackTrace() } catch ( ; } finally { try { httpclient.close(); } catch (IOException e) { e.printStackTrace(); } } } }</namevaluepair></namevaluepair></namevaluepair></namevaluepair>
本實例是採用HttpClient4.3最新版本。此版本與之前的程式碼寫法風格相差較大,大家多留意下。
好了,以上所述就是本文的全部內容,希望大家喜歡。