Contents

apache httpclient 防止遵循重定向

1. 概述

在本文中,我将展示如何配置 Apache HttpClient 以停止跟踪重定向

默认情况下,遵循 HTTP 规范,HttpClient 将自动遵循重定向

对于某些用例,这可能完全没问题,但肯定有一些用例不需要这样做——我们现在将研究如何更改默认行为并停止跟踪重定向

2. 不要跟随重定向

2.1. HttpClient 4.3 之前

在旧版本的 Http 客户端(4.3 之前)中,我们可以配置客户端对重定向的操作,如下所示:

@Test
public void givenRedirectsAreDisabled_whenConsumingUrlWhichRedirects_thenNotRedirected() 
  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://t.co/I5YYd9tddw");
    httpGet.setParams(params);
    CloseableHttpResponse response = instance.execute(httpGet);
    assertThat(response.getStatusLine().getStatusCode(), equalTo(301));
}

请注意可用于配置重定向行为的替代 API,而无需设置实际的原始http.protocol.handle-redirects参数

HttpClientParams.setRedirecting(params, false);

另请注意,在禁用跟随重定向的情况下,我们现在可以检查 Http 响应状态代码是否确实是301 Moved Permanently - 应该是这样。

2.2. HttpClient 4.3 之后

HttpClient 4.3 引入了更简洁、更高级的 API来构建和配置客户端:

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

请注意,新 API 使用此重定向行为配置整个客户端 - 而不仅仅是单个请求。