如何使用Apache HttpClient 4取消HTTP请求。
这对于可能长时间运行的请求或大型下载文件尤其有用,否则这些请求将不必要地消耗带宽和连接。
要中止正在进行的请求,客户端可以简单地使用:
request.abort(); 复制代码
这将确保客户端不必使用整个请求来释放连接:
@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将自动遵循重定向
对于某些用例来说,这可能是完全没问题的,但肯定会出现不需要的用例 。现在我们将看看如何更改默认行为并停止重定向。
在旧版本的HttpClient(4.3之前)中,我们可以配置客户端使用重定向执行的操作,如下所示:
@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参数:
HttpClientParams.setRedirecting(params, false); 复制代码
另请注意,如果禁用了后续重定向,我们现在可以检查Http响应状态代码是否确实是301 Moved Permaned - 应该是这样。
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使用此重定向行为配置整个客户端 - 而不仅仅是单个请求。
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); 复制代码
在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知识,希望对你有所帮助。