2014-04-25 117 views
11

我使用apache常見httpclient 4.3.3來提出http 1.0請求。這裏是我提出請求如何禁用來自Apache httpclient 4的默認請求標頭?

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)刪除這些頭,但它不起作用。你能告訴我如何?

感謝,

回答

0

我想你可以用client.addRequestInterceptor()
(更好)
刪除頭添加到請求(RequestUserAgentRequestDefaultHeadersRequestClientConnControlRequestAcceptEncoding所有攔截器添加您的HttpRequestInterceptor實施, ...)。

卸下它們也容易:

client.removeRequestInterceptorByClass(RequestAcceptEncoding.class); 
+0

我看不到方法removeRequestInterceptorByClass(xxxx)爲HttpClient。我可以在哪裏設置該方法? –

+2

https://hc.apache.org/httpcomponents-client-4.3.x/httpclient/apidocs/org/apache/http/impl/client/AbstractHttpClient.html#removeRequestInterceptorByClass(java.lang.Class)但是我看到了整個API已棄用4.3 4.3 – Stephan

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

上面的代碼段演示瞭如何用空(無操作)協議處理器,這保證了沒有請求頭將創建一個HttpClient的實例永遠被添加到這樣的客戶端執行的傳出消息

+2

這段代碼的一些解釋很好。 – guerda

+1

我不確定這裏有什麼樣的額外解釋。上面的代碼片段演示瞭如何使用空(無操作)協議處理器創建HttpClient實例,從而保證不會將請求頭添加到由此類客戶端執行的傳出消息中 – oleg

+0

此方法將刪除所有頭文件!你必須配置這個 – z0mb1ek

8

如果您致電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,則可以排除/包含默認標題。

對不起我的英文不好,希望你明白我的意思。

0

在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的匿名類。在發送請求之前,請完成所需的任何標頭修改,然後將其放入處理方法中。

相關問題