Configurar o cliente HTTP baseado em Apache - 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 Apache

Os clientes de serviço síncrono AWS SDK for Java 2.x usam um cliente HTTP baseado em Apache, por padrão. ApacheHttpClient O SDK ApacheHttpClient é baseado no HttpClientApache.

O SDK também oferece o UrlConnectionHttpClient, que carrega mais rapidamente, mas tem menos recursos. Para obter mais informações sobre a configuração do UrlConnectionHttpClient, consulte Configurar o cliente HTTP baseado em URLConnection.

Para ver o conjunto completo de opções de configuração disponíveis para oApacheHttpClient, consulte ApacheHttpClient.Builder e ProxyConfiguration.Builder.

Acesse o ApacheHttpClient

Na maioria das situações, você usa o ApacheHttpClient sem nenhuma configuração explícita. Você vai declarar os clientes de serviço e o SDK vai configurar o ApacheHttpClient com valores padrão para você.

Se você quiser configurar o ApacheHttpClient explicitamente ou usá-lo com vários clientes de serviço, precisará disponibilizá-lo para configuração.

Nenhuma configuração necessária

Quando você declara uma dependência de um cliente de serviço no Maven, o SDK adiciona uma dependência de tempo de execução ao artefato apache-client. Isso torna a classe ApacheHttpClient disponível para o código em runtime, mas não no momento da compilação. Se você não estiver configurando o cliente HTTP baseado em Apache, não precisará especificar uma dependência para ele.

No seguinte trecho XML de um arquivo pom.xml do Maven, a dependência declarada com <artifactId>s3</artifactId> traz automaticamente o cliente HTTP baseado em Apache. Você não precisa declarar uma dependência especificamente para isso.

<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> <dependencies> <!-- The s3 dependency automatically adds a runtime dependency on the ApacheHttpClient--> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>s3</artifactId> </dependency> </dependencies>

Com essas dependências, você não pode fazer nenhuma alteração explícita na configuração HTTP, porque a biblioteca ApacheHttpClient está somente no caminho de classe em tempo de execução.

Configuração necessária

Para configurar o ApacheHttpClient, você precisa adicionar uma dependência na biblioteca apache-client em tempo de compilação.

Consulte o exemplo a seguir de um arquivo pom.xml do Maven para configurar o ApacheHttpClient.

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

Usar e configurar o ApacheHttpClient

Você pode configurar uma instância do ApacheHttpClient 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 ApacheHttpClient.Builder para configurar as propriedades do cliente HTTP baseado em Apache.

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

Se você precisar configurar uma instância do ApacheHttpClient, recomendamos que você crie a instância ApacheHttpClient 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 ApacheHttpClient não for fechada quando não for mais necessária.

O exemplo a seguir cria umS3Client e configura a instância embutida do ApacheHttpClient com os valores maxConnections e connectionTimeout. A instância HTTP é criada usando o método httpClientBuilder do S3Client.Builder.

Importações

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

Código

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.

Abordagem alternativa: compartilhar uma instância do ApacheHttpClient

Para ajudar a reduzir o uso de recursos e memória do seu aplicativo, você pode configurar um ApacheHttpClient 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 ApacheHttpClient é 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 Apache, que é usado por dois clientes de serviço. A instância ApacheHttpClient configurada é transmitida ao método httpClient de cada construtor. 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.http.SdkHttpClient; import software.amazon.awssdk.http.apache.ApacheHttpClient; import software.amazon.awssdk.services.dynamodb.DynamoDbClient; import software.amazon.awssdk.services.s3.S3Client;

Código

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.

Exemplo de configuração do proxy

O trecho de código a seguir usa o builder de configuração de proxy para o cliente Apache HTTP.

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

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 = ApacheHttpClient.builder() .proxyConfiguration(ProxyConfiguration.builder() .useSystemPropertyValues(Boolean.FALSE) .build()) .build(); // Run the application. // $ java -cp ... App
nota

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