本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
設定 URLConnection型HTTP用戶端
相較於預設 , AWS SDK for Java 2.x 提供重量更輕的UrlConnectionHttpClient
HTTP用戶端ApacheHttpClient
。UrlConnectionHttpClient
是以 Java 的 為基礎URLConnection
。
UrlConnectionHttpClient
載入速度比 Apache 型HTTP用戶端更快,但功能較少。由於載入速度更快,因此它是 Java AWS Lambda 函數的良好解決方案。
UrlConnectionHttpClient
有數個可設定的選項
注意
UrlConnectionHttpClient
不支援 HTTPPATCH方法。
少數 AWS API操作需要PATCH請求。這些操作名稱通常以 開頭Update*
。以下是幾個範例。
-
和 AWS Security Hub API 中的數個
Update*
操作 BatchUpdateFindings -
所有 Amazon API Gateway API
Update*
操作 -
Amazon 中的數個
Update*
操作 WorkDocs API
如果您可以使用 UrlConnectionHttpClient
,請先參考 AWS 服務 您正在使用的 API 參考。檢查您所需的操作是否使用 PATCH操作。
存取 UrlConnectionHttpClient
若要設定和使用 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
您可以設定 執行個體,UrlConnectionHttpClient
以及建置服務用戶端,也可以設定單一執行個體在多個服務用戶端之間共用。
使用任一方法時,您可以使用 UrlConnectionHttpClient.Builder
最佳實務:將UrlConnectionHttpClient
執行個體專用於服務用戶端
如果您需要設定 的執行個體UrlConnectionHttpClient
,建議您建置專用UrlConnectionHttpClient
執行個體。您可以使用服務用戶端建置器httpClientBuilder
的方法來執行此操作。如此一來,HTTP用戶端的生命週期會由 管理SDK,如果UrlConnectionHttpClient
執行個體不再需要,則有助於避免潛在的記憶體洩漏。
下列範例會建立 ,S3Client
並使用 UrlConnectionHttpClient
socketTimeout
和 proxyConfiguration
值設定 的內嵌執行個體。此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 環境變數。