Configurar o cliente HTTP baseado em URLConnection - AWS SDK for Java 2.x

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Configurar o cliente HTTP baseado em URLConnection

O AWS SDK for Java 2.x oferece um cliente UrlConnectionHttpClient HTTP mais leve em comparação com o padrão. ApacheHttpClient O UrlConnectionHttpClient é baseado no URLConnection do Java.

O UrlConnectionHttpClient é carregado mais rapidamente do que o cliente HTTP baseado em Apache, mas tem menos recursos. Por carregar mais rapidamente, é uma boa solução para funções AWS Lambda do Java.

O UrlConnectionHttpClient possui várias opções configuráveis que você pode acessar.

nota

O UrlConnectionHttpClient não é compatível com o método HTTP PATCH.

Algumas operações de AWS API exigem solicitações de PATCH. Esses nomes de operação geralmente começam com Update*. Veja alguns exemplos a seguir.

Se você puder usar oUrlConnectionHttpClient, primeiro consulte a Referência da API para o Serviço da AWS que você está usando. Verifique se as operações necessárias usam a operação PATCH.

Acesse o UrlConnectionHttpClient

Para configurar e usar o UrlConnectionHttpClient, você declara uma dependência do artefato url-connection-client do Maven em seu arquivo pom.xml.

Ao contrário do ApacheHttpClient, o UrlConnectionHttpClient não é adicionado automaticamente ao seu projeto; portanto, quando usado, ele deve ser declarado especificamente.

O exemplo de arquivo pom.xml a seguir mostra as dependências necessárias para usar e configurar o cliente HTTP.

<dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>bom</artifactId> <version>2.17.290</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>

Usar e configurar o UrlConnectionHttpClient

Você pode configurar uma instância do UrlConnectionHttpClient junto com a criação de um cliente de serviço ou pode configurar uma única instância para compartilhar entre vários clientes de serviço.

Com qualquer abordagem, você usa o UrlConnectionHttpClient.Builder para configurar as propriedades do cliente HTTP baseado em URLConnection.

Prática recomendada: dedicar uma instância do UrlConnectionHttpClient a um cliente de serviço

Se você precisar configurar uma instância do UrlConnectionHttpClient, recomendamos que você crie a instância UrlConnectionHttpClient dedicada. Faça isso usando o método httpClientBuilder do builder do cliente do serviço. Dessa forma, o ciclo de vida do cliente HTTP é gerenciado pelo SDK, o que ajuda a evitar possíveis vazamentos de memória se a instância do UrlConnectionHttpClient não for fechada quando não for mais necessária.

O exemplo a seguir cria umS3Client e configura a instância embutida do UrlConnectionHttpClient com os valores socketTimeout e proxyConfiguration. O método proxyConfiguration usa uma expressão lambda Java do tipo Consumer<ProxyConfiguration.Builder>.

Importações

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

Código

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

Abordagem alternativa: compartilhar uma instância do UrlConnectionHttpClient

Para ajudar a reduzir o uso de recursos e memória do seu aplicativo, você pode configurar um UrlConnectionHttpClient e compartilhá-lo entre vários clientes de serviço. O pool de conexões HTTP será compartilhado, o que reduz o uso de recursos.

nota

Quando uma instância do UrlConnectionHttpClient é compartilhada, você deve fechá-la quando ela estiver pronta para ser descartada. O SDK não fechará a instância quando o cliente de serviço for fechado.

O exemplo a seguir configura um cliente HTTP baseado em URLConnection, que é usado por dois clientes de serviço. A instância UrlConnectionHttpClient configurada é transmitida ao método httpClient de cada criador. Quando os clientes do serviço e o cliente HTTP não são mais necessários, o código os fecha explicitamente. O código fecha o cliente HTTP por último.

Importações

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;

Código

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();

Ao usar o UrlConnectionHttpClient na aplicação, é necessário fornecer a cada cliente de serviço uma instância URLConnectionHttpClient ou ApacheHttpClient usando o método httpClientBuilder do criador do cliente de serviço.

Uma exceção ocorre se o programa usar vários clientes do serviço e estas duas condições forem verdadeiras:

  • Um cliente de serviço está configurado para usar uma instância do UrlConnectionHttpClient

  • Outro cliente de serviço usa o ApacheHttpClient padrão sem criá-lo explicitamente com os métodos httpClient() ou httpClientBuilder()

A exceção indicará que várias implementações HTTP foram encontradas no caminho de classe.

O exemplo de trecho de código a seguir leva a uma exceção.

// 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();

Evite a exceção configurando explicitamente o S3Client com um 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();
nota

Para criar explicitamente o ApacheHttpClient, você deve adicionar uma dependência do artefato apache-client em seu arquivo de projeto do Maven.

Exemplo de configuração do proxy

O trecho de código a seguir usa o builder de configuração de proxy para o cliente HTTP da conexão do URL.

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();

As propriedades equivalentes do sistema Java para a configuração do proxy são mostradas no trecho da linha de comando a seguir.

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

A configuração equivalente que usa variáveis de ambiente é:

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

Atualmente, o cliente HTTP baseado em URLConnection não oferece suporte às propriedades do sistema proxy HTTPS ou à variável de ambiente HTTPS_PROXY.