当我为HttpClient对象设置代理时会发生什么?

时间:2017-01-23 20:58:01

标签: java proxy apache-httpclient-4.x

我试图了解为HttpClient对象设置代理的想法。我在下面找到了相关代码。

HttpHost proxy = new HttpHost("proxy.com", 80, "http");
DefaultProxyRoutePlanner routePlanner = new DefaultProxyRoutePlanner(proxy);
CloseableHttpClient httpclient = HttpClients.custom()
                .setRoutePlanner(routePlanner)
                .build();

以下代码,

/**
* How to send a request via proxy.
*
* @since 4.0
*/
public class ClientExecuteProxy {

public static void main(String[] args)throws Exception {
    CloseableHttpClient httpclient = HttpClients.createDefault();
    try {
        HttpHost target = new HttpHost("httpbin.org", 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());
            System.out.println(EntityUtils.toString(response.getEntity()));
        } finally {
            response.close();
        }
    } finally {
        httpclient.close();
    }
}

}

有人可以解释为什么我们需要为HttpClient对象指定这样的代理以及HttpClient对象在这两种情况下的行为吗?

1 个答案:

答案 0 :(得分:1)

您需要HTTP代理才能连接到INTERNET。它类似于Web浏览器代理设置,为了访问某些网络,您需要配置代理。

要模仿HTTPClient api调用或任何Java URL调用,必须在调用对象中提供代理详细信息。 以下是调用发生的情况:  1. URL提交是对代理而不是目标主机完成的。  2.然后,代理连接到预期的URL。

这是转发代理方案(有时也有反向代理),所有网络请求都通过代理路由。此处代理对正在进行的网络呼叫不可见。

以上两个示例在httpclient对象中设置代理,第一个使用构建器模式,第二个是在httpclient中设置代理的逐步执行。两者似乎表现相同。

在我看来,您仍然需要通过设置JVM代理选项来配置Java级代理详细信息。