apache httpclient 防止遵循重定向
Contents
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 使用此重定向行为配置整个客户端 - 而不仅仅是单个请求。