2017-01-23 87 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

相關問題