本文概述了如何配置用于 Java 的 Azure SDK 以正确使用代理。
HTTP 代理配置
适用于 Java 的 Azure 客户端库提供了多种方法来为 HttpClient
配置代理。
提供代理的每个方法都有自己的优点和缺点,并提供不同的封装级别。 一旦为HttpClient
配置了代理,它将在其生命周期的剩余时间内使用该代理。 将代理绑定到个人 HttpClient
后,应用程序可以使用多个 HttpClient
实例,其中每个实例都可以使用不同的代理来满足应用程序的代理要求。
代理配置选项包括:
使用环境代理
默认情况下,HTTP 客户端生成器将检查环境是否有代理配置。 此过程使用用于 Java Configuration
API 的 Azure SDK。 当生成器创建客户端时,它将使用通过调用 Configuration.getGlobalConfiguration()
检索的“全局配置”的副本进行配置。 此调用将在系统环境中的任何 HTTP 代理配置中读取。
当生成器检查环境时,它将按指定的顺序搜索以下环境配置:
HTTPS_PROXY
HTTP_PROXY
https.proxy*
http.proxy*
*
表示著名的 Java 代理属性。 有关详细信息,请参阅 Oracle 文档中的 Java 网络和代理 。
如果生成器找到任何环境配置,则它通过调用ProxyOptions
创建实例ProxyOptions.fromConfiguration(Configuration.getGlobalConfiguration())
。 本文提供了有关该 ProxyOptions
类型的更多详细信息。
重要
若要使用任何代理配置,Java 要求将系统环境属性 java.net.useSystemProxies
设置为 true
。
还可以创建 HTTP 客户端实例,该实例不使用系统环境变量中存在的任何代理配置。 要覆盖默认行为,您需要在 HTTP 客户端生成器中显式设置一个不同配置的 Configuration
。 在生成器中设置 Configuration
时,它将不再调用 Configuration.getGlobalConfiguration()
。 例如,如果使用 configuration(Configuration)
调用 Configuration.NONE
,则可以明确阻止生成器检查环境配置。
以下示例使用值为 HTTP_PROXY
的 localhost:8888
环境变量,将 Fiddler 用作代理。 此代码演示如何创建 Netty 和 OkHttp HTTP 客户端。 (有关 HTTP 客户端配置的详细信息,请参阅 HTTP 客户端和管道。
export HTTP_PROXY=localhost:8888
HttpClient nettyHttpClient = new NettyAsyncHttpClientBuilder().build();
HttpClient okhttpHttpClient = new OkHttpAsyncHttpClientBuilder().build();
若要防止使用环境代理,请使用以下示例所示配置 HTTP 客户端生成器 Configuration.NONE
:
HttpClient nettyHttpClient = new NettyAsyncHttpClientBuilder()
.configuration(Configuration.NONE)
.build();
HttpClient okhttpHttpClient = new OkHttpAsyncHttpClientBuilder()
.configuration(Configuration.NONE)
.build();
使用配置代理
可以配置 HTTP 客户端生成器以使用自定义 Configuration
,并使用已从环境中接受的相同代理设置,而不是从环境中读取。 此配置提供可重用配置的功能,这些配置的范围限定为有限的用例。 当 HTTP 客户端生成器构建HttpClient
时,它将使用从ProxyOptions
返回的ProxyOptions.fromConfiguration(<Configuration passed into the builder>)
。
以下示例使用 http.proxy*
对象中设置的 Configuration
配置来使用将 Fiddler 验证为代理的代理。
Configuration configuration = new Configuration()
.put("java.net.useSystemProxies", "true")
.put("http.proxyHost", "localhost")
.put("http.proxyPort", "8888")
.put("http.proxyUser", "1")
.put("http.proxyPassword", "1");
HttpClient nettyHttpClient = new NettyAsyncHttpClientBuilder()
.configuration(configuration)
.build();
HttpClient okhttpHttpClient = new OkHttpAsyncHttpClientBuilder()
.configuration(configuration)
.build();
使用显式代理
Java 客户端库附带一个 ProxyOptions
类,该类充当用于配置代理的 Azure 客户端库类型。 可以使用用于发送代理请求、代理地址、代理身份验证凭据和非代理主机的网络协议进行配置 ProxyOptions
。 只需要代理网络协议和代理地址。 使用身份验证凭据时,必须同时设置用户名和密码。
以下示例创建一个简单的 ProxyOptions
实例,该实例将请求代理到默认 Fiddler 地址(localhost:8888
):
ProxyOptions proxyOptions = new ProxyOptions(ProxyOptions.Type.HTTP, new InetSocketAddress("localhost", 8888));
以下示例创建一个经过身份验证的 ProxyOptions
,将请求代理到需要代理身份验证的 Fiddler 实例:
// Fiddler uses username "1" and password "1" with basic authentication as its proxy authentication requirement.
ProxyOptions proxyOptions = new ProxyOptions(ProxyOptions.Type.HTTP, new InetSocketAddress("localhost", 8888))
.setCredentials("1", "1");
可以将 HTTP 客户端生成器 ProxyOptions
配置为直接指示要使用的显式代理。 此配置是提供代理的最精细的方式,并且通常不如传递可以变异以更新代理要求的 Configuration
那么灵活。
以下示例使用 ProxyOptions
将 Fiddler 用作代理:
ProxyOptions proxyOptions = new ProxyOptions(ProxyOptions.Type.HTTP, new InetSocketAddress("localhost", 8888));
HttpClient nettyHttpClient = new NettyAsyncHttpClientBuilder()
.proxy(proxyOptions)
.build();
HttpClient okhttpHttpClient = new OkHttpAsyncHttpClientBuilder()
.proxy(proxyOptions)
.build();
后续步骤
熟悉 Azure SDK for Java 中的代理配置后,请参阅 Azure SDK for Java 中的“配置跟踪 ”,以便更好地了解应用程序中的流,并帮助诊断问题。