web-dev-qa-db-fra.com

Comment définir un hôte proxy sur une requête HttpClient en Java

Je souhaite définir un proxy avant d'envoyer la demande HttpClient sur une URL. Comme je suis capable de le connecter, la commande curl met en place le proxy mais avec le code Java, je ne peux pas le faire. 

Commande Curl:

**curl -I -x IP:80  URL**

Changement de code effectué dans un fichier Java:

HttpClient client = new HttpClient();
System.getProperties().put("http.proxyHost", "someProxyURL");
System.getProperties().put("http.proxyPort", "someProxyPort");
EntityEnclosingMethod method = new PostMethod(url);
method.setRequestEntity(new StringRequestEntity(requestXML, "text/xml", "utf-8"));

Avec les changements de code ci-dessus dans mon fichier Java, l'erreur suivante apparaît:

Java.net.ConnectException: Connection refused (Connection refused)

Ce qui montre que je ne suis pas capable de connecter cette URL avec le proxy que j'essaie d'utiliser pour connecter l'URL.

2
Developer

Je pense que cela pourrait être utile:

HttpClient client = new HttpClient();

HostConfiguration config = client.getHostConfiguration();
config.setProxy("someProxyURL", "someProxyPort");

Credentials credentials = new UsernamePasswordCredentials("username", "password");
AuthScope authScope = new AuthScope("someProxyURL", "someProxyPort");
client.getState().setProxyCredentials(authScope, credentials);

EntityEnclosingMethod method = new PostMethod(url);
method.setRequestEntity(new StringRequestEntity(requestXML, "text/xml", "utf-8"));
3
DontPanic

Un exemple complet est donné dans ce tutoriel: Comment définir un proxy pour HttpClient?

package org.kodejava.example.commons.httpclient;

import org.Apache.commons.httpclient.Credentials;
import org.Apache.commons.httpclient.HostConfiguration;
import org.Apache.commons.httpclient.HttpClient;
import org.Apache.commons.httpclient.HttpMethod;
import org.Apache.commons.httpclient.HttpStatus;
import org.Apache.commons.httpclient.UsernamePasswordCredentials;
import org.Apache.commons.httpclient.auth.AuthScope;
import org.Apache.commons.httpclient.methods.GetMethod;

import Java.io.IOException;

public class HttpGetProxy {
    private static final String PROXY_Host = "proxy.Host.com";
    private static final int PROXY_PORT = 8080;

    public static void main(String[] args) {
        HttpClient client = new HttpClient();
        HttpMethod method = new GetMethod("https://kodejava.org");

        HostConfiguration config = client.getHostConfiguration();
        config.setProxy(PROXY_Host, PROXY_PORT);

        String username = "guest";
        String password = "s3cr3t";
        Credentials credentials = new UsernamePasswordCredentials(username, password);
        AuthScope authScope = new AuthScope(PROXY_Host, PROXY_PORT);

        client.getState().setProxyCredentials(authScope, credentials);

        try {
            client.executeMethod(method);

            if (method.getStatusCode() == HttpStatus.SC_OK) {
                String response = method.getResponseBodyAsString();
                System.out.println("Response = " + response);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            method.releaseConnection();
        }
    }
}

Pour cela, vous devez ajouter un fichier jar : http://repo1.maven.org/maven2/commons-httpclient/commons-httpclient/3.1/commons-httpclient-3.1.jar

Exemple complet de Apache HttpClient 4.1, la configuration du proxy se trouve ci-dessous

HttpHost proxy = new HttpHost("ip address",port number);
DefaultHttpClient httpclient = new DefaultHttpClient();
httpclient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY,proxy);

HttpPost httpost = new HttpPost(url);
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
nvps.add(new BasicNameValuePair("param name", param));
httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.ISO_8859_1));
HttpResponse response = httpclient.execute(httpost);

HttpEntity entity = response.getEntity();
System.out.println("Request Handled?: " + response.getStatusLine());
InputStream in = entity.getContent();
httpclient.getConnectionManager().shutdown();

Lien de ressource: https://stackoverflow.com/a/4957144

Pour les autres versions comme 4.3 ou 4.3+, vous pouvez passer par ceci SO answer: Apache HttpClient 4.1 - Authentification du proxy

3
SkyWalker

Ajouter une dépendance maven (4.2.X +):

<dependency>
    <groupId>org.Apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.3</version>
    <exclusions>
        <exclusion>
            <artifactId>commons-logging</artifactId>
            <groupId>commons-logging</groupId>
        </exclusion>
    </exclusions>
</dependency>

Utilisez HttpClientBuilder et définissez l'indicateur useSystemProperties:

HttpClient client = HttpClientBuilder.create().useSystemProperties().build();

alors vous avez au moins deux options:

Option A: Remplacer les arguments, c.-à-d.

Java -Djava.net.useSystemProxies=true 
     -Dhttp.proxyHost=PROXY_Host
     -Dhttp.proxyPort=PROXY_PORT 
     -Dhttp.proxyUser=USERNAME
     -Dhttp.proxyPassword=PASSWORD
     -jar your-app.jar

Option B: Configurer la machine virtuelle Java (${Java_HOME}/lib/net.properties):

Java.net.useSystemProxies=true
http.proxyHost=some-Host
http.proxyPort=some-port

et lancez votre application

1
Evgeny Lebedev

Les propriétés système doivent généralement être définies directement, ce qui signifie soit au démarrage de jvm avec -Dhttp.proxyHost=some.Host.com [.____. -Dhttp.proxyPort=8080, sans oublier httpsProxyHost et ... Port)

Ou qui devrait également fonctionner dans un bloc {} statique.

Personnellement, je trouve que la mise en œuvre du client Jersey est plus facile à utiliser, si vous avez la possibilité de basculer.

0
Frischling