HttpClient使用詳解

Http協議的重要性相信不用我多說了,HttpClient相比傳統JDK自帶的URLConnection,增長了易用性和靈活性(具體區別,往後咱們再討論),它不只是客戶端發送Http請求變得容易,並且也方便了開發人員測試接口(基於Http協議的),即提升了開發的效率,也方便提升代碼的健壯性。所以熟練掌握HttpClient是很重要的必修內容,掌握HttpClient後,相信對於Http協議的瞭解會更加深刻。 java

1、簡介

HttpClient是Apache Jakarta Common下的子項目,用來提供高效的、最新的、功能豐富的支持HTTP協議的客戶端編程工具包,而且它支持HTTP協議最新的版本和建議。HttpClient已經應用在不少的項目中,好比Apache Jakarta上很著名的另外兩個開源項目Cactus和HTMLUnit都使用了HttpClient。 apache

下載地址: http://hc.apache.org/downloads.cgi 編程

2、特性

1. 基於標準、純淨的java語言。實現了Http1.0和Http1.1 tomcat

2. 以可擴展的面向對象的結構實現了Http所有的方法(GET, POST, PUT, DELETE, HEAD, OPTIONS, and TRACE)。 服務器

3. 支持HTTPS協議。 多線程

4. 經過Http代理創建透明的鏈接。 socket

5. 利用CONNECT方法經過Http代理創建隧道的https鏈接。 工具

6. Basic, Digest, NTLMv1, NTLMv2, NTLM2 Session, SNPNEGO/Kerberos認證方案。 post

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 可免費獲取。

3、使用方法

使用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. 釋放鏈接。不管執行方法是否成功,都必須釋放鏈接

4、實例

[java]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
  1. package com.test;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileInputStream;  
  5. import java.io.IOException;  
  6. import java.io.UnsupportedEncodingException;  
  7. import java.security.KeyManagementException;  
  8. import java.security.KeyStore;  
  9. import java.security.KeyStoreException;  
  10. import java.security.NoSuchAlgorithmException;  
  11. import java.security.cert.CertificateException;  
  12. import java.util.ArrayList;  
  13. import java.util.List;  
  14.   
  15. import javax.net.ssl.SSLContext;  
  16.   
  17. import org.apache.http.HttpEntity;  
  18. import org.apache.http.NameValuePair;  
  19. import org.apache.http.ParseException;  
  20. import org.apache.http.client.ClientProtocolException;  
  21. import org.apache.http.client.entity.UrlEncodedFormEntity;  
  22. import org.apache.http.client.methods.CloseableHttpResponse;  
  23. import org.apache.http.client.methods.HttpGet;  
  24. import org.apache.http.client.methods.HttpPost;  
  25. import org.apache.http.conn.ssl.SSLConnectionSocketFactory;  
  26. import org.apache.http.conn.ssl.SSLContexts;  
  27. import org.apache.http.conn.ssl.TrustSelfSignedStrategy;  
  28. import org.apache.http.entity.ContentType;  
  29. import org.apache.http.entity.mime.MultipartEntityBuilder;  
  30. import org.apache.http.entity.mime.content.FileBody;  
  31. import org.apache.http.entity.mime.content.StringBody;  
  32. import org.apache.http.impl.client.CloseableHttpClient;  
  33. import org.apache.http.impl.client.HttpClients;  
  34. import org.apache.http.message.BasicNameValuePair;  
  35. import org.apache.http.util.EntityUtils;  
  36. import org.junit.Test;  
  37.   
  38. public class HttpClientTest {  
  39.   
  40.     @Test   
  41.     public void jUnitTest() {  
  42.         get();  
  43.     }  
  44.   
  45.     /** 
  46.      * HttpClient鏈接SSL 
  47.      */  
  48.     public void ssl() {  
  49.         CloseableHttpClient httpclient = null;  
  50.         try {  
  51.             KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());  
  52.             FileInputStream instream = new FileInputStream(new File("d:\\tomcat.keystore"));  
  53.             try {  
  54.                 // 加載keyStore d:\\tomcat.keystore    
  55.                 trustStore.load(instream, "123456".toCharArray());  
  56.             } catch (CertificateException e) {  
  57.                 e.printStackTrace();  
  58.             } finally {  
  59.                 try {  
  60.                     instream.close();  
  61.                 } catch (Exception ignore) {  
  62.                 }  
  63.             }  
  64.             // 相信本身的CA和全部自簽名的證書  
  65.             SSLContext sslcontext = SSLContexts.custom().loadTrustMaterial(trustStore, new TrustSelfSignedStrategy()).build();  
  66.             // 只容許使用TLSv1協議  
  67.             SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, new String[] { "TLSv1" }, null,  
  68.                     SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);  
  69.             httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build();  
  70.             // 建立http請求(get方式)  
  71.             HttpGet httpget = new HttpGet("https://localhost:8443/myDemo/Ajax/serivceJ.action");  
  72.             System.out.println("executing request" + httpget.getRequestLine());  
  73.             CloseableHttpResponse response = httpclient.execute(httpget);  
  74.             try {  
  75.                 HttpEntity entity = response.getEntity();  
  76.                 System.out.println("----------------------------------------");  
  77.                 System.out.println(response.getStatusLine());  
  78.                 if (entity != null) {  
  79.                     System.out.println("Response content length: " + entity.getContentLength());  
  80.                     System.out.println(EntityUtils.toString(entity));  
  81.                     EntityUtils.consume(entity);  
  82.                 }  
  83.             } finally {  
  84.                 response.close();  
  85.             }  
  86.         } catch (ParseException e) {  
  87.             e.printStackTrace();  
  88.         } catch (IOException e) {  
  89.             e.printStackTrace();  
  90.         } catch (KeyManagementException e) {  
  91.             e.printStackTrace();  
  92.         } catch (NoSuchAlgorithmException e) {  
  93.             e.printStackTrace();  
  94.         } catch (KeyStoreException e) {  
  95.             e.printStackTrace();  
  96.         } finally {  
  97.             if (httpclient != null) {  
  98.                 try {  
  99.                     httpclient.close();  
  100.                 } catch (IOException e) {  
  101.                     e.printStackTrace();  
  102.                 }  
  103.             }  
  104.         }  
  105.     }  
  106.   
  107.     /** 
  108.      * post方式提交表單(模擬用戶登陸請求) 
  109.      */  
  110.     public void postForm() {  
  111.         // 建立默認的httpClient實例.    
  112.         CloseableHttpClient httpclient = HttpClients.createDefault();  
  113.         // 建立httppost    
  114.         HttpPost httppost = new HttpPost("http://localhost:8080/myDemo/Ajax/serivceJ.action");  
  115.         // 建立參數隊列    
  116.         List<namevaluepair> formparams = new ArrayList<namevaluepair>();  
  117.         formparams.add(new BasicNameValuePair("username""admin"));  
  118.         formparams.add(new BasicNameValuePair("password""123456"));  
  119.         UrlEncodedFormEntity uefEntity;  
  120.         try {  
  121.             uefEntity = new UrlEncodedFormEntity(formparams, "UTF-8");  
  122.             httppost.setEntity(uefEntity);  
  123.             System.out.println("executing request " + httppost.getURI());  
  124.             CloseableHttpResponse response = httpclient.execute(httppost);  
  125.             try {  
  126.                 HttpEntity entity = response.getEntity();  
  127.                 if (entity != null) {  
  128.                     System.out.println("--------------------------------------");  
  129.                     System.out.println("Response content: " + EntityUtils.toString(entity, "UTF-8"));  
  130.                     System.out.println("--------------------------------------");  
  131.                 }  
  132.             } finally {  
  133.                 response.close();  
  134.             }  
  135.         } catch (ClientProtocolException e) {  
  136.             e.printStackTrace();  
  137.         } catch (UnsupportedEncodingException e1) {  
  138.             e1.printStackTrace();  
  139.         } catch (IOException e) {  
  140.             e.printStackTrace();  
  141.         } finally {  
  142.             // 關閉鏈接,釋放資源    
  143.             try {  
  144.                 httpclient.close();  
  145.             } catch (IOException e) {  
  146.                 e.printStackTrace();  
  147.             }  
  148.         }  
  149.     }  
  150.   
  151.     /** 
  152.      * 發送 post請求訪問本地應用並根據傳遞參數不一樣返回不一樣結果 
  153.      */  
  154.     public void post() {  
  155.         // 建立默認的httpClient實例.    
  156.         CloseableHttpClient httpclient = HttpClients.createDefault();  
  157.         // 建立httppost    
  158.         HttpPost httppost = new HttpPost("http://localhost:8080/myDemo/Ajax/serivceJ.action");  
  159.         // 建立參數隊列    
  160.         List<namevaluepair> formparams = new ArrayList<namevaluepair>();  
  161.         formparams.add(new BasicNameValuePair("type""house"));  
  162.         UrlEncodedFormEntity uefEntity;  
  163.         try {  
  164.             uefEntity = new UrlEncodedFormEntity(formparams, "UTF-8");  
  165.             httppost.setEntity(uefEntity);  
  166.             System.out.println("executing request " + httppost.getURI());  
  167.             CloseableHttpResponse response = httpclient.execute(httppost);  
  168.             try {  
  169.                 HttpEntity entity = response.getEntity();  
  170.                 if (entity != null) {  
  171.                     System.out.println("--------------------------------------");  
  172.                     System.out.println("Response content: " + EntityUtils.toString(entity, "UTF-8"));  
  173.                     System.out.println("--------------------------------------");  
  174.                 }  
  175.             } finally {  
  176.                 response.close();  
  177.             }  
  178.         } catch (ClientProtocolException e) {  
  179.             e.printStackTrace();  
  180.         } catch (UnsupportedEncodingException e1) {  
  181.             e1.printStackTrace();  
  182.         } catch (IOException e) {  
  183.             e.printStackTrace();  
  184.         } finally {  
  185.             // 關閉鏈接,釋放資源    
  186.             try {  
  187.                 httpclient.close();  
  188.             } catch (IOException e) {  
  189.                 e.printStackTrace();  
  190.             }  
  191.         }  
  192.     }  
  193.   
  194.     /** 
  195.      * 發送 get請求 
  196.      */  
  197.     public void get() {  
  198.         CloseableHttpClient httpclient = HttpClients.createDefault();  
  199.         try {  
  200.             // 建立httpget.    
  201.             HttpGet httpget = new HttpGet("http://www.baidu.com/");  
  202.             System.out.println("executing request " + httpget.getURI());  
  203.             // 執行get請求.    
  204.             CloseableHttpResponse response = httpclient.execute(httpget);  
  205.             try {  
  206.                 // 獲取響應實體    
  207.                 HttpEntity entity = response.getEntity();  
  208.                 System.out.println("--------------------------------------");  
  209.                 // 打印響應狀態    
  210.                 System.out.println(response.getStatusLine());  
  211.                 if (entity != null) {  
  212.                     // 打印響應內容長度    
  213.                     System.out.println("Response content length: " + entity.getContentLength());  
  214.                     // 打印響應內容    
  215.                     System.out.println("Response content: " + EntityUtils.toString(entity));  
  216.                 }  
  217.                 System.out.println("------------------------------------");  
  218.             } finally {  
  219.                 response.close();  
  220.             }  
  221.         } catch (ClientProtocolException e) {  
  222.             e.printStackTrace();  
  223.         } catch (ParseException e) {  
  224.             e.printStackTrace();  
  225.         } catch (IOException e) {  
  226.             e.printStackTrace();  
  227.         } finally {  
  228.             // 關閉鏈接,釋放資源    
  229.             try {  
  230.                 httpclient.close();  
  231.             } catch (IOException e) {  
  232.                 e.printStackTrace();  
  233.             }  
  234.         }  
  235.     }  
  236.   
  237.     /** 
  238.      * 上傳文件 
  239.      */  
  240.     public void upload() {  
  241.         CloseableHttpClient httpclient = HttpClients.createDefault();  
  242.         try {  
  243.             HttpPost httppost = new HttpPost("http://localhost:8080/myDemo/Ajax/serivceFile.action");  
  244.   
  245.             FileBody bin = new FileBody(new File("F:\\image\\sendpix0.jpg"));  
  246.             StringBody comment = new StringBody("A binary file of some kind", ContentType.TEXT_PLAIN);  
  247.   
  248.             HttpEntity reqEntity = MultipartEntityBuilder.create().addPart("bin", bin).addPart("comment", comment).build();  
  249.   
  250.             httppost.setEntity(reqEntity);  
  251.   
  252.             System.out.println("executing request " + httppost.getRequestLine());  
  253.             CloseableHttpResponse response = httpclient.execute(httppost);  
  254.             try {  
  255.                 System.out.println("----------------------------------------");  
  256.                 System.out.println(response.getStatusLine());  
  257.                 HttpEntity resEntity = response.getEntity();  
  258.                 if (resEntity != null) {  
  259.                     System.out.println("Response content length: " + resEntity.getContentLength());  
  260.                 }  
  261.                 EntityUtils.consume(resEntity);  
  262.             } finally {  
  263.                 response.close();  
  264.             }  
  265.         } catch (ClientProtocolException e) {  
  266.             e.printStackTrace();  
  267.         } catch (IOException e) {  
  268.             e.printStackTrace();  
  269.         } finally {  
  270.             try {  
  271.                 httpclient.close();  
  272.             } catch (IOException e) {  
  273.                 e.printStackTrace();  
  274.             }  
  275.         }  
  276.     }  
  277. }</namevaluepair></namevaluepair></namevaluepair></namevaluepair>  

本實例是採用HttpClient4.3最新版本。該版本與以前的代碼寫法風格相差較大,你們多留意下

相關文章
相關標籤/搜索