如何从apache httpclient 4中禁用默认请求标头?
我使用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)删除那些标题,但它不起作用。 你能告诉我怎么样吗?
谢谢,
如果你调用HttpClientBuilder.create()
,你将有一个httpClientBuilder。 并且httpClientBuilder有很多默认头的配置,这将用于制作拦截器(例如:RequestAcceptEncoding)。
例如,实现HttpRequestInterceptor的RequestAcceptEncoding在调用HttpProcessor.process()时生成Accept-Encoding: gzip,deflate
标头。 并且在调用final CloseableHttpResponse response = this.requestExecutor.execute(route, request, context, execAware);
之前调用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,则可以排除/包含默认标头。
抱歉我的英语不好,希望你明白我的意思。
CloseableHttpClient hc = HttpClients.custom() .setHttpProcessor(HttpProcessorBuilder.create().build()) .build();
上面的代码片段演示了如何使用空(无操作)协议处理器创建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();
我创建了一个实现HttpRequestInterceptor的匿名类。 在发送请求之前,请执行您需要执行的任何标头修改,并将它们放入过程方法中。
我想你可以用client.addRequestInterceptor()
添加你的HttpRequestInterceptor
实现
或 (更好)
删除所有为请求添加标头的拦截器( RequestUserAgent
, RequestDefaultHeaders
, RequestClientConnControl
, RequestAcceptEncoding
,…)。
删除它们也很容易:
client.removeRequestInterceptorByClass(RequestAcceptEncoding.class);