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.
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();
}
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();
}
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);
À 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.
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);
}
}
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);
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);