Ich benutze Jakarta Commons HttpClient 3.1, schreibe ein Lasttest-Tool, das auf verschiedene Server abzielen muss und tue so, als ob es den richtigen virtuellen Host im HTTP-Server als Ziel hat. Dazu muss ich den HTTP-Header "Host" in der Anfrage auf einen anderen Hostnamen als den tatsächlichen Hostnamen einstellen können, mit dem ich mich verbinde.
Es schien ziemlich offensichtlich, dass ich Method.setRequestHeader("Host","fakehostname")
verwenden sollte, aber HttpClient ignoriert dies und sendet immer den echten Host-Namen, mit dem ich mich verbinde, in den "Host" -Header (Ich habe Debug-Logging für "httpclient.wire" aktiviert "und ich kann es genau tun."
Wie kann ich den Header überschreiben, so dass HttpClient beachtet?
Nachdem ich etwas mehr gesucht und einen Hinweis aus Olegs Antwort genommen habe, habe ich die Methode HttpMethodParams :: setVirtualHost () .
Wenn HttpClient eine Anfrage formatiert, erstellt er immer unmittelbar vor dem Senden der Anfrage den Header "Host" selbst - und kann daher nicht als Standard-Header überschrieben werden. Bevor jedoch der Hostname für den Header "Host" aus der URL generiert wird, überprüft HttpClient das HttpMethodParams-Objekt, um festzustellen, ob der Benutzer den Hostnamen überschreiben möchte. Dies überschreibt nur den Hostnamen und nicht den Port, so dass es einfacher zu verwenden wäre, wenn auch nicht so intuitiv, wie ich es möchte.
Der Code zur Verwendung kann folgendermaßen aussehen:
%Vor% Ich glaube, Sie wollen Ссылка : das Ermöglicht Ihnen, den Host für eine bestimmte Verbindung zu konfigurieren. Wenn ich es richtig verstanden habe, können Sie entweder die Methode execute
verwenden (siehe Ссылка )) und übergeben Sie ein benutzerdefiniertes HttpHost
-Objekt, oder tun Sie dies:
Lass mich wissen, wie das funktioniert.
EDIT: Prinzip bleibt gleich.
1. Erstellen Sie eine HttpHost-Instanz und übergeben Sie ihr den Host-Header (siehe Ссылка ).
2. Erstellen Sie eine HttpConfiguration-Instanz, und übergeben Sie ihr den von Ihnen erstellten HttpHost (siehe Ссылка ).
3. Verwenden Sie die Methode execute
auf HttpClient mit dieser Konfiguration (siehe Ссылка ))
Tags und Links java apache-commons-httpclient