

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

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

相較於預設 ， AWS SDK for Java 2.x 提供更輕量的 `[UrlConnectionHttpClient](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/urlconnection/UrlConnectionHttpClient.html)` HTTP 用戶端`ApacheHttpClient`。`UrlConnectionHttpClient` 是以 Java 的 為基礎`[URLConnection](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/net/URLConnection.html)`。

`UrlConnectionHttpClient` 載入速度比 Apache 型 HTTP 用戶端更快，但功能較少。因為它的載入速度更快，因此是 Java AWS Lambda 函數的理想[解決方案](lambda-optimize-starttime.md)。

`UrlConnectionHttpClient` 有數個[可設定的選項](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/urlconnection/UrlConnectionHttpClient.Builder.html)可供您存取。

**注意**  
`UrlConnectionHttpClient` 不支援 HTTP PATCH 方法。  
少數 AWS API 操作需要 PATCH 請求。這些操作名稱通常以 開頭`Update*`。以下是幾個範例。  
 AWS Security Hub CSPM API 和 [BatchUpdateFindings](https://docs.aws.amazon.com/securityhub/1.0/APIReference/API_BatchUpdateFindings.html) [`Update*`操作中的數個](https://docs.aws.amazon.com/securityhub/1.0/APIReference/API_Operations.html)操作
所有 Amazon API Gateway API [`Update*`操作](https://docs.aws.amazon.com/apigateway/latest/api/API_UpdateAccount.html)
如果您可以使用 `UrlConnectionHttpClient`，請先參閱您正在使用的 AWS 服務 的 API 參考。檢查您所需的操作是否使用 PATCH 操作。

## 存取 `UrlConnectionHttpClient`
<a name="http-url-dependency"></a>

若要設定和使用 `UrlConnectionHttpClient`，您可以宣告對 `pom.xml` 檔案中 `url-connection-client` Maven 成品的相依性。

與 不同`ApacheHttpClient`， `UrlConnectionHttpClient` 不會自動新增至您的專案，因此使用 必須特別宣告。

下列`pom.xml`檔案範例顯示使用和設定 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>

<!-- other dependencies such as s3 or dynamodb -->

<dependencies>
    <dependency>
        <groupId>software.amazon.awssdk</groupId>
        <artifactId>url-connection-client</artifactId>
    </dependency>
</dependencies>
```

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

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

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

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

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

下列範例會建立 ，`S3Client`並使用 `UrlConnectionHttpClient``socketTimeout`和 `proxyConfiguration`值設定 的內嵌執行個體。`proxyConfiguration` 方法採用類型 的 Java lambda 表達式` Consumer<[ProxyConfiguration.Builder](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/urlconnection/ProxyConfiguration.Builder.html)>`。

 **匯入** 

```
import software.amazon.awssdk.http.SdkHttpClient;
import software.amazon.awssdk.http.urlconnection.UrlConnectionHttpClient;
import java.net.URI;
import java.time.Duration;
```

 **Code** 

```
// Singleton: Use the s3Client for all requests.
S3Client s3Client = 
    S3Client.builder()
            .httpClientBuilder(UrlConnectionHttpClient.builder()
                    .socketTimeout(Duration.ofMinutes(5))
                    .proxyConfiguration(proxy -> proxy.endpoint(URI.create("http://proxy.mydomain.net:8888"))))
            .credentialsProvider(EnvironmentVariableCredentialsProvider.create())
            .build();

// Perform work with the s3Client.

s3Client.close();   // Requests completed: Close the s3client.
```

### 替代方法：共用`UrlConnectionHttpClient`執行個體
<a name="http-config-url-multi-clients"></a>

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

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

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

**匯入**

```
import software.amazon.awssdk.auth.credentials.EnvironmentVariableCredentialsProvider;
import software.amazon.awssdk.awscore.defaultsmode.DefaultsMode;
import software.amazon.awssdk.http.SdkHttpClient;
import software.amazon.awssdk.http.urlconnection.ProxyConfiguration;
import software.amazon.awssdk.http.urlconnection.UrlConnectionHttpClient;
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
import software.amazon.awssdk.services.s3.S3Client;
import java.net.URI;
import java.time.Duration;
```

 **Code** 

```
SdkHttpClient urlHttpClient = UrlConnectionHttpClient.create();

// Singletons: Use the s3Client and dynamoDbClient for all requests.
S3Client s3Client = 
    S3Client.builder()
            .httpClient(urlHttpClient)
            .defaultsMode(DefaultsMode.IN_REGION)
            .credentialsProvider(EnvironmentVariableCredentialsProvider.create())
            .build();

DynamoDbClient dynamoDbClient = 
    DynamoDbClient.builder()
                  .httpClient(urlHttpClient)
                  .defaultsMode(DefaultsMode.IN_REGION)
                  .credentialsProvider(EnvironmentVariableCredentialsProvider.create())
                  .build();

// Perform work with the s3Client and dynamoDbClient.

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

#### 同時使用 `URLConnectionHttpClient`和 `ApacheHttpClient`
<a name="http-config-url-caveat"></a>

當您`UrlConnectionHttpClient`在應用程式中使用 時，您必須使用服務用戶端建置器的 `httpClientBuilder`方法，為每個服務用戶端提供`URLConnectionHttpClient`執行個體或`ApacheHttpClient`執行個體。

如果您的程式使用多個服務用戶端，且符合下列兩項，則會發生例外狀況：
+ 一個服務用戶端設定為使用`UrlConnectionHttpClient`執行個體
+ 另一個服務用戶端使用預設值，`ApacheHttpClient`而不使用 `httpClient()`或 `httpClientBuilder()`方法明確建置預設值

例外狀況將指出在 classpath 上找到多個 HTTP 實作。

下列程式碼片段範例會導致例外狀況。

```
// The dynamoDbClient uses the UrlConnectionHttpClient
DynamoDbClient dynamoDbClient = DynamoDbClient.builder()
        .httpClient(UrlConnectionHttpClient.create())
        .build();

// The s3Client below uses the ApacheHttpClient at runtime, without specifying it.
// An SdkClientException is thrown with the message that multiple HTTP implementations were found on the classpath.
S3Client s3Client = S3Client.create();

// Perform work with the s3Client and dynamoDbClient.

dynamoDbClient.close();
s3Client.close();
```

`S3Client` 使用 明確設定 ，以避免例外狀況`ApacheHttpClient`。

```
DynamoDbClient dynamoDbClient = DynamoDbClient.builder()
        .httpClient(UrlConnectionHttpClient.create())
        .build();

S3Client s3Client = S3Client.builder()
        .httpClient(ApacheHttpClient.create())    // Explicitly build the ApacheHttpClient.
        .build();

// Perform work with the s3Client and dynamoDbClient.

dynamoDbClient.close();
s3Client.close();
```

**注意**  
若要明確建立 `ApacheHttpClient`，您必須對 Maven 專案檔案中的`apache-client`成品[新增相依性](http-configuration-apache.md#http-apache-dependency)。

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

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

```
SdkHttpClient urlHttpClient = UrlConnectionHttpClient.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 = UrlConnectionHttpClient.builder()
                .proxyConfiguration(ProxyConfiguration.builder()
                        .useSystemPropertyValues(Boolean.FALSE)
                        .build())
                .build();

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

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