HttpClient系列-基礎知識(二)

簡述

今天開始介紹下基礎知識二,主要內容是請求的中斷、重定向。json

中斷請求

如何使用Apache HttpClient 4取消HTTP請求。bash

這對於可能長時間運行的請求或大型下載文件尤爲有用,不然這些請求將沒必要要地消耗帶寬和鏈接。app

停止GET請求

要停止正在進行的請求,客戶端能夠簡單地使用:ui

request.abort();
複製代碼

這將確保客戶端沒必要使用整個請求來釋放鏈接:spa

@Test
public void test() 
  throws ClientProtocolException, IOException {
    HttpClient instance = HttpClients.custom().build();
    HttpGet request = new HttpGet(SAMPLE_URL);
    HttpResponse response = instance.execute(request);
 
    try {
        System.out.println(response.getStatusLine());
        request.abort();
    } finally {
        response.close();
    }
}
複製代碼

禁止重定向

默認狀況下,遵循HTTP規範,HttpClient將自動遵循重定向code

對於某些用例來講,這多是徹底沒問題的,但確定會出現不須要的用例 。如今咱們將看看如何更改默認行爲並中止重定向。get

在HttpClient 4.3以前string

在舊版本的HttpClient(4.3以前)中,咱們能夠配置客戶端使用重定向執行的操做,以下所示:it

@Test
public void test() 
  throws ClientProtocolException, IOException {
    DefaultHttpClient instance = new DefaultHttpClient();
 
    HttpParams params = new BasicHttpParams();
    params.setParameter(ClientPNames.HANDLE_REDIRECTS, false);
    // HttpClientParams.setRedirecting(params, false); // alternative

    HttpGet httpGet = new HttpGet("http://localhost:8080");
    httpGet.setParams(params);
    CloseableHttpResponse response = instance.execute(httpGet);
 
    assertThat(response.getStatusLine().getStatusCode(), equalTo(301));
複製代碼

請注意可用於配置重定向行爲的備用API,而不使用設置實際原始http.protocol.handle-redirects參數:io

HttpClientParams.setRedirecting(params, false);
複製代碼

另請注意,若是禁用了後續重定向,咱們如今能夠檢查Http響應狀態代碼是否確實是301 Moved Permaned - 應該是這樣。

在HttpClient 4.3以後

HttpClient 4.3引入了更清晰,更高級的API來構建和配置客戶端:

@Test
public void test() 
  throws ClientProtocolException, IOException {
    HttpClient instance = HttpClientBuilder.create().disableRedirectHandling().build();
HttpResponse response = instance.execute(new HttpGet("http://localhost:8080"));
    assertThat(response.getStatusLine().getStatusCode(), equalTo(301));

複製代碼

PS:新API使用此重定向行爲配置整個客戶端 - 而不單單是單個請求。

自定義Hearder

根據要求設置Hearder(4.3及以上)

HttpClient 4.3引入了一種構建請求的新API--RequestBuilder。要設置Header,咱們將在構建器上使用setHeader方法:

HttpClient client = HttpClients.custom().build();
HttpUriRequest request = RequestBuilder.get()
  .setUri(SAMPLE_URL)
  .setHeader(HttpHeaders.CONTENT_TYPE, "application/json")
  .build();
client.execute(request);
複製代碼

根據要求設置Hearder(4.3以前)

在HttpClient 4.3以前的版本中,咱們能夠在請求上使用簡單的setHeader調用設置任何自定義標頭:

HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet(SAMPLE_URL);
request.setHeader(HttpHeaders.CONTENT_TYPE, "application/json");
client.execute(request);
複製代碼

咱們能夠看到,咱們將Content-Type直接在請求上設置爲自定義值--JSON。

在客戶端上設置默認標頭

咱們還能夠將其配置爲客戶端自己的默認標頭,而不是在每一個請求上設置標頭:

Header header = new BasicHeader(HttpHeaders.CONTENT_TYPE, "application/json");
List<Header> headers = Lists.newArrayList(header);
HttpClient client = HttpClients.custom().setDefaultHeaders(headers).build();
HttpUriRequest request = RequestBuilder.get().setUri(SAMPLE_URL).build();
client.execute(request);
複製代碼

當全部請求的標頭須要相同時(例如自定義應用程序標頭),這很是有用。

小結

本文介紹了HttpClient中的中斷請求,禁止跟蹤HTTP重定向,自定義Header知識,但願對你有所幫助。

相關文章
相關標籤/搜索