web-dev-qa-db-fra.com

HTTPclient commun et proxy

J'utilise la bibliothèque httpclient commune d'Apache. Est-il possible de faire une requête HTTP sur proxy? Plus spécifiquement, je dois utiliser une liste de proxy pour les requêtes multithread POST (pour le moment, je teste avec des requêtes GET à un seul thread).

J'ai essayé d'utiliser:

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

Je reçois des erreurs avec ce 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)

Lorsque je supprime cette ligne, tout se passe comme prévu.

20
dario111cro

Pour httpclient 4.1.x, vous pouvez définir le proxy comme suit (extrait de cet exemple ):

    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

Voici comment faire cela avec la dernière version de 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
Michael Laffargue

Bien que cette question soit très ancienne, mais je vois toujours qu'il n'y a pas de réponse exacte. Je vais essayer de répondre à la question ici. 

Je crois que la question qui se pose ici est de savoir comment définir les paramètres de proxy pour le serveur HTTP HttpClient d’Apache (org.Apache.commons. 

L'extrait de code ci-dessous devrait fonctionner:

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

À partir d'Apache HTTPComponents 4.3.x, la classe HttpClientBuilder définit les paramètres par défaut du proxy à partir des propriétés système http.proxyHost et http.proxyPort. Sinon, vous pouvez les remplacer à l'aide de la méthode setProxy.

7
Dungeon Hunter

Voici comment j'ai résolu ce problème pour l'ancien (<4.3) HttpClient (que je ne peux pas mettre à niveau), en utilisant la réponse de Santosh Singh (à qui j'ai donné un +1):

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

J'ai eu un problème similaire avec HttpClient version 4.

Je ne pouvais pas me connecter au serveur à cause d'une erreur de proxy SOCKS et je l'ai corrigé en utilisant la configuration ci-dessous:

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

Si votre logiciel utilise une ProxySelector (par exemple pour utiliser un script PAC au lieu d'un hôte/port statique) et que votre HTTPComponents est la version 4.3 ou supérieure, vous pouvez utiliser votre ProxySelector pour votre HttpClient comme ceci:

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

Et ensuite faites vos demandes comme d'habitude:

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