2014-04-25 38 views
11

我使用apache常见httpclient 4.3.3来提出http 1.0请求。这里是我提出请求如何禁用来自Apache httpclient 4的默认请求标头?

HttpClient client = HttpClientBuilder.create().build(); 
HttpPost post = new HttpPost(url); 
post.setProtocolVersion(new ProtocolVersion("HTTP", 1, 0)); 

// trying to remove default headers but it doesn't work 
post.removeHeaders("User-Agent"); 
post.removeHeaders("Accept-Encoding"); 
post.removeHeaders("Connection"); 

post.setEntity(new ByteArrayEntity(ba)); 

HttpResponse response = client.execute(post); 

不过,我可以看到,有自动添加到我的请求到服务器一样

Connection: Keep-Alive 
User-Agent: Apache-HttpClient/4.3.3 (java 1.5) 
Accept-Encoding: gzip,deflate 

其他头我怎么能告诉HttpClient的不包括任何其他头?我试图用post.removeHeaders(xxxx)删除这些头,但它不起作用。你能告诉我如何?

感谢,

回答

0

我想你可以用client.addRequestInterceptor()
(更好)
删除头添加到请求(RequestUserAgentRequestDefaultHeadersRequestClientConnControlRequestAcceptEncoding所有拦截器添加您的HttpRequestInterceptor实施, ...)。

卸下它们也容易:

client.removeRequestInterceptorByClass(RequestAcceptEncoding.class); 
+0

我看不到方法removeRequestInterceptorByClass(xxxx)为HttpClient。我可以在哪里设置该方法? –

+2

https://hc.apache.org/httpcomponents-client-4.3.x/httpclient/apidocs/org/apache/http/impl/client/AbstractHttpClient.html#removeRequestInterceptorByClass(java.lang.Class)但是我看到了整个API已弃用4.3 4.3 – Stephan

5
CloseableHttpClient hc = HttpClients.custom() 
     .setHttpProcessor(HttpProcessorBuilder.create().build()) 
     .build(); 

上面的代码段演示了如何用空(无操作)协议处理器,这保证了没有请求头将创建一个HttpClient的实例永远被添加到这样的客户端执行的传出消息

+2

这段代码的一些解释很好。 – guerda

+1

我不确定这里有什么样的额外解释。上面的代码片段演示了如何使用空(无操作)协议处理器创建HttpClient实例,从而保证不会将请求头添加到由此类客户端执行的传出消息中 – oleg

+0

此方法将删除所有头文件!你必须配置这个 – z0mb1ek

8

如果您致电HttpClientBuilder.create(),您将有一个httpClientBuilder。 而且httpClientBuilder有很多默认头文件的配置,并且这将用于制作拦截器(例如:RequestAcceptEncoding)。

例如,实现HttpRequestInterceptor的RequestAcceptEncoding在调用HttpProcessor.process()时产生Accept-Encoding: gzip,deflate头。 而httpProcessor.process()将被调用只是调用 final CloseableHttpResponse response = this.requestExecutor.execute(route, request, context, execAware);

之前,您可以在HttpClient的-4.3.6线193

如果org.apache.http.impl.execchain.ProtocolExec看到这个代码你想删除Accept-Encoding: gzip,deflate,请拨打HttpClientBuilder.disableContentCompression(),如下所示。

HttpClient client = HttpClientBuilder.create().disableContentCompression().build(); 

总之,HttpClientBuilder有很多标志来禁用/启用HttpRequestInterceptor。如果您禁用/启用这些HttpRequestInterceptor,则可以排除/包含默认标题。

对不起我的英文不好,希望你明白我的意思。

0

在HttpClient完成修改请求后,您希望在最后完成“清理”。你可以通过在HttpClientBuilder上调用addInterceptorLast来做到这一点,如下所示。

HttpClient client = HttpClientBuilder.create().addInterceptorLast( 
         new HttpRequestInterceptor() { 
          public void process(HttpRequest request, HttpContext context){ 
           request.removeHeaders("Host"); 
           request.removeHeaders("Connection"); 
          } 
         } 
       ).build(); 

我创建了一个实现HttpRequestInterceptor的匿名类。在发送请求之前,请完成所需的任何标头修改,然后将其放入处理方法中。

相关问题