

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 設定 Apache 型 HTTP 用戶端
<a name="http-configuration-apache"></a>

中的同步服務用戶端預設 AWS SDK for Java 2.x 使用 Apache 型 HTTP 用戶端 [ApacheHttpClient](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/apache/ApacheHttpClient.html)。開發套件的 `ApacheHttpClient` 是以 Apache [HttpClient](https://hc.apache.org/httpcomponents-client-4.5.x/index.html) 為基礎。

軟體開發套件也提供 [UrlConnectionHttpClient](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/urlconnection/UrlConnectionHttpClient.html)，可更快速載入，但功能較少。如需設定 的資訊`UrlConnectionHttpClient`，請參閱 [設定 URLConnection 型 HTTP 用戶端](http-configuration-url.md)。

若要查看您可用於 的完整組態選項集`ApacheHttpClient`，請參閱 [ApacheHttpClient.Builder](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/apache/ApacheHttpClient.Builder.html) 和 [ProxyConfiguration.Builder](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/apache/ProxyConfiguration.Builder.html)。

## 存取 `ApacheHttpClient`
<a name="http-apache-dependency"></a>

在大多數情況下，您會在沒有任何明確組態`ApacheHttpClient`的情況下使用 。您宣告您的服務用戶端，開發套件將使用`ApacheHttpClient`標準值為您設定 。

如果您想要明確設定 `ApacheHttpClient` 或將其與多個服務用戶端搭配使用，則需要將其用於組態。

### 不需要組態
<a name="http-config-apache-no-config"></a>

當您在 Maven 中宣告對服務用戶端的相依性時，軟體開發套件會新增對`apache-client`成品的*執行時間*相依性。這可讓 `ApacheHttpClient`類別在執行時間可供您的程式碼使用，但無法在編譯時間使用。如果您未設定 Apache 型 HTTP 用戶端，則不需要為其指定相依性。

在 Maven `pom.xml` 檔案的下列 XML 程式碼片段中，向 宣告的相依性`<artifactId>s3</artifactId>`會自動帶入以 Apache 為基礎的 HTTP 用戶端。您不需要特別為其宣告相依性。

```
<dependencyManagement>
   <dependencies>
        <dependency>
            <groupId>software.amazon.awssdk</groupId>
            <artifactId>bom</artifactId>
            <version>2.27.21</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
<dependencies>
    <!-- The s3 dependency automatically adds a runtime dependency on the ApacheHttpClient-->
    <dependency>
        <groupId>software.amazon.awssdk</groupId>
        <artifactId>s3</artifactId>
    </dependency>
</dependencies>
```

使用這些相依性時，您無法進行任何明確的 HTTP 組態變更，因為程式`ApacheHttpClient`庫僅位於執行時間 classpath 上。

### 需要的配置
<a name="http-config-apache-yes-config"></a>

若要設定 `ApacheHttpClient`，您需要在*編譯*時在程式`apache-client`庫上新增相依性。

請參閱下列 Maven `pom.xml` 檔案的範例來設定 `ApacheHttpClient`。

```
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>software.amazon.awssdk</groupId>
                <artifactId>bom</artifactId>
                <version>2.27.21</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>software.amazon.awssdk</groupId>
            <artifactId>s3</artifactId>
        </dependency>
        <!-- By adding the apache-client dependency, ApacheHttpClient will be added to 
             the compile classpath so you can configure it. -->
        <dependency>
            <groupId>software.amazon.awssdk</groupId>
            <artifactId>apache-client</artifactId>
        </dependency>
    </dependencies>
```

## 使用和設定 `ApacheHttpClient`
<a name="http-apache-config"></a>

您可以設定 執行個體`ApacheHttpClient`以及建置服務用戶端，也可以設定單一執行個體以在多個服務用戶端之間共用。

使用任一方法，您可以使用 `[ApacheHttpClient.Builder](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/apache/ApacheHttpClient.Builder.html)`來設定 Apache 型 HTTP 用戶端的屬性。

### 最佳實務：將`ApacheHttpClient`執行個體專用於服務用戶端
<a name="http-config-apache-recomm"></a>

如果您需要設定 的執行個體`ApacheHttpClient`，我們建議您建置專用`ApacheHttpClient`執行個體。您可以使用服務用戶端建置器的 `httpClientBuilder`方法來執行此操作。如此一來，HTTP 用戶端的生命週期由 SDK 管理，這有助於避免在`ApacheHttpClient`執行個體不再需要時關閉時造成潛在的記憶體流失。

下列範例會建立 ，`S3Client`並使用 `ApacheHttpClient``maxConnections`和 `connectionTimeout`值設定 的內嵌執行個體。HTTP 執行個體是使用 的 `httpClientBuilder`方法建立。 `S3Client.Builder`

 **匯入** 

```
import software.amazon.awssdk.http.apache.ApacheHttpClient;
import software.amazon.awssdk.services.s3.S3Client;
import java.time.Duration;
```

 **Code** 

```
S3Client s3Client = S3Client   // Singleton: Use the s3Client for all requests.
    .builder()
    .httpClientBuilder(ApacheHttpClient.builder()
        .maxConnections(100)
        .connectionTimeout(Duration.ofSeconds(5))
    ).build();

// Perform work with the s3Client.

s3Client.close();   // Requests completed: Close all service clients.
```

### 替代方法：共用`ApacheHttpClient`執行個體
<a name="http-config-apache-alt"></a>

為了協助降低應用程式的資源和記憶體用量，您可以設定 ，`ApacheHttpClient`並在多個服務用戶端之間共用。HTTP 連線集區將共用，這會降低資源用量。

**注意**  
共用`ApacheHttpClient`執行個體時，您必須在準備好進行處置時將其關閉。當服務用戶端關閉時，軟體開發套件不會關閉執行個體。

下列範例會設定兩個服務用戶端所使用的 Apache 型 HTTP 用戶端。設定的`ApacheHttpClient`執行個體會傳遞至每個建置器的 `httpClient`方法。當不再需要服務用戶端和 HTTP 用戶端時，程式碼會明確關閉它們。程式碼最後會關閉 HTTP 用戶端。

**匯入**

```
import software.amazon.awssdk.http.SdkHttpClient;
import software.amazon.awssdk.http.apache.ApacheHttpClient;
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
import software.amazon.awssdk.services.s3.S3Client;
```

 **Code** 

```
SdkHttpClient apacheHttpClient = ApacheHttpClient.builder()
        .maxConnections(100).build();

// Singletons: Use the s3Client and dynamoDbClient for all requests.
S3Client s3Client = 
    S3Client.builder()
            .httpClient(apacheHttpClient).build();

DynamoDbClient dynamoDbClient = 
    DynamoDbClient.builder()
                  .httpClient(apacheHttpClient).build();

// Perform work with the s3Client and dynamoDbClient.

// Requests completed: Close all service clients.
s3Client.close();
dynamoDbClient.close();
apacheHttpClient.close();  // Explicitly close apacheHttpClient.
```

## Proxy 組態範例
<a name="http-configuration-apache-proxy-conf-ex"></a>

下列程式碼片段使用 [Apache HTTP 用戶端的代理組態建置器](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/apache/ProxyConfiguration.Builder.html)。

```
SdkHttpClient apacheHttpClient = ApacheHttpClient.builder()
                .proxyConfiguration(ProxyConfiguration.builder()
                        .endpoint(URI.create("http://example.com:1234"))
                        .username("username")
                        .password("password")
                        .addNonProxyHost("localhost")
                        .addNonProxyHost("host.example.com")
                        .build())
                .build();
```

代理組態的同等 Java 系統屬性會顯示在下列命令列程式碼片段中。

```
$ java -Dhttp.proxyHost=example.com -Dhttp.proxyPort=1234 -Dhttp.proxyUser=username \
-Dhttp.proxyPassword=password -Dhttp.nonProxyHosts=localhost|host.example.com -cp ... App
```

使用環境變數的同等設定為：

```
// Set the following environment variables.
// $ export HTTP_PROXY="http://username:password@example.com:1234"
// $ export NO_PROXY="localhost|host.example.com"

// Set the 'useSystemPropertyValues' to false on the proxy configuration.
SdkHttpClient apacheHttpClient = ApacheHttpClient.builder()
                .proxyConfiguration(ProxyConfiguration.builder()
                        .useSystemPropertyValues(Boolean.FALSE)
                        .build())
                .build();

// Run the application.
// $ java -cp ... App
```

**注意**  
Apache HTTP 用戶端目前不支援 HTTPS 代理系統屬性或 HTTPS\$1PROXY 環境變數。