HttpClient 教程 (五)

來源:互聯網
上載者:User
第五章 HTTP用戶端服務5.1 HttpClient門面

HttpClient介面代表了最重要的HTTP請求執行的契約。它沒有在請求執行處理上強加限制或特殊細節,而在串連管理,狀態管理,認證和處理重新導向到具體實現上留下了細節。這應該使得很容易使用額外的功能,比如響應內容緩衝來裝飾介面。

DefaultHttpClient是HttpClient介面的預設實現。這個類扮演了很多特殊使用者程式或策略介面實現負責處理特定HTTP協議方面,比如重新導向到處理認證或做出關於串連持久化和保持活動的期間決定的門面。這使得使用者可以選擇使用定製,具體程式等來替換某些方面預設實現。

DefaultHttpClient httpclient = new DefaultHttpClient();httpclient.setKeepAliveStrategy(new DefaultConnectionKeepAliveStrategy() {@Overridepublic long getKeepAliveDuration(HttpResponse response,HttpContext context) {long keepAlive = super.getKeepAliveDuration(response, context);if (keepAlive == -1) {// 如果keep-alive值沒有由伺服器明確設定,那麼保持串連持續5秒。keepAlive = 5000;}return keepAlive;}});

DefaultHttpClient也維護一組協議攔截器,意在處理即將離開的請求和即將到達的響應,而且提供管理那些攔截器的方法。新的協議攔截器可以被引入到協議處理器鏈中,或在需要時從中移除。內部的協議攔截器儲存在一個簡單的java.util.ArrayList中。它們以被加入到list中的自然順序來執行。

DefaultHttpClient httpclient = new DefaultHttpClient();httpclient.removeRequestInterceptorByClass(RequestUserAgent.class);httpclient.addRequestInterceptor(new HttpRequestInterceptor() {public void process(HttpRequest request, HttpContext context)throws HttpException, IOException {request.setHeader(HTTP.USER_AGENT, "My-own-client");}});

DefaultHttpClient是安全執行緒的。建議相同的這個類的執行個體被重用於多個請求的執行。當一個DefaultHttpClient執行個體不再需要而且要脫離範圍時,和它關聯的連線管理員必須調用ClientConnectionManager#shutdown()方法關閉。

HttpClient httpclient = new DefaultHttpClient();// 做些有用的事httpclient.getConnectionManager().shutdown();
5.2 HttpClient參數這些是可以用於定製預設HttpClient實現行為的參數:
  • 'http.protocol.handle-redirects':定義了重新導向是否應該自動處理。這個參數期望得到一個java.lang.Boolean類型的值。如果這個參數沒有被設定,HttpClient將會自動處理重新導向。
  • 'http.protocol.reject-relative-redirect':定義了是否相對的重新導向應該被拒絕。HTTP規範需要位置值是一個絕對URI。這個參數期望得到一個java.lang.Boolean類型的值。如果這個參數沒有被設定,那麼就允許相對重新導向。
  • 'http.protocol.max-redirects':定義了要遵循重新導向的最大數量。這個重新導向數位限制意在防止由破碎的伺服器端指令碼引發的死迴圈。這個參數期望得到一個java.lang.Integer類型的值。如果這個參數沒有被設定,那麼只允許不多餘100次重新導向。
  • 'http.protocol.allow-circular-redirects':定義環形重新導向(重新導向到相同路徑)是否被允許。HTTP規範在環形重新導向沒有足夠清晰的允許表述,因此這作為可選的是可以開啟的。這個參數期望得到一個java.lang.Boolean類型的值。如果這個參數沒有被設定,那麼環形重新導向就不允許。
  • 'http.connection-manager.factory-class-name':定義了預設的ClientConnectionManager實現的類型。這個參數期望得到一個java.lang.String類型的值。如果這個參數沒有被設定,對於每個預設的將使用SingleClientConnManager。
  • 'http.virtual-host':定義了在頭部資訊Host中使用的虛擬機器主機名稱,來代替物理主機名稱。這個參數期望得到一個HttpHost類型的值。如果這個參數沒有被設定,那麼將會使用目標主機的名稱或IP地址。
  • 'http.default-headers':定義了每次請求預設發送的頭部資訊。這個參數期望得到一個包含Header對象的java.util.Collection類型值。
  • 'http.default-host':定義了預設主控件。如果目標主機沒有在請求URI(相對URI)中明確指定,那麼就使用預設值。這個參數期望得到一個HttpHost類型的值。
5.3 自動重新導向處理

HttpClient處理所有類型的自動重新導向,除了那些由HTTP規範明令禁止的,比如需要使用者幹預的。參考其它(狀態代碼303)POST和PUT請求重新導向轉換為由HTTP規範需要的GET請求。

5.4 HTTP用戶端和執行內容

DefaultHttpClient將HTTP請求視為不變的對象,也從來不會假定在請求執行期間改變。相反,它建立了一個原請求對象私人的可變副本,副本的屬性可以基於執行內容來更新。因此,如目標主鍵和請求URI的final類型的請求參數可以在請求執行之後,由檢查本地HTTP上下文來決定。

DefaultHttpClient httpclient = new DefaultHttpClient();HttpContext localContext = new BasicHttpContext();HttpGet httpget = new HttpGet("http://localhost:8080/");HttpResponse response = httpclient.execute(httpget, localContext);HttpHost target = (HttpHost) localContext.getAttribute(ExecutionContext.HTTP_TARGET_HOST);HttpUriRequest req = (HttpUriRequest) localContext.getAttribute(ExecutionContext.HTTP_REQUEST);System.out.println("Target host: " + target);System.out.println("Final request URI: " + req.getURI());System.out.println("Final request method: " + req.getMethod());

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.