it-swarm.com.de

Wie verwende ich HttpClientBuilder mit Http-Proxy?

Ich versuche, Proxy für eine Anforderung festzulegen, die ich mit HttpClientBuilder wie folgt stelle:

        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 Baumeister ist:

    HttpClientBuilder builder = HttpClientBuilder.create();

Ich erhalte jedoch diese Ausnahme, wenn ich diese Anfrage ausführte:

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 zur Verkürzung gekürzt)

Da dies ein HTTP-Proxy ist, möchte ich das Schema nicht in HTTPS ändern, was sowieso nicht funktioniert. Wie bekomme ich das zum Laufen?

7
jobin

Java.lang.RuntimeException: org.Apache.http.conn.UnsupportedSchemeException: Das http-Protokoll ist nicht unterstützt

Warum tritt dieses Problem auf?

Ans: Das passiert eigentlich, weil you forget to register a connection socket factory for the 'http' scheme.

Das einfache 'http'-Schema muss verwendet werden, um eine Zwischenverbindung herzustellen zum Proxy selbst, bevor 'https'-Tunnelung verwendet werden kann.


Aus betrieblichen Gründen können Sie diesen Code ausprobieren:

CloseableHttpClient client = HttpClients.custom()
           .setRoutePlanner(new
 SystemDefaultRoutePlanner(ProxySelector.getDefault()))
           .build();

Ich würde auch einfachen Code für Ihre Recherche vorschlagen. Ich hoffe es kann dich retten.

ClientExecuteProxy.Java

package org.Apache.http.examples.client;

import org.Apache.http.HttpHost;
import org.Apache.http.client.config.RequestConfig;
import org.Apache.http.client.methods.CloseableHttpResponse;
import org.Apache.http.client.methods.HttpGet;
import org.Apache.http.impl.client.CloseableHttpClient;
import org.Apache.http.impl.client.HttpClients;
import org.Apache.http.util.EntityUtils;

/**
 * How to send a request via proxy.
 *
 * @since 4.0
 */
public class ClientExecuteProxy {

    public static void main(String[] args)throws Exception {
        CloseableHttpClient httpclient = HttpClients.createDefault();
        try {
            HttpHost target = new HttpHost("httpbin.org", 443, "https");
            HttpHost proxy = new HttpHost("127.0.0.1", 8080, "http");

            RequestConfig config = RequestConfig.custom()
                    .setProxy(proxy)
                    .build();
            HttpGet request = new HttpGet("/");
            request.setConfig(config);

            System.out.println("Executing request " + request.getRequestLine() + " to " + target + " via " + proxy);

            CloseableHttpResponse response = httpclient.execute(target, request);
            try {
                System.out.println("----------------------------------------");
                System.out.println(response.getStatusLine());
                System.out.println(EntityUtils.toString(response.getEntity()));
            } finally {
                response.close();
            }
        } finally {
            httpclient.close();
        }
    }

}

Verwenden Sie die CloudantClient-Java-API für Cloudant DB?

Ans: 

Wenn ja, dann stellte sich heraus, dass das Problem mit HTTP bei der Einstellung eines Proxys ein Fehler an unserem Ende war (entschuldige das). Wir released 1.2.1 mit dem Fix für dieses Problem. Sie können die JAR-Datei von hier herunterladen. (Gesammelt aus mike-rhodess Antwort )


UPDATE

Wie gebe ich hier die Anmeldeinformationen für den Proxy an?

Von HTTP-Authentifizierung ,

Standardmäßig stellt httpclient keine Berechtigungsnachweise zur Verfügung, it will first create a HTTP request without authentication parameters. Dies ist beabsichtigt, als Sicherheitsvorkehrung und als Teil der Spezifikation. Dies kann jedoch zu Problemen führen, wenn Sie die Verbindung nicht erneut versuchen oder wenn Sie eine Verbindung herstellen, von der Sie erwarten, dass Sie Authentifizierungsdetails für die erste Verbindung senden. Es verursacht auch eine zusätzliche Latenzzeit für eine Anforderung, da Sie mehrere Anrufe tätigen müssen, und 401s in den Protokollen angezeigt werden.

Sie können dieses Problem umgehen, indem Sie einen Authentifizierungscache verwenden, um so zu tun, als hätten Sie bereits eine Verbindung zum Server hergestellt. Das bedeutet, dass Sie nur einen HTTP-Aufruf durchführen.

CloseableHttpClient httpclient = HttpClientBuilder.create().build();

HttpHost targetHost = new HttpHost("localhost", 80, "http");
CredentialsProvider credsProvider = new BasicCredentialsProvider();
credsProvider.setCredentials(
        new AuthScope(targetHost.getHostName(), targetHost.getPort()),
        new UsernamePasswordCredentials("username", "password"));

// Create AuthCache instance
AuthCache authCache = new BasicAuthCache();
// Generate BASIC scheme object and add it to the local auth cache
BasicScheme basicAuth = new BasicScheme();
authCache.put(targetHost, basicAuth);

// Add AuthCache to the execution context
HttpClientContext context = HttpClientContext.create();
context.setCredentialsProvider(credsProvider);
context.setAuthCache(authCache);

HttpGet httpget = new HttpGet("/");
for (int i = 0; i < 3; i++) {
    CloseableHttpResponse response = httpclient.execute(
            targetHost, httpget, context);
    try {
        HttpEntity entity = response.getEntity();

    } finally {
        response.close();
    }
}

NB: Sie müssen dem Host vertrauen, zu dem Sie eine Verbindung herstellen, und wenn Sie .__ sind. Bei Verwendung von HTTP werden Ihr Benutzername und Ihr Passwort in Klartext gesendet (na ja, base64, aber das zählt nicht).

Sie sollten auch einen viel spezifischeren Authscope als .__ verwenden. auf AuthScope.ANY_Host und AuthScope.ANY_PORT wie in Ihrem Beispiel.

Gutschrift geht an Cetra

Ähnliche Links:

  1. HttpClientBuilder basic auth
  2. Apache HttpClient 4.1 - Proxy-Authentifizierung
16
SkyWalker

Was Sie haben, sollte sehr nahe an der Arbeit sein. Ich würde die folgenden einfachen Änderungen vornehmen:

builder.useSystemProperties();

Löschen Sie den Aufruf von useSystemProperties. Es ist nicht gut dokumentiert, aber wenn Sie den Proxy setzen (wie in der nächsten Zeile), wird dies überschrieben. Entfernen Sie also diese Zeile.

builder.setProxy(new HttpHost(proxyHost, proxyPort));

Rufen Sie den HttpHost-Konstruktor mit dem expliziten 'Schema'-Parameter auf. Hier erhalten Sie den Fehler, also machen Sie ihn explizit:

String proxyScheme = "http";
builder.setProxy(new HttpHost(proxyHost, proxyPort, proxyScheme));

Hinweis: Sie haben nicht gesagt, aber aufgrund der Verwendung von "BasicCredentialsProvider" erhalten Sie nur "Basic" -Authentifizierung. Basic ist nur verschlüsselt und nicht wirklich sicher. Für Digest oder NTLM oder Kerberos benötigen Sie einen anderen Code.

3
JoeG

Ich denke, das Problem liegt bei Ihrem HttpClient, nicht beim Proxy. Haben Sie versucht, Ihren HttpClient mithilfe von HttpClientBuilder.build () zu erstellen.

HttpClient client = builder.build();
2
An Do