1. 程式人生 > >HttpClient 在Java專案中的使用詳解

HttpClient 在Java專案中的使用詳解

Http協議的重要性相信不用我多說了,
HttpClient相比傳統JDK自帶的URLConnection,增加了易用性和靈活性(具體區別,日後我們再討論),
它不僅是客戶端傳送Http請求變得容易,而且也方便了開發人員測試介面(基於Http協議的),
即提高了開發的效率,也方便提高程式碼的健壯性。
因此熟練掌握HttpClient是很重要的必修內容,掌握HttpClient後,相信對於Http協議的瞭解會更加深入。

一、簡介

HttpClient是Apache Jakarta Common下的子專案,
用來提供高效的、最新的、功能豐富的支援HTTP協議的客戶端程式設計工具包,並且它支援HTTP協議最新的版本和建議。
HttpClient已經應用在很多的專案中,比如Apache Jakarta上很著名的另外兩個開源專案Cactus和HTMLUnit都使用了HttpClient。

二、特性

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. 釋放連線。無論執行方法是否成功,都必須釋放連線

四、例項

  1. package com.test;
  2. import java.io.File;
  3. import java.io.FileInputStream;
  4. import java.io.IOException;
  5. import java.io.UnsupportedEncodingException;
  6. import java.security.KeyManagementException;
  7. import java.security.KeyStore;
  8. import java.security.KeyStoreException;
  9. import java.security.NoSuchAlgorithmException;
  10. import java.security.cert.CertificateException;
  11. import java.util.ArrayList;
  12. import java.util.List;
  13. import javax.net.ssl.SSLContext;
  14. import org.apache.http.HttpEntity;
  15. import org.apache.http.NameValuePair;
  16. import org.apache.http.ParseException;
  17. import org.apache.http.client.ClientProtocolException;
  18. import org.apache.http.client.entity.UrlEncodedFormEntity;
  19. import org.apache.http.client.methods.CloseableHttpResponse;
  20. import org.apache.http.client.methods.HttpGet;
  21. import org.apache.http.client.methods.HttpPost;
  22. import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
  23. import org.apache.http.conn.ssl.SSLContexts;
  24. import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
  25. import org.apache.http.entity.ContentType;
  26. import org.apache.http.entity.mime.MultipartEntityBuilder;
  27. import org.apache.http.entity.mime.content.FileBody;
  28. import org.apache.http.entity.mime.content.StringBody;
  29. import org.apache.http.impl.client.CloseableHttpClient;
  30. import org.apache.http.impl.client.HttpClients;
  31. import org.apache.http.message.BasicNameValuePair;
  32. import org.apache.http.util.EntityUtils;
  33. import org.junit.Test;
  34. public class HttpClientTest {
  35.   @Test
  36.   public void jUnitTest() {
  37.     get();
  38.   }
  39.   /**
  40.    * HttpClient連線SSL
  41.    */
  42.   public void ssl() {
  43.     CloseableHttpClient httpclient = null;
  44.     try {
  45.       KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
  46.       FileInputStream instream = new FileInputStream(new File("d:\\tomcat.keystore"));
  47.       try {
  48.         // 載入keyStore d:\\tomcat.keystore 
  49.         trustStore.load(instream, "123456".toCharArray());
  50.       } catch (CertificateException e) {
  51.         e.printStackTrace();
  52.       } finally {
  53.         try {
  54.           instream.close();
  55.         } catch (Exception ignore) {
  56.         }
  57.       }
  58.       // 相信自己的CA和所有自簽名的證書
  59.       SSLContext sslcontext = SSLContexts.custom().loadTrustMaterial(trustStore, new TrustSelfSignedStrategy()).build();
  60.       // 只允許使用TLSv1協議
  61.       SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, new String[] { "TLSv1" }, null,
  62.           SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
  63.       httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build();
  64.       // 建立http請求(get方式)
  65.       HttpGet httpget = new HttpGet("https://localhost:8443/myDemo/Ajax/serivceJ.action");
  66.       System.out.println("executing request" + httpget.getRequestLine());
  67.       CloseableHttpResponse response = httpclient.execute(httpget);
  68.       try {
  69.         HttpEntity entity = response.getEntity();
  70.         System.out.println("----------------------------------------");
  71.         System.out.println(response.getStatusLine());
  72.         if (entity != null) {
  73.           System.out.println("Response content length: " + entity.getContentLength());
  74.           System.out.println(EntityUtils.toString(entity));
  75.           EntityUtils.consume(entity);
  76.         }
  77.       } finally {
  78.         response.close();
  79.       }
  80.     } catch (ParseException e) {
  81.       e.printStackTrace();
  82.     } catch (IOException e) {
  83.       e.printStackTrace();
  84.     } catch (KeyManagementException e) {
  85.       e.printStackTrace();
  86.     } catch (NoSuchAlgorithmException e) {
  87.       e.printStackTrace();
  88.     } catch (KeyStoreException e) {
  89.       e.printStackTrace();
  90.     } finally {
  91.       if (httpclient != null) {
  92.         try {
  93.           httpclient.close();
  94.         } catch (IOException e) {
  95.           e.printStackTrace();
  96.         }
  97.       }
  98.     }
  99.   }
  100.   /**
  101.    * post方式提交表單(模擬使用者登入請求)
  102.    */
  103.   public void postForm() {
  104.     // 建立預設的httpClient例項. 
  105.     CloseableHttpClient httpclient = HttpClients.createDefault();
  106.     // 建立httppost 
  107.     HttpPost httppost = new HttpPost("http://localhost:8080/myDemo/Ajax/serivceJ.action");
  108.     // 建立引數佇列 
  109.     List formparams = new ArrayList();
  110.     formparams.add(new BasicNameValuePair("username", "admin"));
  111.     formparams.add(new BasicNameValuePair("password", "123456"));
  112.     UrlEncodedFormEntity uefEntity;
  113.     try {
  114.       uefEntity = new UrlEncodedFormEntity(formparams, "UTF-8");
  115.       httppost.setEntity(uefEntity);
  116.       System.out.println("executing request " + httppost.getURI());
  117.       CloseableHttpResponse response = httpclient.execute(httppost);
  118.       try {
  119.         HttpEntity entity = response.getEntity();
  120.         if (entity != null) {
  121.           System.out.println("--------------------------------------");
  122.           System.out.println("Response content: " + EntityUtils.toString(entity, "UTF-8"));
  123.           System.out.println("--------------------------------------");
  124.         }
  125.       } finally {
  126.         response.close();
  127.       }
  128.     } catch (ClientProtocolException e) {
  129.       e.printStackTrace();
  130.     } catch (UnsupportedEncodingException e1) {
  131.       e1.printStackTrace();
  132.     } catch (IOException e) {
  133.       e.printStackTrace();
  134.     } finally {
  135.       // 關閉連線,釋放資源 
  136.       try {
  137.         httpclient.close();
  138.       } catch (IOException e) {
  139.         e.printStackTrace();
  140.       }
  141.     }
  142.   }
  143.   /**
  144.    * 傳送 post請求訪問本地應用並根據傳遞引數不同返回不同結果
  145.    */
  146.   public void post() {
  147.     // 建立預設的httpClient例項. 
  148.     CloseableHttpClient httpclient = HttpClients.createDefault();
  149.     // 建立httppost 
  150.     HttpPost httppost = new HttpPost("http://localhost:8080/myDemo/Ajax/serivceJ.action");
  151.     // 建立引數佇列 
  152.     List formparams = new ArrayList();
  153.     formparams.add(new BasicNameValuePair("type", "house"));
  154.     UrlEncodedFormEntity uefEntity;
  155.     try {
  156.       uefEntity = new UrlEncodedFormEntity(formparams, "UTF-8");
  157.       httppost.setEntity(uefEntity);
  158.       System.out.println("executing request " + httppost.getURI());
  159.       CloseableHttpResponse response = httpclient.execute(httppost);
  160.       try {
  161.         HttpEntity entity = response.getEntity();
  162.         if (entity != null) {
  163.           System.out.println("--------------------------------------");
  164.           System.out.println("Response content: " + EntityUtils.toString(entity, "UTF-8"));
  165.           System.out.println("--------------------------------------");
  166.         }
  167.       } finally {
  168.         response.close();
  169.       }
  170.     } catch (ClientProtocolException e) {
  171.       e.printStackTrace();
  172.     } catch (UnsupportedEncodingException e1) {
  173.       e1.printStackTrace();
  174.     } catch (IOException e) {
  175.       e.printStackTrace();
  176.     } finally {
  177.       // 關閉連線,釋放資源 
  178.       try {
  179.         httpclient.close();
  180.       } catch (IOException e) {
  181.         e.printStackTrace();
  182.       }
  183.     }
  184.   }
  185.   /**
  186.    * 傳送 get請求
  187.    */
  188.   public void get() {
  189.     CloseableHttpClient httpclient = HttpClients.createDefault();
  190.     try {
  191.       // 建立httpget. 
  192.       HttpGet httpget = new HttpGet("http://www.baidu.com/");
  193.       System.out.println("executing request " + httpget.getURI());
  194.       // 執行get請求. 
  195.       CloseableHttpResponse response = httpclient.execute(httpget);
  196.       try {
  197.         // 獲取響應實體 
  198.         HttpEntity entity = response.getEntity();
  199.         System.out.println("--------------------------------------");
  200.         // 列印響應狀態 
  201.         System.out.println(response.getStatusLine());
  202.         if (entity != null) {
  203.           // 列印響應內容長度 
  204.           System.out.println("Response content length: " + entity.getContentLength());
  205.           // 列印響應內容 
  206.           System.out.println("Response content: " + EntityUtils.toString(entity));
  207.         }
  208.         System.out.println("------------------------------------");
  209.       } finally {
  210.         response.close();
  211.       }
  212.     } catch (ClientProtocolException e) {
  213.       e.printStackTrace();
  214.     } catch (ParseException e) {
  215.       e.printStackTrace();
  216.     } 

    相關推薦

    HttpClientJava專案的使用

    Http協議的重要性相信不用我多說了, HttpClient相比傳統JDK自帶的URLConnection,增加了易用性和靈活性(具體區別,日後我們再討論), 它不僅是客戶端傳送Http請求變得容易,而且也方便了開發人員測試介面(基於Http協議的), 即提高了開發的效

    關於JAVA專案CLASSPATH路徑

    ClassLoader 提供了兩個方法用於從裝載的類路徑中取得資源:        public URL getResource (String name);         public InputStream getResourceAsStream (String name);        這裡n

    java每次面試的問題整理,java篇()

    Java集合框架是什麼,集合框架優點! 最初的java版本包含幾個集合類,Vector,Stack,HashTable,和Array. Java1.2提出了囊括所有集合的介面,實現和演算法的集合框架。集合框架的部分優點↓ 1,實現核心集合類降低開發成本.並非實現我們自己的集合類,

    #Java怎麼學?2018最新Java學習路線,技術要求與專案推薦

    一 基礎篇 很多人認為,java的基礎應該是C語言,這個不可否認,但是也不能說完全正確,因為兩個語言技術的內涵是不一樣的,C語言是面向語言程式設計而java語言是面向物件程式設計,打個比喻,C語言大多數是做系統應用,而java是做企業級應用的。所以,學Java不一定要學C,Java簡化了C,而在

    tensorflow多層lstm專案程式碼(進度:1/4)

    1. 專案地址 2. 專案資料 使用text8.zip Linux下下載指令 curl http://mattmahoney.net/dc/text8.zip > text8.zip 3. 命令列執行指令 python3.5 ptb_word_lm.py

    Java怎麼學?2018Java學習路線,技術要求與專案推薦

    專案實戰推薦:基礎篇之JavaScript為什麼要把JS從前端基礎中單獨的分離出來呢?因為JS在前端中佔得位置比較重,什麼意思呢?我們把頁面看成一張紙,這張紙有顏色是不夠的,我們必須讓他“鮮活起來”那我們就要用到“馬良筆”而這支筆就是JS,他增加了頁面的動態,也能做到和後臺的互動,是比較重要的知識點。知識要點

    JNI呼叫JAVA各種方法

    總結一下 C 如何 通過 JNI 層呼叫 Java 的靜態和非靜態方法 對於:JNIEXPORT void JNICALL Java_com_example_TestNative_sayHello(JNIEnv * env, jobject th

    java.util包(二)——Connection接口

    操作 相同 元素 叠代 cat roo soft true nbsp Connection接口介紹   Connection接口是java集合的root接口,沒有實現類,只有子接口和實現子接口的各種容器。主要用來表示java集合這一大的抽象概念。   Connection接

    java對象

    add splay view created 元素 繼承關系 外部 優化 csdn java對象詳解 內存布局 普通對象布局 數組的內存布局 內部類的內存布局 對象分解 對象頭-mark word(8字節) 實例數據 對齊填充(可選) java鎖分析

    Java泛型

    對象數組 整形 泛型方法 tty 接受 一個 div -m color 泛型的本質是參數化類型,也就是說所操作的數據類型被指定為一個參數。 假定我們有這樣一個需求:寫一個排序方法,能夠對整形數組、字符串數組甚至其他任何類型的數組進行排序,該如何實現? 答案是可以使用 Ja

    Java常量池

    回收 array 數值 編譯期 二進制格式 new 保持 占用 get 轉自:http://www.cnblogs.com/iyangyuan/p/4631696.html jvm虛擬內存分布圖: 程序計數器:JVM執行程序的流水線。 本地方法棧:JVM調用操作系統方法所

    Java線程(一)

    線程 thread runnable 程序、進程、線程的概念 程序(program):是為完成特定任務、用某種語言編寫的一組指令的集合。即指一段靜態的代碼,靜態對象。 進程(process):是程序的一次執行過程,或是正在運行的一個程序。動態過程:有它自身的產生、存在和消亡的過程。 如

    Java反射機制

    java 反射 反射機制 工廠模式 1反射機制是什麽反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能稱為java語言的反射機制。在面向對象的世界裏,萬事萬物皆對象.在ja

    JAVA環境配置

    指向 微軟 ssp cep 解釋 引入 bin testcase loader 步驟:一下載安裝JDK(註意版本)二配置環境變量 JAVA_HOME:JDK的安裝路徑 CLASSPATH:.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\too

    Java反射機制

    ride length 數組大小 conf array arraycopy 動態調用 ray info Java反射機制詳解 |目錄 1反射機制是什麽 2反射機制能做什麽 3反射機制的相關API ·通過一個對象獲得完整的包名和類名 ·實例化Class類對象 ·獲

    java虛擬機

    image 種類 棧的操作 cms gc float align pool 不定 記錄 註: 此篇文章可以算是讀《深入理解Java虛擬機:JVM高級特性與最佳實踐》一書後的筆記總結加上我個人的心得看法。 整體總結順序沿用了書中順序,但多處章節用自己的話或直白或擴展的進行

    java 常量池

    例如 ava color str blog 註意 如果 .cn 運行 參考資料:http://www.cnblogs.com/holos/p/6603379.html 註意: 1.首先,我們平時在討論字符串新建問題時所說的常量池其實指的是全局字符串常量池。並不是運行時常量池

    Java虛擬機——JVM常見問題總結

    can 語言 嘗試 意思 是把 fff rom com serial 【正文】 聲明:本文只是做一個總結,有關jvm的詳細知識可以參考之前的系列文章,尤其是那篇:Java虛擬機詳解04—-GC算法和種類。那篇文章和本文是面試時的重點。 面試必問關鍵詞:JVM垃圾回收、類加載

    java設計模式

    創建對象 single 代理模式 man server pre factory 行為型模式 代理 設計模式: 設計模式(Design Pattern)是一套被反復使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結,使用設計模式是為了可重用代碼、讓代碼更容易被他人理解並且

    Java Static關鍵字

    會有 java 非靜態屬性 指向 style 關於 區域 當前 為什麽 先思考兩個問題: 1.為什麽要使用Static關鍵字? 2.加了Static關鍵字修飾後會有什麽不同? Static 一.為什麽要使用Static關鍵字? 這裏摘錄一下《Java編程思想(第四版)