2017-01-23 86 views
1

我想获得为HttpClient对象设置代理的想法。我发现下面的代码。当我为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

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

要与HTTPClient api调用或任何Java URL调用模拟相同,必须在调用对象中提供代理详细信息。 以下是拨打电话时发生的情况: 1.网址提交是对代理完成的,而不是预期的主机。 2.代理然后连接到预期的URL。

这是正向代理方案(有时也有逆向代理),并且所有网络请求都通过代理进行路由。这里代理对正在进行的网络呼叫不可见。

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

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

+0

感谢您的回复。 “在我看来,你仍然需要通过设置JVM代理选项来配置Java级代理细节。”请你详细说明这个声明。 – prime

+0

您可以设置VM代理详细信息,如: -Dhttp.proxyHost =主机名 -Dhttp.proxyPort =端口 – amitmah

相关问题