如何禁用来自 apache httpclient 4 的默认请求标头?

我正在使用apache common 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)删除这些标题,但它不起作用。你能告诉我怎么做吗?

谢谢


答案 1

如果你调用 ,你将有一个 httpClientBuilder。httpClientBuilder对默认标头有很多配置,这将用于制作拦截器(例如:RequestAcceptEncoding)。HttpClientBuilder.create()

例如,实现 HttpRequestInterceptor 的 RequestAcceptEncoding 在调用 HttpProcessor.process() 时生成标头。httpProcessor.process() 将在调用之前被调用Accept-Encoding: gzip,deflatefinal CloseableHttpResponse response = this.requestExecutor.execute(route, request, context, execAware);

您可以在 org.apache.http.impl.execchain.ProtocolExec of httpclient-4.3.6 line 193 上看到此代码。

如果要删除 ,请按如下所示调用。Accept-Encoding: gzip,deflateHttpClientBuilder.disableContentCompression()

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

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

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


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

上面的代码片段演示了如何使用空(no-op)协议处理器创建 HttpClient 实例,这保证了不会将任何请求标头添加到此类客户端执行的传出消息中


推荐