設定 URLConnection型HTTP用戶端 - AWS SDK for Java 2.x

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

設定 URLConnection型HTTP用戶端

相較於預設 , AWS SDK for Java 2.x 提供重量更輕的UrlConnectionHttpClientHTTP用戶端ApacheHttpClientUrlConnectionHttpClient 是以 Java 的 為基礎URLConnection

UrlConnectionHttpClient 載入速度比 Apache 型HTTP用戶端更快,但功能較少。由於載入速度更快,因此它是 Java AWS Lambda 函數的良好解決方案

UrlConnectionHttpClient 有數個可設定的選項可供您存取。

注意

UrlConnectionHttpClient 不支援 HTTPPATCH方法。

少數 AWS API操作需要PATCH請求。這些操作名稱通常以 開頭Update*。以下是幾個範例。

如果您可以使用 UrlConnectionHttpClient,請先參考 AWS 服務 您正在使用的 API 參考。檢查您所需的操作是否使用 PATCH操作。

存取 UrlConnectionHttpClient

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

與 不同ApacheHttpClientUrlConnectionHttpClient 不會自動新增至您的專案,因此使用 必須明確宣告。

下列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

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

使用任一方法時,您可以使用 UrlConnectionHttpClient.Builder 來設定 URLConnection型HTTP用戶端的屬性。

最佳實務:將UrlConnectionHttpClient執行個體專用於服務用戶端

如果您需要設定 的執行個體UrlConnectionHttpClient,建議您建置專用UrlConnectionHttpClient執行個體。您可以使用服務用戶端建置器httpClientBuilder的方法來執行此操作。如此一來,HTTP用戶端的生命週期會由 管理SDK,如果UrlConnectionHttpClient執行個體不再需要,則有助於避免潛在的記憶體洩漏。

下列範例會建立 ,S3Client並使用 UrlConnectionHttpClientsocketTimeoutproxyConfiguration值設定 的內嵌執行個體。此proxyConfiguration方法採用類型 的 Java lambda 表達式 Consumer<ProxyConfiguration.Builder>

匯入

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執行個體

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

注意

共用UrlConnectionHttpClient執行個體時,您必須在準備好進行處置時將其關閉。服務用戶端關閉時, SDK不會關閉執行個體。

下列範例會設定兩個服務HTTP用戶端所使用的 URLConnection型用戶端。設定的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在應用程式中使用 時,您必須使用服務用戶端建置器httpClientBuilder的方法為每個服務用戶端提供URLConnectionHttpClient執行個體或ApacheHttpClient執行個體。

如果您的程式使用多個服務用戶端,且下列兩項都為 true,則會發生例外狀況:

  • 一個服務用戶端設定為使用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成品新增相依性

Proxy 組態範例

下列程式碼片段使用URL連線HTTP用戶端 的代理組態建置器

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_PROXY 環境變數。