本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
配置 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_PROXY 1 |
采用 HTTP 架构的有效网址 |
全部 |
HTTPS_PROXY 1 |
采用 HTTPS 架构的有效网址 |
Netty、CRT |
NO_PROXY 2 |
应绕过代理直接访问的主机列表。该列表对于 HTTP 和 HTTPS 均有效。 |
全部 |
全部-SDK 提供的所有 HTTP 客户端— UrlConnectionHttpClient
ApacheHttpClient
、、NettyNioAsyncHttpClient
、AwsCrtAsyncHttpClient
。
Netty-基于 Netty 的 HTTP 客户端 ()。NettyNioAsyncHttpClient
CRT- Amazon 基于 CRT 的 HTTP 客户端,(AwsCrtHttpClient
和)。AwsCrtAsyncHttpClient
1 查询的环境变量(HTTP_PROXY
是否HTTPS_PROXY
为)取决于客户端中的方案设置。ProxyConfiguration
默认方案是 HTTP。以下代码段显示了如何将用于环境变量解析的方案更改为 HTTPS。
SdkHttpClient httpClient = ApacheHttpClient.builder() .proxyConfiguration(ProxyConfiguration.builder() .scheme("https") .build()) .build();
2 NO_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