簡體   English   中英

如何從apache httpclient 4中禁用默認請求標頭?

[英]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實現
(更好)
刪除所有為請求添加標頭的攔截器( RequestUserAgentRequestDefaultHeadersRequestClientConnControlRequestAcceptEncoding ,...)。

刪除它們也很容易:

client.removeRequestInterceptorByClass(RequestAcceptEncoding.class);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM