今天開始介紹下基礎知識二,主要內容是請求的中斷、重定向。json
如何使用Apache HttpClient 4取消HTTP請求。bash
這對於可能長時間運行的請求或大型下載文件尤爲有用,不然這些請求將沒必要要地消耗帶寬和鏈接。app
要停止正在進行的請求,客戶端能夠簡單地使用: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(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知識,但願對你有所幫助。