代码之家  ›  专栏  ›  技术社区  ›  Developer

如何在Java中对HttpClient请求设置代理主机

  •  9
  • Developer  · 技术社区  · 7 年前

    我想在发送前设置代理 HttpClient

    Curl命令:

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

    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"));
    

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

    这表明我无法将该URL与我试图用于连接URL的代理连接起来。

    4 回复  |  直到 4 年前
        1
  •  8
  •   SkyWalker    7 年前

    本教程提供了一个完整的示例: How do I setting a proxy for 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();
            }
        }
    }
    

    需要添加jar文件 : http://repo1.maven.org/maven2/commons-httpclient/commons-httpclient/3.1/commons-httpclient-3.1.jar

    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();
    

    https://stackoverflow.com/a/4957144

    对于其他版本,如4.3或4.3以上,您可以通过以下步骤回答: Apache HttpClient 4.1 - Proxy Authentication

        2
  •  7
  •   DontPanic    7 年前

    我认为这可能会有所帮助:

    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
  •  6
  •   Eugene Lebedev    7 年前

    添加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>
    

    使用 HttpClientBuilder 并设置标志 useSystemProperties :

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

    那么你至少有两个选择:

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

    ${JAVA_HOME}/lib/net.properties ):

    java.net.useSystemProxies=true
    http.proxyHost=some-host
    http.proxyPort=some-port
    

        4
  •  1
  •   Frischling    7 年前

    系统属性通常必须预先设置好,这意味着在jvm启动时 -Dhttp.proxyHost=some.host.com -Dhttp.proxyPort=8080 ,不要忘记httpsProxyHost和…端口)

    我个人觉得Jersey客户端实现更容易使用,如果您可以选择切换的话。