配置 HTTP 代理
您可以通过使用代码、设置 Java 系统属性或设置环境变量来配置 HTTP 代理。
在代码中配置
在生成服务客户端时,您可以使用特定于客户端的 ProxyConfiguration 生成器在代码中配置代理。以下代码显示了 Amazon S3 服务客户端所用的基于 Apache 的 HTTP 客户端的示例代理配置。
SdkHttpClient httpClient1 = ApacheHttpClient.builder() .proxyConfiguration(ProxyConfiguration.builder() .endpoint(URI.create("http://proxy.example.com")) .username("username") .password("password") .addNonProxyHost("localhost") .build()) .build(); S3Client s3Client = S3Client.builder() .httpClient(httpClient) .build();
本主题中提及的每个 HTTP 客户端都在其详细介绍部分提供了一个代理配置示例。
使用外部设置配置 HTTP 代理
即使您没有在代码中明确使用 ProxyConfiguration 生成器,SDK 也会查找外部设置来配置默认代理配置。
默认情况下,SDK 先搜索 JVM 系统属性。即使只找到一个属性,SDK 也会使用该值和任何其他系统属性值。如果没有可用的系统属性,SDK 会查找代理环境变量。
SDK 可以使用以下 Java 系统属性和环境变量。
| 系统属性 | 描述 | HTTP 客户端支持 |
|---|---|---|
|
http.proxyHost |
HTTP 代理服务器主机名 |
全部 |
|
http.proxyPort |
HTTP 代理服务器端口号 |
全部 |
| http.proxyUser |
HTTP 代理身份验证用户名 |
全部 |
|
http.proxyPassword |
HTTP 代理身份验证密码 |
全部 |
| http.nonProxyHosts |
应绕过代理直接访问的主机列表。使用 HTTPS 时此列表也有效 |
全部 |
| https.proxyHost |
HTTPS 代理服务器主机名 |
Netty、CRT |
|
https.proxyPort |
HTTPS 代理服务器端口号 |
Netty、CRT |
| https.proxyUser |
HTTPS 代理身份验证用户名 |
Netty、CRT |
| https.proxyPassword | HTTPS 代理身份验证密码 | Netty、CRT |
| 环境变量 | 描述 | HTTP 客户端支持 |
|---|---|---|
| HTTP_PROXY1 |
采用 HTTP 架构的有效 URL |
全部 |
|
HTTPS_PROXY1 |
采用 HTTPS 架构的有效 URL |
Netty、CRT |
| NO_PROXY2 |
应绕过代理直接访问的主机列表。该列表对 HTTP 和 HTTPS 均有效。 |
全部 |
全部 - SDK 提供全部 HTTP 客户端(UrlConnectionHttpClient、ApacheHttpClient、NettyNioAsyncHttpClient、AwsCrtAsyncHttpClient)。
Netty - 基于 Netty 的 HTTP 客户端(NettyNioAsyncHttpClient)。
CRT - 基于 AWS CRT 的 HTTP 客户端(AwsCrtHttpClient 和 AwsCrtAsyncHttpClient)。
1查询的环境变量(HTTP_PROXY 或 HTTPS_PROXY)取决于客户端的 ProxyConfiguration 中的架构设置。默认架构是 HTTP。以下代码段说明如何将用于环境变量解析的架构更改为 HTTPS。
SdkHttpClient httpClient = ApacheHttpClient.builder() .proxyConfiguration(ProxyConfiguration.builder() .scheme("https") .build()) .build();
2NO_PROXY 环境变量支持在主机名之间混用“|”和“,”分隔符。主机名可能包括“*”通配符。
使用多种设置的组合
您可以在代码、系统属性和环境变量中组合使用 HTTP 代理设置。
例 - 系统属性和代码提供的配置
// Command line with the proxy password set as a system property. $ java -Dhttp.proxyPassword=SYS_PROP_password -cp ... App // Since the 'useSystemPropertyValues' setting is 'true' (the default), the SDK will supplement // the proxy configuration in code with the 'http.proxyPassword' value from the system property. SdkHttpClient apacheHttpClient = ApacheHttpClient.builder() .proxyConfiguration(ProxyConfiguration.builder() .endpoint(URI.create("http://localhost:1234")) .username("username") .build()) .build(); // Use the apache HTTP client with proxy configuration. DynamoDbClient dynamoDbClient = DynamoDbClient.builder() .httpClient(apacheHttpClient) .build();
SDK 解析以下代理设置。
Host = localhost Port = 1234 Password = SYS_PROP_password UserName = username Non ProxyHost = null
例 - 系统属性和环境变量都可用
每个 HTTP 客户端的 ProxyConfiguration 生成器都提供名为 useSystemPropertyValues 和 useEnvironmentVariablesValues 的设置。默认情况下,两个设置均为 true。当设置为 true 时,SDK 会自动将来自系统属性或环境变量的值用于 ProxyConfiguration 生成器未提供的选项。
重要
系统属性优先于环境变量。如果找到 HTTP 代理系统属性,SDK 将从系统属性中检索全部值,而不会从环境变量中检索任何值。如果要使环境变量优先于系统属性,请将 useSystemPropertyValues 设置为 false。
在本示例中,以下设置在运行时可用:
// System properties http.proxyHost=SYS_PROP_HOST.com http.proxyPort=2222 http.password=SYS_PROP_PASSWORD http.user=SYS_PROP_USER // Environment variables HTTP_PROXY="http://EnvironmentUser:EnvironmentPassword@ENV_VAR_HOST:3333" NO_PROXY="environmentnonproxy.host,environmentnonproxy2.host:1234"
使用以下语句之一创建服务客户端。这些语句都没有明确设置代理设置。
DynamoDbClient client = DynamoDbClient.create(); DynamoDbClient client = DynamoDbClient.builder().build(); DynamoDbClient client = DynamoDbClient.builder() .httpClient(ApacheHttpClient.builder() .proxyConfiguration(ProxyConfiguration.builder() .build()) .build()) .build();
SDK 解析以下代理设置:
Host = SYS_PROP_HOST.com Port = 2222 Password = SYS_PROP_PASSWORD UserName = SYS_PROP_USER Non ProxyHost = null
由于服务客户端具有默认代理设置,因此 SDK 会搜索系统属性,然后搜索环境变量。由于系统属性设置优先于环境变量,因此 SDK 仅使用系统属性。
如果将系统属性的使用更改为 false,如以下代码所示,则 SDK 仅解析环境变量。
DynamoDbClient client = DynamoDbClient.builder() .httpClient(ApacheHttpClient.builder() .proxyConfiguration(ProxyConfiguration.builder() .useSystemPropertyValues(Boolean.FALSE) .build()) .build()) .build();
使用 HTTP 解析的代理设置包括:
Host = ENV_VAR_HOST Port = 3333 Password = EnvironmentPassword UserName = EnvironmentUser Non ProxyHost = environmentnonproxy.host, environmentnonproxy2.host:1234