[英]How to retrieve response headers from CONNECT request using apache java HttpClient 4.5?
[英]How can I disable default request headers from 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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.