我发现设置 http.proxyHost 和 http.proxyPort 对 httpClient 没有用。如何通过环境变量或VM参数或类似的东西强制httpClient使用代理而不更改代码?
5 回答
在https://issues.apache.org/jira/browse/HTTPCLIENT-1128
SystemDefaultHttpClient 已添加到版本。4.2
HTTP 客户端(我的情况是 v 4.5.1)可以像这样使用系统代理:
HttpClient httpClient = HttpClientBuilder.create().useSystemProperties().build();
//or
HttpClient httpClient = HttpClients.createSystem();
您可以HttpClient
使用client.getHostConfiguration().setProxy(host, port)
方法自行强制代理。我通常创建包装类HttpClient
,在初始化这个类时,我从任何来源(环境变量......)设置代理。
我java.net.ProxySelector.setDefault(new MyProxySelector())
在无法直接设置代理的情况下使用HttpClient
. 您必须实现自己的 ProxySelector 类,并且方法 select 根据请求的 URI 进行代理选择。您可以进行 url->proxy 映射以将特定的 URI 地址配置为所需的代理,或为所有请求的 URI 全局返回一个代理。
正如我在 HttpClient 源代码中看到的,没有其他方法可以配置代理仅 setProxy 方法。我正在使用 commons-httpclient-3.1。
AFAIK,如果不更改代码,您将无法管理此问题,但您可以通过使用自己的连接管理器来更接近本机行为。请参阅ProxySelector 将 URL 的方案从 https:// 更改为 socket://
这有帮助吗?
System.setProperty("https.proxyHost", proxy_host);
System.setProperty("http.proxyHost", proxy_host);
System.setProperty("https.proxyPort", proxy_port);
System.setProperty("http.proxyPort", proxy_port);
或者当然你可以通过命令行传递相同的属性