【问题标题】:How can I disable default request headers from apache httpclient 4?如何禁用 apache httpclient 4 的默认请求标头?
【发布时间】:2014-04-25 11:02:35
【问题描述】:

我正在使用 apache common 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) 删除这些标题,但它不起作用。你能告诉我怎么做吗?

谢谢,

【问题讨论】:

    标签: java apache-httpclient-4.x apache-commons-httpclient


    【解决方案1】:

    如果您调用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,则可以排除/包含默认标头。

    对不起,我的英语很差,希望你明白我的意思。

    【讨论】:

      【解决方案2】:
      CloseableHttpClient hc = HttpClients.custom()
              .setHttpProcessor(HttpProcessorBuilder.create().build())
              .build();
      

      上面的代码 sn-p 演示了如何创建一个带有空(无操作)协议处理器的 HttpClient 实例,这保证不会将请求标头添加到此类客户端执行的传出消息中

      【讨论】:

      • 我不确定这里会有什么样的额外解释。上面的代码 sn-p 演示了如何使用空(无操作)协议处理器创建 HttpClient 实例,这保证不会将请求标头添加到此类客户端执行的传出消息中
      • 此方法删除所有标题!你必须配置这个
      【解决方案3】:

      您想在 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 的匿名类。在发送请求之前进行任何您需要的标头修改,并将它们放入 process 方法中。

      【讨论】:

      • 这是否确保一旦请求被发送到目的地,它就不会有 Host 和 Connection 标头?据我所知,默认情况下 HttpClient 会添加这些标头,而不管我们是否手动删除它们。另外,何时调用 process() 方法?我尝试对此进行调试,但没有看到任何调用。
      【解决方案4】:

      我认为您可以将HttpRequestInterceptor 的实现添加到client.addRequestInterceptor()
      (更好)
      删除所有向请求添加标头的拦截器(RequestUserAgentRequestDefaultHeadersRequestClientConnControlRequestAcceptEncoding,...)。

      删除它们也很容易:

      client.removeRequestInterceptorByClass(RequestAcceptEncoding.class);
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-06
      • 2018-07-16
      • 2011-10-14
      • 2013-09-13
      • 2021-02-05
      相关资源
      最近更新 更多