Configurar el cliente HTTP basado en URLConnection - AWS SDK for Java 2.x

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Configurar el cliente HTTP basado en URLConnection

AWS SDK for Java 2.x Ofrece un cliente UrlConnectionHttpClient HTTP más ligero en comparación con el predeterminado. ApacheHttpClient El UrlConnectionHttpClient se basa en el URLConnection de Java.

El UrlConnectionHttpClient se carga más rápido que el cliente HTTP basado en Apache, pero tiene menos características. Como se carga más rápido, es una buena solución para las funciones AWS Lambda de Java.

El UrlConnectionHttpClient tiene varias opciones configurables a las que puede acceder.

nota

El UrlConnectionHttpClient no admite el método HTTP PATCH.

Algunas operaciones de AWS API requieren solicitudes de PATCH. Los nombres de esas operaciones suelen empezar por Update*. A continuación se presentan varios ejemplos.

Si puedes usar laUrlConnectionHttpClient, consulta primero la referencia de la API Servicio de AWS que estés usando. Compruebe si las operaciones que necesita utilizan la operación PATCH.

Acceso al UrlConnectionHttpClient

Para configurar y utilizar el UrlConnectionHttpClient, debe declarar una dependencia en el artefacto Maven pom.xml de su archivo url-connection-client.

A diferencia del ApacheHttpClient, el UrlConnectionHttpClient se añade automáticamente al proyecto, por lo que el usuario debe declararlo específicamente.

El siguiente ejemplo de un archivo pom.xml muestra las dependencias necesarias para usar y configurar el 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>

Utilizar y configurar el UrlConnectionHttpClient

Puede configurar una instancia del UrlConnectionHttpClient junto con la creación de un cliente de servicio, o configurar una sola instancia para compartirla entre varios clientes de servicio.

Con cualquiera de los dos enfoques, se utiliza el UrlConnectionHttpClient.Builder para configurar las propiedades del cliente HTTP basado en URLConnection.

Práctica recomendada: dedicar una instancia de UrlConnectionHttpClient a un cliente de servicio

Si necesita configurar una instancia del UrlConnectionHttpClient, le recomendamos que cree la instancia UrlConnectionHttpClient dedicada. Puede hacerlo con el método httpClientBuilder del generador del cliente del servicio. De esta forma, el SDK administra el ciclo de vida del cliente HTTP, lo que ayuda a evitar posibles pérdidas de memoria si la instancia UrlConnectionHttpClient no se cierra cuando ya no se necesita.

En el ejemplo siguiente, se crea un S3Client y se configura la instancia integrada de UrlConnectionHttpClient con los valores socketTimeout y proxyConfiguration. El método proxyConfiguration toma una expresión lambda de Java de tipo Consumer<ProxyConfiguration.Builder>.

Importaciones

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.

Enfoque alternativo: compartir una instancia UrlConnectionHttpClient

Para reducir el uso de recursos y memoria en su aplicación, puede configurar un UrlConnectionHttpClient y compartirlo entre varios clientes de servicio. El grupo de conexiones HTTP se compartirá, lo que reduce el uso de recursos.

nota

Al compartir una instancia de UrlConnectionHttpClient, es preciso cerrarla cuando esté lista para ser eliminada. El SDK no cerrará la instancia cuando el cliente del servicio esté cerrado.

En el siguiente ejemplo, se configura un cliente HTTP basado en URLConnection, que utilizan dos clientes de servicio. La instancia de UrlConnectionHttpClient configurada se pasa al método httpClient de cada creador. Cuando los clientes de servicio y el cliente HTTP ya no son necesarios, el código los cierra de forma explícita. El código cierra el cliente HTTP por última vez.

Importaciones

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

Al utilizar el UrlConnectionHttpClient en su aplicación, debe proporcionar a cada cliente de servicio una instancia URLConnectionHttpClient o una instancia ApacheHttpClient mediante el método httpClientBuilder del creador de clientes de servicio.

Se produce una excepción si el programa utiliza varios clientes de servicio y se cumplen las siguientes condiciones:

  • Un cliente de servicio está configurado para usar una instancia UrlConnectionHttpClient

  • Otro cliente de servicio utiliza el ApacheHttpClient predeterminado sin compilarlo explícitamente con los métodos httpClient() o httpClientBuilder()

La excepción indicará que se encontraron varias implementaciones HTTP en la ruta de clases.

El siguiente fragmento de código de ejemplo conduce a una excepción.

// 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 la excepción configurando explícitamente el S3Client con un 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 crear explícitamente el ApacheHttpClient, debe añadir una dependencia del artefacto apache-client en su archivo de proyecto Maven.

Ejemplo de configuración proxy

El siguiente fragmento de código utiliza el generador de configuración proxy para el cliente HTTP de conexión 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();

Las propiedades del sistema Java equivalentes para la configuración del proxy se muestran en el siguiente fragmento de línea de comandos.

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

La configuración equivalente que usa variables de entorno es:

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

El cliente HTTP basado en URLConnection no admite actualmente las propiedades del sistema proxy HTTPS ni la variable de entorno HTTPS_PROXY.