How can I disable default request headers from apache httpclient 4?

前端 未结 4 1622
终归单人心
终归单人心 2020-12-14 21:55

I am using apache common httpclient 4.3.3 to make http 1.0 request. Here is how I make the request

HttpClient client = HttpClientBuilder.create().build();
Ht         


        
相关标签:
4条回答
  • 2020-12-14 22:22

    I think you could add your implementation of HttpRequestInterceptor with client.addRequestInterceptor()
    or (better)
    remove all interceptors that add headers to the request (RequestUserAgent, RequestDefaultHeaders, RequestClientConnControl, RequestAcceptEncoding, ...).

    Removing them is also easy:

    client.removeRequestInterceptorByClass(RequestAcceptEncoding.class);
    
    0 讨论(0)
  • 2020-12-14 22:32

    If you call HttpClientBuilder.create(), you will have a httpClientBuilder. And httpClientBuilder has a lot config for default headers and this will be used to make intercepters( ex: RequestAcceptEncoding ).

    For example, RequestAcceptEncoding, which implements HttpRequestInterceptor, makes Accept-Encoding: gzip,deflate header when HttpProcessor.process() is invoked. And httpProcessor.process() will be invoked just before invoking final CloseableHttpResponse response = this.requestExecutor.execute(route, request, context, execAware);

    You can see this code at org.apache.http.impl.execchain.ProtocolExec of httpclient-4.3.6 line 193.

    If you want to remove Accept-Encoding: gzip,deflate, call HttpClientBuilder.disableContentCompression() like below.

    HttpClient client = HttpClientBuilder.create().disableContentCompression().build();
    

    In short, HttpClientBuilder has a lot of flags to disable/enable HttpRequestInterceptor. If you disable/enable those HttpRequestInterceptor, you can exclude/include default headers.

    Sorry for my poor English, and hope you get what I mean.

    0 讨论(0)
  • 2020-12-14 22:37

    You want to do your 'cleanup' at the end, after HttpClient is done modifying the request. You can do this by calling addInterceptorLast on HttpClientBuilder as below.

    HttpClient client = HttpClientBuilder.create().addInterceptorLast( 
                            new HttpRequestInterceptor() {
                                public void process(HttpRequest request, HttpContext context){
                                    request.removeHeaders("Host");
                                    request.removeHeaders("Connection");
                                }
                            }   
                    ).build();
    

    I create an anonymous class implementing HttpRequestInterceptor. Take whatever header modifications you need done before the request is sent, and put them in the process method.

    0 讨论(0)
  • 2020-12-14 22:38
    CloseableHttpClient hc = HttpClients.custom()
            .setHttpProcessor(HttpProcessorBuilder.create().build())
            .build();
    

    The code snippet above demonstrates how to create an HttpClient instance with an empty (no-op) protocol processor, which guarantees no request headers will ever be added to outgoing messages executed by such client

    0 讨论(0)
提交回复
热议问题