Как отключить заголовки запросов по умолчанию от 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. Возьмите любые изменения заголовка, которые необходимо выполнить перед отправкой запроса, и поместите их в метод процесса.