Sea*_*yen 13 java apache-commons-httpclient apache-httpclient-4.x
我使用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);
Run Code Online (Sandbox Code Playgroud)
但是,我可以看到有其他标头自动添加到我的服务器请求中
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.3.3 (java 1.5)
Accept-Encoding: gzip,deflate
Run Code Online (Sandbox Code Playgroud)
如何告诉httpclient不要包含任何其他标题?我试图用post.removeHeaders(xxxx)删除那些标题,但它不起作用.你能告诉我怎么样吗?
谢谢,
小智 10
如果你打电话HttpClientBuilder.create(),你将有一个httpClientBuilder.httpClientBuilder有很多默认头的配置,这将用于制作拦截器(例如:RequestAcceptEncoding).
例如,实现HttpRequestInterceptor的RequestAcceptEncoding Accept-Encoding: gzip,deflate在调用HttpProcessor.process()时生成头.并且在调用之前将调用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();
Run Code Online (Sandbox Code Playgroud)
简而言之,HttpClientBuilder有很多标志来禁用/启用HttpRequestInterceptor.如果禁用/启用这些HttpRequestInterceptor,则可以排除/包含默认标头.
抱歉我的英语不好,希望你明白我的意思.
CloseableHttpClient hc = HttpClients.custom()
.setHttpProcessor(HttpProcessorBuilder.create().build())
.build();
Run Code Online (Sandbox Code Playgroud)
上面的代码片段演示了如何使用空(无操作)协议处理器创建HttpClient实例,这保证不会将任何请求头添加到此类客户端执行的传出消息
您希望在 HttpClient 完成请求修改后最后进行“清理”。您可以通过在 HttpClientBuilder 上调用 addInterceptorLast 来完成此操作,如下所示。
HttpClient client = HttpClientBuilder.create().addInterceptorLast(
new HttpRequestInterceptor() {
public void process(HttpRequest request, HttpContext context){
request.removeHeaders("Host");
request.removeHeaders("Connection");
}
}
).build();
Run Code Online (Sandbox Code Playgroud)
我创建了一个实现 HttpRequestInterceptor 的匿名类。在发送请求之前进行任何需要完成的标头修改,并将它们放入 process 方法中。
HttpRequestInterceptor我认为您可以添加with的实现client.addRequestInterceptor()
或(更好)
删除所有向请求添加标头的拦截器(RequestUserAgent、RequestDefaultHeaders、RequestClientConnControl、RequestAcceptEncoding...)。
删除它们也很容易:
client.removeRequestInterceptorByClass(RequestAcceptEncoding.class);
Run Code Online (Sandbox Code Playgroud)