在 Azure SDK for Java 中配置代理

本文概述了如何配置用于 Java 的 Azure SDK 以正确使用代理。

HTTP 代理配置

适用于 Java 的 Azure 客户端库提供了多种方法来为 HttpClient 配置代理。

提供代理的每个方法都有自己的优点和缺点,并提供不同的封装级别。 一旦为HttpClient配置了代理,它将在其生命周期的剩余时间内使用该代理。 将代理绑定到个人 HttpClient 后,应用程序可以使用多个 HttpClient 实例,其中每个实例都可以使用不同的代理来满足应用程序的代理要求。

代理配置选项包括:

使用环境代理

默认情况下,HTTP 客户端生成器将检查环境是否有代理配置。 此过程使用用于 Java Configuration API 的 Azure SDK。 当生成器创建客户端时,它将使用通过调用 Configuration.getGlobalConfiguration()检索的“全局配置”的副本进行配置。 此调用将在系统环境中的任何 HTTP 代理配置中读取。

当生成器检查环境时,它将按指定的顺序搜索以下环境配置:

  1. HTTPS_PROXY
  2. HTTP_PROXY
  3. https.proxy*
  4. 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_PROXYlocalhost: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 中的“配置跟踪 ”,以便更好地了解应用程序中的流,并帮助诊断问题。