wake-up-neo.com

Allgemeiner HTTP-Client und Proxy

Ich verwende die allgemeine httpclient-Bibliothek von Apache. Ist es möglich, eine HTTP-Anforderung über einen Proxy zu stellen? Genauer gesagt, ich muss eine Proxy-Liste für Multithread-Anforderungen POST verwenden (im Moment teste ich mit Single-Thread-GET-Anforderungen).

Ich habe versucht zu verwenden:

        httpclient.getHostConfiguration().setProxy("67.177.104.230", 58720);

Ich bekomme Fehler mit diesem Code:

21.03.2012. 20:49:17 org.Apache.commons.httpclient.HttpMethodDirector executeWithRetry
INFO: I/O exception (Java.net.ConnectException) caught when processing request: Connection refused: connect
21.03.2012. 20:49:17 org.Apache.commons.httpclient.HttpMethodDirector executeWithRetry
INFO: Retrying request
21.03.2012. 20:49:19 org.Apache.commons.httpclient.HttpMethodDirector executeWithRetry
INFO: I/O exception (Java.net.ConnectException) caught when processing request: Connection refused: connect
21.03.2012. 20:49:19 org.Apache.commons.httpclient.HttpMethodDirector executeWithRetry
INFO: Retrying request
21.03.2012. 20:49:21 org.Apache.commons.httpclient.HttpMethodDirector executeWithRetry
INFO: I/O exception (Java.net.ConnectException) caught when processing request: Connection refused: connect
21.03.2012. 20:49:21 org.Apache.commons.httpclient.HttpMethodDirector executeWithRetry
INFO: Retrying request
org.Apache.commons.httpclient.ProtocolException: The server xxxxx failed to respond with a valid HTTP response
    at org.Apache.commons.httpclient.HttpMethodBase.readStatusLine(HttpMethodBase.Java:1846)
    at org.Apache.commons.httpclient.HttpMethodBase.readResponse(HttpMethodBase.Java:1590)
    at org.Apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.Java:995)
    at org.Apache.commons.httpclient.ConnectMethod.execute(ConnectMethod.Java:144)
    at org.Apache.commons.httpclient.HttpMethodDirector.executeConnect(HttpMethodDirector.Java:495)
    at org.Apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.Java:390)
    at org.Apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.Java:170)
    at org.Apache.commons.httpclient.HttpClient.executeMethod(HttpClient.Java:396)
    at org.Apache.commons.httpclient.HttpClient.executeMethod(HttpClient.Java:324)
    at test.main(test.Java:42)

Wenn ich die Linie entferne, läuft alles wie erwartet.

20
dario111cro

Für httpclient 4.1.x können Sie den Proxy so einstellen (genommen aus diesem Beispiel ):

    HttpHost proxy = new HttpHost("127.0.0.1", 8080, "http");

    DefaultHttpClient httpclient = new DefaultHttpClient();
    try {
        httpclient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy);

        HttpHost target = new HttpHost("issues.Apache.org", 443, "https");
        HttpGet req = new HttpGet("/");

        System.out.println("executing request to " + target + " via " + proxy);
        HttpResponse rsp = httpclient.execute(target, req);
        ...
    } finally {
        // When HttpClient instance is no longer needed,
        // shut down the connection manager to ensure
        // immediate deallocation of all system resources
        httpclient.getConnectionManager().shutdown();
    }
32
Kai Sternad

So machen Sie das mit der letzten Version von HTTPClient (4.3.4)

    CloseableHttpClient httpclient = HttpClients.createDefault();
    try {
        HttpHost target = new HttpHost("localhost", 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());
            EntityUtils.consume(response.getEntity());
        } finally {
            response.close();
        }
    } finally {
        httpclient.close();
    }
11

Diese Frage ist zwar sehr alt, aber ich sehe immer noch keine genaue Antwort. Ich werde versuchen, die Frage hier zu beantworten. 

Ich glaube, die kurze Frage hier ist, wie man die Proxy-Einstellungen für den HttpClient von Apache Commons (org.Apache.commons.httpclient.HttpClient) einstellt. 

Das folgende Code-Snippet sollte funktionieren:

HttpClient client = new HttpClient();
HostConfiguration hostConfiguration = client.getHostConfiguration();
hostConfiguration.setProxy("localhost", 8080);
client.setHostConfiguration(hostConfiguration);
7
Santosh Singh

Ab Apache HTTPComponents 4.3.x setzt die HttpClientBuilder-Klasse die Proxy-Standardwerte in den Systemeigenschaften http.proxyHost und http.proxyPort. Andernfalls können Sie sie mit der setProxy-Methode überschreiben.

7
Dungeon Hunter

So habe ich dieses Problem für den alten (<4.3) HttpClient (den ich nicht aktualisieren kann) mit der Antwort von Santosh Singh (dem ich ein +1 gegeben habe) gelöst:

HttpClient httpclient = new HttpClient();
if (System.getProperty("http.proxyHost") != null) {
  try {
    HostConfiguration hostConfiguration = httpclient.getHostConfiguration();
    hostConfiguration.setProxy(System.getProperty("http.proxyHost"), Integer.parseInt(System.getProperty("http.proxyPort")));
    httpclient.setHostConfiguration(hostConfiguration);
    this.getLogger().warn("USING PROXY: "+httpclient.getHostConfiguration().getProxyHost());
  } catch (Exception e) {
    throw new ProcessingException("Cannot set proxy!", e);
  }
}
3
rakensi

Ich hatte ein ähnliches Problem mit HttpClient Version 4.

Ich konnte wegen eines SOCKS-Proxyfehlers keine Verbindung zum Server herstellen, und es wurde mit der folgenden Konfiguration behoben:

client.getParams().setParameter("socksProxyHost",proxyHost);
client.getParams().setParameter("socksProxyPort",proxyPort);
1
ttati

Wenn Ihre Software eine ProxySelector verwendet (beispielsweise zur Verwendung eines PAC-Skripts anstelle eines statischen Hosts/Ports) und Ihre HTTPComponents Version 4.3 oder höher ist, können Sie Ihre ProxySelector für Ihre HttpClient wie folgt verwenden:

ProxySelector myProxySelector = ...;
HttpClient myHttpClient = HttpClientBuilder.create().setRoutePlanner(new SystemDefaultRoutePlanner(myProxySelector))).build();

Und dann machen Sie Ihre Anfragen wie gewohnt:

HttpGet myRequest = new HttpGet("/");
myHttpClient.execute(myRequest);