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
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.
-
Varias
Update*
operaciones en la AWS Security Hub API y también en la BatchUpdateFindingsoperación -
Todas las operaciones de
Update*
de la API de Amazon API Gateway -
Varias
Update*
operaciones en la WorkDocs API de Amazon
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
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étodoshttpClient()
ohttpClientBuilder()
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.