我正在尝试为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对象的行为吗?
最佳答案
您需要HTTP代理才能连接到INTERNET。它类似于Web浏览器的代理设置,在其中要访问某些网络,您需要配置代理。
为了模仿HTTPClient api调用或任何Java URL调用,必须在调用对象中提供代理详细信息。
拨打电话会发生以下情况:
1.将URL提交到代理而不是目标主机。
2.然后,代理连接到预期的URL。
这是前向代理方案(有时也有反向代理),所有网络请求都通过代理进行路由。在这里,代理对于正在进行的网络呼叫不可见。
以上两个示例在httpclient对象中设置代理,第一个使用构建器模式,第二个示例是逐步执行以在httpclient中设置代理。两者似乎表现相同。
我认为您仍然需要通过设置JVM代理选项来配置Java级代理详细信息。