如何从apache httpclient 4中禁用默认请求标头?

时间:2014-04-25 11:02:35

标签: java apache-httpclient-4.x apache-commons-httpclient

我正在使用apache常见的httpclient 4.3.3来发出http 1.0请求。以下是我提出请求的方式

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)删除那些标题,但它不起作用。你能告诉我怎么样吗?

谢谢,

4 个答案:

答案 0 :(得分:10)

如果您致电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,则可以排除/包含默认标头。

抱歉我的英语不好,希望你明白我的意思。

答案 1 :(得分:6)

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

上面的代码片段演示了如何使用空(无操作)协议处理器创建HttpClient实例,这样可确保不会将任何请求标头添加到此类客户端执行的外发消息中

答案 2 :(得分:2)

你想做你的清理'最后,在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的匿名类。在发送请求之前,请执行您需要执行的任何标头修改,并将它们放入过程方法中。

答案 3 :(得分:0)

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

删除它们也很容易:

client.removeRequestInterceptorByClass(RequestAcceptEncoding.class);