本文介绍如何在Azure SDK中为Java配置代理,以便你可以通过所需的网络和安全边界路由客户端请求。
HTTP 代理配置
适用于 Java 的 Azure 客户端库提供了多种方法来为 HttpClient 配置代理。
提供代理的每个方法都有自己的优点和缺点,并提供不同的封装级别。 当你为某个 HttpClient 配置代理时,它会在其整个生命周期内一直使用该代理。 通过将代理绑定到单个 HttpClient实例,应用程序可以使用多个 HttpClient 实例,其中每个实例都可以使用不同的代理来满足应用程序的代理要求。
代理配置选项包括:
使用环境代理
默认情况下,HTTP 客户端生成器会检查环境是否有代理配置。 此过程使用用于 Java Configuration API 的 Azure SDK。 当生成器创建客户端时,它会使用通过调用 Configuration.getGlobalConfiguration()检索的全局配置的副本来配置客户端。 此调用从系统环境读取任何 HTTP 代理配置。
当生成器检查环境时,它会按指定的顺序搜索以下环境配置:
HTTPS_PROXYHTTP_PROXYhttps.proxy*http.proxy*
* 表示著名的 Java 代理属性。 有关详细信息,请参阅 Oracle 文档中的 Java 网络和代理 。
如果生成器找到任何环境配置,则它通过调用ProxyOptions创建实例ProxyOptions.fromConfiguration(Configuration.getGlobalConfiguration())。 本文提供有关该 ProxyOptions 类型的更多详细信息。
重要
若要隐式使用 HTTPS_PROXY 或 HTTP_PROXYJava 要求将系统环境属性 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.fromConfiguration(<Configuration passed into the builder>) 返回的 ProxyOptions。
以下示例使用 http.proxy* 对象中设置的 Configuration 配置来使用将 Fiddler 验证为代理的代理。
Configuration configuration = new ConfigurationBuilder()
.putProperty("http.proxyHost", "localhost")
.putProperty("http.proxyPort", "8888")
.putProperty("http.proxyUser", "1")
.putProperty("http.proxyPassword", "1")
.build();
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 中的“配置跟踪 ”,以便更好地了解应用程序中的流,并帮助诊断问题。