2014-04-25 18 views
11

Używam apache wspólnego httpclient 4.3.3 do żądania http 1.0. Oto w jaki sposób uczynić żądaniaJak wyłączyć domyślne nagłówki żądań z apache httpclient 4?

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); 

Jednak widzę, że istnieją inne nagłówki automatycznie dodawane do mojego żądania do serwera jak

Connection: Keep-Alive 
User-Agent: Apache-HttpClient/4.3.3 (java 1.5) 
Accept-Encoding: gzip,deflate 

Jak mogę powiedzieć httpclient nie obejmuje wszelkie inne nagłówki? Próbowałem usunąć te nagłówki za pomocą post.removeHeaders (xxxx), ale to nie działa. Czy możesz mi pokazać, jak?

Dzięki,

Odpowiedz

0

myślę można dodać swoją realizację HttpRequestInterceptor z client.addRequestInterceptor()
lub (lepszą)
usunięcia wszystkich przechwytujących, które dodają nagłówków na żądanie (RequestUserAgent, RequestDefaultHeaders, RequestClientConnControl, RequestAcceptEncoding, ...).

Usunięcie ich jest również proste:

client.removeRequestInterceptorByClass(RequestAcceptEncoding.class); 
+0

Nie widzę metody removeRequestInterceptorByClass (xxxx) dla HttpClient. Gdzie mogę ustawić tę metodę? –

+2

https://hc.apache.org/httpcomponents-client-4.3.x/httpclient/apidocs/org/apache/http/impl/client/AbstractHttpClient.html#removeRequestInterceptorByClass(java.lang.Class) Ale widziałem cały API jest przestarzałe dla 4.3 – Stephan

5
CloseableHttpClient hc = HttpClients.custom() 
     .setHttpProcessor(HttpProcessorBuilder.create().build()) 
     .build(); 

Fragment kodu powyżej pokazuje, jak utworzyć instancję httpclient z pustym (no-op) procesor protokół, który gwarantuje żadnych nagłówków życzenie kiedykolwiek zostaną dodane do wiadomości wychodzących wykonywanych przez takiego klienta:

+2

Niektóre wyjaśnienia tego kodu byłyby miłe. – guerda

+1

Nie jestem pewien, jakiego rodzaju dodatkowych wyjaśnień można się spodziewać tutaj. Powyższy fragment kodu demonstruje, jak utworzyć instancję HttpClient przy użyciu pustego procesora protokołu (no-op), co gwarantuje, że żadne nagłówki żądań nie zostaną nigdy dodane do wychodzących wiadomości wykonanych przez tego klienta. – oleg

+0

Ta metoda usuwa wszystkie nagłówki! musisz to skonfigurować – z0mb1ek

8

Jeśli zadzwonisz pod numer HttpClientBuilder.create(), będziesz mieć httpClientBuilder. A httpClientBuilder ma dużo konfiguracji dla domyślnych nagłówków, a to będzie używane do tworzenia przechwytujących (np. RequestAcceptEncoding).

Na przykład RequestAcceptEncoding, który implementuje HttpRequestInterceptor, tworzy nagłówek Accept-Encoding: gzip,deflate po wywołaniu HttpProcessor.process(). I httpProcessor.process() zostanie wywołana tuż przed wywołaniem final CloseableHttpResponse response = this.requestExecutor.execute(route, request, context, execAware);

Możesz zobaczyć ten kod w org.apache.http.impl.execchain.ProtocolExec z httpclient-4.3.6 linii 193.

If chcesz usunąć Accept-Encoding: gzip,deflate, zadzwoń pod HttpClientBuilder.disableContentCompression() jak poniżej.

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

W skrócie, HttpClientBuilder ma wiele flag, aby wyłączyć/włączyć HttpRequestInterceptor. Jeśli wyłączysz/włączysz te obiekty HttpRequestInterceptor, możesz wykluczyć/dołączyć domyślne nagłówki.

Przepraszam za mój biedny angielski i mam nadzieję, że zrozumiesz, o co mi chodzi.

0

Chcesz zrobić "porządek" na końcu, po zakończeniu HttpClient modyfikacji żądania. Możesz to zrobić, wywołując metodę addInterceptorLast w HttpClientBuilder, jak poniżej.

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

Tworzę anonimową klasę implementującą HttpRequestInterceptor. Wykonaj wszelkie modyfikacje nagłówka, które trzeba wykonać przed wysłaniem żądania, i umieść je w metodzie procesu.

Powiązane problemy