Как отключить заголовки запросов по умолчанию от apache httpclient 4?

Я использую 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), но он не работает. Можете ли вы показать мне, как?

Спасибо,

Ответ 1

Если вы вызываете HttpClientBuilder.create(), у вас будет httpClientBuilder. И httpClientBuilder имеет много конфигураций для заголовков по умолчанию, и это будет использоваться для создания перехватчиков (например: RequestAcceptEncoding).

Например, RequestAcceptEncoding, реализующий HttpRequestInterceptor, создает заголовок Accept-Encoding: gzip,deflate при вызове HttpProcessor.process(). И httpProcessor.process() будет вызываться непосредственно перед вызовом final CloseableHttpResponse response = this.requestExecutor.execute(route, request, context, execAware);

Вы можете увидеть этот код на org.apache.http.impl.execchain.ProtocolExec страницы httpclient-4.3.6 строки 193.

Если вы хотите удалить 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();

В приведенном выше фрагменте кода показано, как создать экземпляр HttpClient с помощью пустого (не-операционного) процессора протоколов, который гарантирует, что заголовки запросов никогда не будут добавлены к исходящим сообщениям, выполненным таким клиентом.

Ответ 3

Я думаю, вы могли бы добавить свою реализацию HttpRequestInterceptor с помощью client.addRequestInterceptor()
или (лучше)
удалите все перехватчики, добавляющие заголовки к запросу (RequestUserAgent, RequestDefaultHeaders, RequestClientConnControl, RequestAcceptEncoding,...).

Удаление их также легко:

client.removeRequestInterceptorByClass(RequestAcceptEncoding.class);

Ответ 4

Вы хотите выполнить свою "очистку" в конце, после того, как HttpClient будет модифицировать запрос. Вы можете сделать это, вызвав addInterceptorLast на HttpClientBuilder, как показано ниже.

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

Я создаю анонимный класс, реализующий HttpRequestInterceptor. Возьмите любые изменения заголовка, которые необходимо выполнить перед отправкой запроса, и поместите их в метод процесса.