2014-04-25 15 views
11

Ich benutze Apache common httpclient 4.3.3, um HTTP 1.0 Anfrage. Hier ist, wie ich die Anfrage jedochWie kann ich Standard-Anfrage-Header von Apache httpclient 4 deaktivieren?

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

machen, kann ich sehen, dass es andere Header automatisch hinzugefügt, um meine Anfrage an den Server wie

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

Wie kann ich sagen, Httpclient keine andere einschließen Kopfzeilen? Ich habe versucht, diese Header mit post.removeHeaders (xxxx) zu entfernen, aber es funktioniert nicht. Kannst du mir zeigen wie?

Danke,

Antwort

0

ich glaube, Sie Ihre Implementierung von HttpRequestInterceptor mit client.addRequestInterceptor()
oder (besser)
entfernen Sie alle Abfangjäger, die Header der Anforderung hinzufügen könnte hinzufügen (RequestUserAgent, RequestDefaultHeaders, RequestClientConnControl, RequestAcceptEncoding, ...).

sie entfernen auch einfach ist:

client.removeRequestInterceptorByClass(RequestAcceptEncoding.class); 
+0

Ich sehe nicht die Methode removeRequestInterceptorByClass (xxxx) für HttpClient. Wo kann ich diese Methode einstellen? –

+2

https://hc.apache.org/httpcomponents-client-4.3.x/httpclient/apidocs/org/apache/http/impl/client/AbstractHttpClient.html#removeRequestInterceptorByClass(java.lang.Class) Aber ich sah das Ganze API ist veraltet für 4.3 – Stephan

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

Der Codeausschnitt oben zeigt, wie eine Httpclient-Instanz mit einem leeren erstellen (No-op) Protokoll-Prozessor, der wird keine Request-Header garantiert jemals zu ausgehenden Nachrichten hinzugefügt werden, die von einem solchen Client ausgeführt werden

+2

Einige Erklärung dieses Codes wäre nett. – guerda

+1

Ich bin mir nicht sicher, welche Art von zusätzlichen Erklärungen hier zu erwarten sind. Das obige Codefragment zeigt, wie eine HttpClient-Instanz mit einem leeren (no-op) -Protokollprozessor erstellt wird, die garantiert, dass ausgehenden Nachrichten, die von einem solchen Client ausgeführt werden, keine Anforderungsheader hinzugefügt werden – oleg

+0

diese Methode entfernt alle Header! Sie müssen dies konfigurieren – z0mb1ek

8

Wenn Sie HttpClientBuilder.create() aufrufen, haben Sie einen httpClientBuilder. Und httpClientBuilder hat viel Config für Standard-Header und dies wird verwendet, um Intercepter (zB: RequestAcceptEncoding) zu machen.

Zum Beispiel, RequestAcceptEncoding, die HttpRequestInterceptor implementiert, macht Accept-Encoding: gzip,deflate Header, wenn HttpProcessor.process() aufgerufen wird. Und httpProcessor.process() wird nur aufgerufen werden, bevor final CloseableHttpResponse response = this.requestExecutor.execute(route, request, context, execAware);

Sie Aufrufen diesen Code bei org.apache.http.impl.execchain.ProtocolExec von Httpclient-4.3.6 Linie 193.

sehen Wenn Sie möchten Accept-Encoding: gzip,deflate entfernen, rufen Sie HttpClientBuilder.disableContentCompression() wie folgt auf.

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

Kurz gesagt, hat HttpClientBuilder eine Menge Fahnen zu deaktivieren/aktivieren HttpRequestInterceptor. Wenn Sie diese HttpRequestInterceptor deaktivieren/aktivieren, können Sie Standardheader ausschließen/einschließen.

Entschuldigung für mein schlechtes Englisch, und hoffe du bekommst was ich meine.

0

Sie möchten Ihre "Bereinigung" am Ende tun, nachdem HttpClient die Anfrage geändert hat. Sie können dies tun, indem Sie addInterceptorLast auf HttpClientBuilder wie folgt aufrufen.

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

Ich erstelle eine anonyme Klasse, die HttpRequestInterceptor implementiert. Nehmen Sie die erforderlichen Headeränderungen vor dem Senden der Anforderung vor und fügen Sie sie in die Prozessmethode ein.