

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 配置 HTTP 代理
<a name="http-config-proxy-support"></a>

您可以通过使用代码、设置 Java 系统属性或设置环境变量来配置 HTTP 代理。

## 在代码中配置
<a name="http-config-proxy-support-in-code"></a>

在生成服务客户端时，您可以使用特定于客户端的 `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 客户端都在其详细介绍部分提供了一个代理配置示例。
+ [Apache HTTP 客户端](http-configuration-apache.md#http-configuration-apache-proxy-conf-ex)
+ [URLConnection基于 HTTP 客户端](http-configuration-url.md#http-configuration-url-proxy-conf-ex)
+ [基于 Netty 的 HTTP 客户端](http-configuration-netty.md#http-config-netty-proxy-ex)
+ [AWS 基于 CRT 的 HTTP](http-configuration-crt.md#http-config-crt-proxy-ex)

## 使用外部设置配置 HTTP 代理
<a name="http-config-proxy-support-external"></a>

即使您没有在代码中明确使用 `ProxyConfiguration` 生成器，SDK 也会查找外部设置来配置默认代理配置。

默认情况下，SDK 先搜索 JVM 系统属性。即使只找到一个属性，SDK 也会使用该值和任何其他系统属性值。如果没有可用的系统属性，SDK 会查找代理环境变量。

SDK 可以使用以下 Java 系统属性和环境变量。


**Java 系统属性**  

| 系统属性 | 说明 | HTTP 客户端支持 | 
| --- | --- | --- | 
| http.proxyHost | HTTP 代理服务器主机名 | 全部 | 
| http.proxyPort | HTTP 代理服务器端口号 | 全部 | 
| http.proxyUser | HTTP 代理身份验证用户名 | 全部 | 
| http.proxyPassword | HTTP 代理身份验证密码 | 全部 | 
| http。 nonProxyHosts | 应绕过代理直接访问的主机列表。[使用 HTTPS 时此列表也有效](https://docs.oracle.com/javase/8/docs/technotes/guides/net/proxies.html)。 | 全部 | 
| 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 均有效。 | 全部 | 

### 查看要点和脚注
<a name="http-config-proxy-support-ext-key-footnote"></a>

**全部** - 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();
```

2`NO_PROXY` 环境变量支持在主机名之间混用“\|”和“,”分隔符。主机名可能包括“\*”通配符。

## 使用多种设置的组合
<a name="http-config-proxy-support-combo"></a>

您可以在代码、系统属性和环境变量中组合使用 HTTP 代理设置。

**Example - 系统属性和代码提供的配置**  

```
// 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
```

**Example - 系统属性和环境变量都可用**  
每个 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
```