使用org.apache.commons.httpclient时,我可以在命令行上设置代理吗?

时间:2010-12-01 11:57:38

标签: java http proxy apache-commons

如果应用程序使用java.net。*例程,我可以在调用这样的应用程序时设置代理:

java -Dhttp.proxyHost=proxy.server.com -Dhttp.proxyPort=8000 <whatever-the-app-is>

但是,我有一个应用程序(我无法更改)使用org.apache.commons.httpclient来进行http通信。它没有指定procxy服务器,但它确实使用默认的HttpConnection。有什么方法可以从命令行告诉apache http客户端使用代理服务器吗?

3 个答案:

答案 0 :(得分:5)

不幸的是,我认为你不能。唯一的方法是让应用程序读取System属性,然后在DefaultHttpParams对象中设置它。

有关详细信息,请查看httpclient-user组中的this thread

答案 1 :(得分:5)

使用HTTPClient构建器时,使用useSystemProperties()方法启用标准JVM -D代理参数。
http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/impl/client/HttpClientBuilder.html#useSystemProperties()

示例:

CloseableHttpClient httpclient = HttpClients.custom()
    .useSystemProperties()
    .build();

现在使用-Dhttp.proxyHost = 10.0.0.100 -Dhttp.proxyPort = 8800来配置代理。

答案 2 :(得分:1)

我不这么认为。但是这里有一个代码,我在一个旧项目中找到了这个代码,应该可以工作:

try {
   String proxyHost = System.getProperty("https.proxyHost");
   int proxyPort = 0;
   try {
        proxyPort = Integer.parseInt(System.getProperty("https.proxyPort"));
   } catch (Exception ex) {
        System.out.println("No proxy port found");
   }

   System.setProperty("java.net.useSystemProxies", "true");

   ProxySelector ps = ProxySelector.getDefault();
   List<Proxy> proxyList = ps.select(new URI(targetUrl));
   Proxy proxy = proxyList.get(0);
   if (proxy != null) {
         InetSocketAddress addr = ((InetSocketAddress) proxy.address());
         if (addr != null) {
             proxyHost = addr.getHostName();
             proxyPort = addr.getPort();
         }
   }

   boolean useProxy = proxyHost != null && proxyHost.length() > 0;

   if (useProxy) {
         httpClient.getHostConfiguration().setProxy(proxyHost, proxyPort);
   }

} catch (Exception ex) {
   ex.printStackTrace();
}