1. 程式人生 > >HttpClient 4.3詳細教程

HttpClient 4.3詳細教程

1.1. 請求執行

HttpClient最基本的功能就是執行Http方法。一個Http方法的執行涉及到一個或者多個Http請求/Http響應的互動,通常這個過程都會自動被HttpClient處理,對使用者透明。使用者只需要提供Http請求物件,HttpClient就會將http請求傳送給目標伺服器,並且接收伺服器的響應,如果http請求執行不成功,httpclient就會丟擲異樣。

下面是個很簡單的http請求執行的例子:

  1. CloseableHttpClient httpclient = HttpClients.createDefault();  
  2. HttpGet httpget = new
     HttpGet("http://localhost/");  
  3. CloseableHttpResponse response = httpclient.execute(httpget);  
  4. try {  
  5.     <...>  
  6. finally {  
  7.     response.close();  
  8. }  

1.1.1. HTTP請求

所有的Http請求都有一個請求行(request line),包括方法名、請求的URI和Http版本號。

HttpClient支援HTTP/1.1這個版本定義的所有Http方法:GET,HEAD,POST,PUT,DELETE

,TRACEOPTIONS。對於每一種http方法,HttpClient都定義了一個相應的類:HttpGetHttpHeadHttpPostHttpPutHttpDeleteHttpTraceHttpOpquertions。

Request-URI即統一資源定位符,用來標明Http請求中的資源。Http request URIs包含協議名、主機名、主機埠(可選)、資源路徑、query(可選)和片段資訊(可選)。

  1. HttpGet httpget = new HttpGet(  
  2.      "http://www.google.com/search?hl=en&q=httpclient&btnG=Google+Search&aq=f&oq="
    );  

HttpClient提供URIBuilder工具類來簡化URIs的建立和修改過程。

  1. URI uri = new URIBuilder()  
  2.         .setScheme("http")  
  3.         .setHost("www.google.com")  
  4.         .setPath("/search")  
  5.         .setParameter("q""httpclient")  
  6.         .setParameter("btnG""Google Search")  
  7.         .setParameter("aq""f")  
  8.         .setParameter("oq""")  
  9.         .build();  
  10. HttpGet httpget = new HttpGet(uri);  
  11. System.out.println(httpget.getURI());  

上述程式碼會在控制檯輸出:

  1. http://www.google.com/search?q=httpclient&btnG=Google+Search&aq=f&oq=

1.1.2. HTTP響應

伺服器收到客戶端的http請求後,就會對其進行解析,然後把響應發給客戶端,這個響應就是HTTP response.HTTP響應第一行是協議版本,之後是數字狀態碼和相關聯的文字段。

  1. HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1,   
  2. HttpStatus.SC_OK, "OK");  
  3. System.out.println(response.getProtocolVersion());  
  4. System.out.println(response.getStatusLine().getStatusCode());  
  5. System.out.println(response.getStatusLine().getReasonPhrase());  
  6. System.out.println(response.getStatusLine().toString());  

上述程式碼會在控制檯輸出:
  1. HTTP/1.1
  2. 200
  3. OK  
  4. HTTP/1.1200 OK  

1.1.3. 訊息頭

一個Http訊息可以包含一系列的訊息頭,用來對http訊息進行描述,比如訊息長度,訊息型別等等。HttpClient提供了方法來獲取、新增、移除、列舉訊息頭。

  1. HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1,   
  2.     HttpStatus.SC_OK, "OK");  
  3. response.addHeader("Set-Cookie",   
  4.     "c1=a; path=/; domain=localhost");  
  5. response.addHeader("Set-Cookie",   
  6.     "c2=b; path=\"/\", c3=c; domain=\"localhost\"");  
  7. Header h1 = response.getFirstHeader("Set-Cookie");  
  8. System.out.println(h1);  
  9. Header h2 = response.getLastHeader("Set-Cookie");  
  10. System.out.println(h2);  
  11. Header[] hs = response.getHeaders("Set-Cookie");  
  12. System.out.println(hs.length);  

上述程式碼會在控制檯輸出:
  1. Set-Cookie: c1=a; path=/; domain=localhost  
  2. Set-Cookie: c2=b; path="/", c3=c; domain="localhost"
  3. 2

最有效的獲取指定型別的訊息頭的方法還是使用HeaderIterator介面。

  1. HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1,   
  2.     HttpStatus.SC_OK, "OK");  
  3. response.addHeader("Set-Cookie",   
  4.     "c1=a; path=/; domain=localhost");  
  5. response.addHeader("Set-Cookie",   
  6.     "c2=b; path=\"/\", c3=c; domain=\"localhost\"");  
  7. HeaderIterator it = response.headerIterator("Set-Cookie");  
  8. while (it.hasNext()) {  
  9.     System.out.println(it.next());  
  10. }  

上述程式碼會在控制檯輸出:

  1. Set-Cookie: c1=a; path=/; domain=localhost  
  2. Set-Cookie: c2=b; path="/", c3=c; domain="localhost"

HeaderIterator也提供非常便捷的方式,將Http訊息解析成單獨的訊息頭元素。

  1. HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1,   
  2.     HttpStatus.SC_OK, "OK");  
  3. response.addHeader("Set-Cookie",   
  4.     "c1=a; path=/; domain=localhost");  
  5. response.addHeader("Set-Cookie",   
  6.     "c2=b; path=\"/\", c3=c; domain=\"localhost\"");  
  7. HeaderElementIterator it = new BasicHeaderElementIterator(  
  8.     response.headerIterator("Set-Cookie"));  
  9. while (it.hasNext()) {  
  10.     HeaderElement elem = it.nextElement();   
  11.     System.out.println(elem.getName() + " = " + elem.getValue());  
  12.     NameValuePair[] params = elem.getParameters();  
  13.     for (int i = 0; i < params.length; i++) {  
  14.         System.out.println(" " + params[i]);  
  15.     }  
  16. }  

上述程式碼會在控制檯輸出:

  1. c1 = a  
  2. path=/  
  3. domain=localhost  
  4. c2 = b  
  5. path=/  
  6. c3 = c  
  7. domain=localhost  

1.1.4. HTTP實體

Http訊息可以攜帶http實體,這個http實體既可以是http請求,也可以是http響應的。Http實體,可以在某些http請求或者響應中發現,但不是必須的。Http規範中定義了兩種包含請求的方法:POST和PUT。HTTP響應一般會包含一個內容實體。當然這條規則也有異常情況,如Head方法的響應,204沒有內容,304沒有修改或者205內容資源重置。

HttpClient根據來源的不同,劃分了三種不同的Http實體內容。

  • streamed流式: 內容是通過流來接受或者在執行中產生。特別是,streamed這一類包含從http響應中獲取的實體內容。一般說來,streamed實體是不可重複的。
  • self-contained自我包含式:內容在記憶體中或通過獨立的連線或其它實體中獲得。self-contained型別的實體內容通常是可重複的。這種型別的實體通常用於關閉http請求。
  • wrapping包裝式: 這種型別的內容是從另外的http實體中獲取的。

當從Http響應中讀取內容時,上面的三種區分對於連線管理器來說是非常重要的。對於由應用程式建立而且只使用HttpClient傳送的請求實體,streamed和self-contained兩種型別的不同就不那麼重要了。這種情況下,建議考慮如streamed流式這種不能重複的實體,和可以重複的self-contained自我包含式實體。

1.1.4.1. 可重複的實體

一個實體是可重複的,也就是說它的包含的內容可以被多次讀取。這種多次讀取只有self contained(自包含)的實體能做到(比如ByteArrayEntity或者StringEntity)。

1.1.4.2. 使用Http實體

由於一個Http實體既可以表示二進位制內容,又可以表示文字內容,所以Http實體要支援字元編碼(為了支援後者,即文字內容)。

當需要執行一個完整內容的Http請求或者Http請求已經成功,伺服器要傳送響應到客戶端時,Http實體就會被建立。

相關推薦

HttpClient 4.3詳細教程

1.1. 請求執行 HttpClient最基本的功能就是執行Http方法。一個Http方法的執行涉及到一個或者多個Http請求/Http響應的互動,通常這個過程都會自動被HttpClient處理,對使用者透明。使用者只需要提供Http請求物件,HttpClient就會將http請求傳送給目標

從零開始搭建系統4.3——詳細設計

.cn 系統 logs 4.3 .com htm 詳細設計 設計 搭建 從零開始搭建系統4.3——詳細設計從零開始搭建系統4.3——詳細設計

VS2015 專業版安裝以及OpenCV3.4.3詳細配置

1,vs2015專業版的安裝 選擇路徑,自定義安裝,只需要C++,預設安裝下去 解決安裝好後,新建工程沒有WIN32選項:找到目錄C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE下的devenv.exe,執行這個

HttpClient 4 3 6 使用MultipartEntityBuilder實現類似form表單提交方式的檔案上傳

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Linux搭建lamp(Apache+PHP+Mysql環境)centos7.4詳細教程

簡介 根據自己的產品對CPU、頻寬、記憶體等硬體配置的要求,選擇對應的配置,除錯期間我們一般選擇1核1G 1M,預設選擇40G雲盤。這樣一個月也就幾十塊的服務端成本。產品上線後,我們再根據使用者匯入規模,初期選擇了4核8G 10M 的配置。 1、確認centos版本 [[email&

HttpClient 4.3連接池參數配置及源碼解讀

efault sgid adapt 讀取輸入 lag 原則 機器 syn 因此 目前所在公司使用HttpClient 4.3.3版本發送Rest請求,調用接口。最近出現了調用查詢接口服務慢的生產問題,在排查整個調用鏈可能存在的問題時(從客戶端發起Http請求->ES

httppost請求json並處理返回結果respone資料 用的是httpclient-4.3.5.jar和httpcore-4.3.3.

package com; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.ClientProtocolEx

Apache HttpClient 4 3開發指南

                《Apache HttpClient 4.3開發指南》一、概述Apache HttpClient 4系列已經發布很久了,但由於它與HttpClient 3.x版本完全不相容,以至於業內採用此庫的公司較少,在網際網路上也少有相關的文件資料分享。本文旨在寫一個簡要的Apache H

HttpClient 4.3.3 cookie rejected的解決辦法

在用HttpClient 的最新版本4.3.3寫一個網站註冊時,出現了cookie rejected的問題。就是拒絕寫入cookie,雖然沒影響最終的註冊結果,但問題總需要解決的。於是在搜尋了網上的解決辦法,發現那都是過去的舊版本的解決辦法。新版本的4.3.3沒有相關的解決辦法不過總算知道那是cookie的

HttpClient 4.3連線池引數配置及原始碼解讀

    目前所在公司使用HttpClient 4.3.3版本傳送Rest請求,呼叫介面。最近出現了呼叫查詢介面服務慢的生產問題,在排查整個呼叫鏈可能存在的問題時(從客戶端發起Http請求->ESB->服務端處理請求,查詢資料並返回),發現原本的HttpClien

ubuntu下安裝opencv3.3(詳細教程

opencv建議安裝3.3及以後版本吧,對以後想要深度學習,神經網路都很方便要注意的一點是一定要先安裝CUDA後安裝opencv,否則不能使用GPU,很麻煩先安裝一下依賴吧,很多,還是全一點好,要比到時候報錯好很多    sudo apt-get install --assu

Qt5.11.0+OpenCV3.4.3配置教程

關於詳細配置,可以參考: 本文主要是闡述,在編譯過程遇到的問題及解決方法。 1、 D:\opencv-3.4.3\modules\videoio\src\cap_msmf.cpp:143:28: error: using invalid fi eld '{a

基於HttpClient 4.3的可訪問自簽名HTTPS站點的新版工具類

本文出處:http://blog.csdn.net/chaijunkun/article/details/40145685,轉載請註明。由於本人不定期會整理相關博文,會對相應內容作出完善。因此強烈建議在原始出處檢視此文。HttpClient在當今Java應用中的位置越來越重要

CentOS 7.3下Zabbix 4.0監控搭建過程超詳細教程

Zabbix是一個高度整合的企業級開源網路監控解決方案,與Cacti、nagios類似,提供分散式監控以及集中的web管理介面。zabbix具備常見商業監控軟體所具備的功能,例如主機效能監控,網路裝置效能監控,資料庫效能監控,ftp等通用協議的監控,能夠靈活利用可定製警告機制,允許使用者對事件傳送基於E-ma

詳細Zabbix3.4部署安裝教程—基於Centos7.3,內附PHP,Nginx,MySQL等架設教程

第一步,下載Zabbix3.4原始碼包,編譯安裝    1.1原始碼包下載# wget -O zabbix-3.4.9.tar.gz http://sourceforge.net/projects/zabbix/files/ZABBIX%20Latest%20Stable/3

Git詳細教程(3)---結合gitHub使用

之間 方便 結果 最新 strong ini 編輯 repos github 1.GitHub的基本使用 GitHub就是一個網站,本身是基於Git,可以完成版本控制,可以托管代碼。 英文版的。 在使用GitHub之前,首先需要註冊一個賬號。 登錄,就可以完成相關的

httpclient新舊版本分割點4.3

redirect xtra xpl 包括 execute syntax target exec cli 從這個版本開始,httpclient的api發生了一次重大調整。主要包括如下:Release 4.3 Final ------------------- This is

node.js零基礎詳細教程(4):node.js事件機制、node異步IO操作

nod server nbsp node i++ 兩個 con 錯誤 定時器 第四章 建議學習時間3小時 課程共10章 學習方式:詳細閱讀,並手動實現相關代碼 學習目標:此教程將教會大家 安裝Node、搭建服務器、express、mysql、mongodb、編寫後臺業務邏

CentOS6.5安裝MySQL5.7詳細教程(本人6.3也行)

過程 centos 6 yum安裝 -1 兩個文件 bin gre 開機 bsp 本文參考http://www.cnblogs.com/lzj0218/p/5724446.html 主要參考博文: https://segmentfault.com/a/119000000

centos7.4內核從3.10升級到4.14詳細步驟

release -- reboot cal .org div roo rpm -i 由於我們的docker學習中的Overlay需要內核版本在3.12+,所以在安裝完centos7.4之後要進行內核升級,下面是升級步驟:1、導入keyrpm --import https:/