Wie zu verwenden HttpClientBuilder mit Http proxy?
Ich bin versucht, einen proxy für eine Anfrage ich mache mit HttpClientBuilder
wie folgt:
CredentialsProvider credsProvider = new BasicCredentialsProvider();
UsernamePasswordCredentials usernamePasswordCredentials = new UsernamePasswordCredentials(proxyUser, proxyPassword);
credsProvider.setCredentials(new AuthScope(proxyHost, proxyPort), usernamePasswordCredentials);
builder.useSystemProperties();
builder.setProxy(new HttpHost(proxyHost, proxyPort));
builder.setDefaultCredentialsProvider(credsProvider);
builder.setProxyAuthenticationStrategy(new ProxyAuthenticationStrategy());
wo-generator ist:
HttpClientBuilder builder = HttpClientBuilder.create();
Allerdings bekomme ich diese exception, wenn ich das ausführen dieser Anforderung:
java.lang.RuntimeException: org.apache.http.conn.UnsupportedSchemeException: http protocol is not supported
Caused by: org.apache.http.conn.UnsupportedSchemeException: http protocol is not supported
at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:108) ~[httpclient-4.5.1.jar:4.5.1]
at org.apache.http.impl.conn.BasicHttpClientConnectionManager.connect(BasicHttpClientConnectionManager.java:338) ~[httpclient-4.5.1.jar:4.5.1]
at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:388) ~[httpclient-4.5.1.jar:4.5.1]
at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236) ~[httpclient-4.5.1.jar:4.5.1]
at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:184) ~[httpclient-4.5.1.jar:4.5.1]
at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:88) ~[httpclient-4.5.1.jar:4.5.1]
at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110) ~[httpclient-4.5.1.jar:4.5.1]
at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184) ~[httpclient-4.5.1.jar:4.5.1]
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82) ~[httpclient-4.5.1.jar:4.5.1]
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:107) ~[httpclient-4.5.1.jar:4.5.1]
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:55) ~[httpclient-4.5.1.jar:4.5.1]
(Ausnahme verkürzt aus Platzgründen)
Da dies ist ein HTTP-proxy, ich will nicht zu ändern, die Regelung auf HTTPS, die sowieso nicht funktionieren. Wie bekomme ich diese zu arbeiten?
- Ihr Wert proxyHost sollte nicht beginnen mit http:// enthält, sondern nur den Hostnamen (oder die ip)
- Ja,
proxyHost
ist nur die ip jetzt (keinehttp://
)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Warum dieses problem Auftritt?
Ans: Dies tatsächlich geschieht, weil
you forget to register a connection socket factory for the 'http' scheme
.Plain
'http'
Schema muss verwendet werden, um eine Zwischenprodukt-Verbindungder proxy selbst vor
'https'
tunneling eingesetzt werden konnte.Für betriebliche Zwecke, können Sie versuchen, diesen code:
Ich würde auch vorschlagen, einfach code für Ihre Forschung. Hoffe, es kann dich retten.
ClientExecuteProxy.java
Verwenden Sie mit CloudantClient java-API für Cloudant DB?
Ans:
Wenn JA, dann stellte sich heraus, das Problem mit HTTP-bei der Einstellung eines proxy-war ein Fehler auf unserer Seite (sorry). Wir
released 1.2.1
mit dem fix für dieses problem. Sie können download-jar-Datei von hier. (Gesammelt von mike-Rhodos Antwort)UPDATE
Vom HTTP-Authentifizierung,
Standardmäßig httpclient wird keine Anmeldeinformationen bereitstellen vorsorglich
it will first create a HTTP request without authentication parameters
. Dies ist beabsichtigt, als eine Vorsichtsmaßnahme und als Teil der spec. Aber, das führt zu Problemen, wenn Sie nicht den Vorgang zu wiederholen, oder wo auch immer Sie anschließen erwartet Sie zu senden, die Authentifizierung Informationen, die auf der ersten Verbindung. Es bewirkt auch die zusätzliche Wartezeit auf eine Anfrage, wie Sie benötigen, um mehrere Anrufe und Ursachen 401s erscheinen in den logs.Die Problemumgehung ist die Verwendung eines Authentifizierungs-cache zu behaupten, dass Sie bereits mit dem server verbunden einmal. Dies bedeutet, dass Sie nur einen HTTP-Aufruf.
Kredit geht an Cetra
Weiterführende Links:
Was Sie sollte sehr nah zu arbeiten. Ich würde folgende einfache änderungen:
Löschen Sie den Aufruf useSystemProperties. Es ist nicht gut dokumentiert, aber wenn man den Proxy einstellen (wie man das in die nächste Zeile), es überschreibt diese, so entfernen Sie diese Zeile.
Rufen Sie die HttpHost Konstruktor mit dem expliziten 'Schema' - parameter. Dies ist, wo Sie immer der Fehler, so es explizit:"
Hinweis: Sie nicht sagen, aber basierend auf der Verwendung von "BasicCredentialsProvider", das ist nur geben Sie "Basic" - Authentifizierung. Basic ist nur verschlüsselt und ist nicht wirklich sicher. Für die Digest-oder die NTLM-oder Kerberos benötigen Sie unterschiedliche code.
Ich denke, das problem ist, mit dem HttpClient, nicht den proxy. Haben Sie versuchen, zu erstellen Ihre HttpClient mithilfe HttpClientBuilder.build()