HttpClient入門

        HttpClient 是 Apache Jakarta Common 下的子項目,可以用來提供高效的、最新的、功能豐富的支持 HTTP 協議的客戶端編程工具包,並且它支持 HTTP 協議最新的版本和建議。本文首先介紹 HTTPClient,然後根據作者實際工作經驗給出了一些常見問題的解決方法。


HttpClient 基本功能的使用

GET 方法

使用 HttpClient 需要以下 6 個步驟:

1. 創建 HttpClient 的實例

2. 創建某種連接方法的實例,在這裏是 GetMethod。在 GetMethod 的構造函數中傳入待連接的地址

3. 調用第一步中創建好的實例的 execute 方法來執行第二步中創建好的 method 實例

4. 讀 response

5. 釋放連接。無論執行方法是否成功,都必須釋放連接

6. 對得到後的內容進行處理

根據以上步驟,我們來編寫用GET方法來取得某網頁內容的代碼。

  • 大部分情況下 HttpClient 默認的構造函數已經足夠使用。

              HttpClient httpClient = new HttpClient();

  • 創建GET方法的實例。在GET方法的構造函數中傳入待連接的地址即可。用GetMethod將會自動處理轉發過程,如果想要把自動處理轉發過程去掉的話,可以調用方法setFollowRedirects(false)。

              GetMethod getMethod = new GetMethod("http://www.ibm.com/");

  • 調用實例httpClient的executeMethod方法來執行getMethod。由於是執行在網絡上的程序,在運行executeMethod方法的時候,需要處理兩個異常,分別是HttpException和IOException。引起第一種異常的原因主要可能是在構造getMethod的時候傳入的協議不對,比如不小心將"http"寫成"htp",或者服務器端返回的內容不正常等,並且該異常發生是不可恢復的;第二種異常一般是由於網絡原因引起的異常,對於這種異常 (IOException),HttpClient會根據你指定的恢復策略自動試着重新執行executeMethod方法。HttpClient的恢復策略可以自定義(通過實現接口HttpMethodRetryHandler來實現)。通過httpClient的方法setParameter設置你實現的恢復策略,本文中使用的是系統提供的默認恢復策略,該策略在碰到第二類異常的時候將自動重試3次。executeMethod返回值是一個整數,表示了執行該方法後服務器返回的狀態碼,該狀態碼能表示出該方法執行是否成功、需要認證或者頁面發生了跳轉(默認狀態下GetMethod的實例是自動處理跳轉的)等。

//設置成了默認的恢復策略,在發生異常時候將自動重試3次,在這裏你也可以設置成自定義的恢復策略

getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, 

        new DefaultHttpMethodRetryHandler()); 

//執行getMethod

int statusCode = client.executeMethod(getMethod);

if (statusCode != HttpStatus.SC_OK) {

  System.err.println("Method failed: " + getMethod.getStatusLine());

}

  • 在返回的狀態碼正確後,即可取得內容。取得目標地址的內容有三種方法:第一種,getResponseBody,該方法返回的是目標的二進制的byte流;第二種,getResponseBodyAsString,這個方法返回的是String類型,值得注意的是該方法返回的String的編碼是根據系統默認的編碼方式,所以返回的String值可能編碼類型有誤,在本文的"字符編碼"部分中將對此做詳細介紹;第三種,getResponseBodyAsStream,這個方法對於目標地址中有大量數據需要傳輸是最佳的。在這裏我們使用了最簡單的getResponseBody方法。
            byte[] responseBody = method.getResponseBody();
  • 釋放連接。無論執行方法是否成功,都必須釋放連接。
            method.releaseConnection();
  • 處理內容。在這一步中根據你的需要處理內容,在例子中只是簡單的將內容打印到控制檯。
   System.out.println(new String(responseBody));

下面是程序的完整代碼,這些代碼也可在附件中的test.GetSample中找到。

package test;

import java.io.IOException;

import org.apache.commons.httpclient.*;

import org.apache.commons.httpclient.methods.GetMethod;

import org.apache.commons.httpclient.params.HttpMethodParams;

public class GetSample{

  public static void main(String[] args) {

  //構造HttpClient的實例

  HttpClient httpClient = new HttpClient();

  //創建GET方法的實例

  GetMethod getMethod = new GetMethod("http://www.ibm.com");

  //使用系統提供的默認的恢復策略

  getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,

    new DefaultHttpMethodRetryHandler());

  try {

   //執行getMethod

   int statusCode = httpClient.executeMethod(getMethod);

   if (statusCode != HttpStatus.SC_OK) {

    System.err.println("Method failed: "

      + getMethod.getStatusLine());

   }

   //讀取內容 

   byte[] responseBody = getMethod.getResponseBody();

   //處理內容

   System.out.println(new String(responseBody));

  } catch (HttpException e) {

   //發生致命的異常,可能是協議不對或者返回的內容有問題

   System.out.println("Please check your provided http address!");

   e.printStackTrace();

  } catch (IOException e) {

   //發生網絡異常

   e.printStackTrace();

  } finally {

   //釋放連接

   getMethod.releaseConnection();

  }

 }

}

發佈了10 篇原創文章 · 獲贊 5 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章