

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 Apache
<a name="http-configuration-apache"></a>

Los clientes del servicio sincrónico AWS SDK for Java 2.x utilizan un cliente HTTP basado en Apache de forma predeterminada. [ApacheHttpClient](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/apache/ApacheHttpClient.html) El SDK `ApacheHttpClient` se basa en Apache. [HttpClient](https://hc.apache.org/httpcomponents-client-4.5.x/index.html)

El SDK también ofrece el [UrlConnectionHttpClient](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/urlconnection/UrlConnectionHttpClient.html), que se carga más rápido, pero tiene menos funciones. Para obtener información acerca de cómo configurar el `UrlConnectionHttpClient`, consulte [Configurar el cliente HTTP URLConnection basado](http-configuration-url.md). 

Para ver el conjunto completo de opciones de configuración disponibles para el`ApacheHttpClient`, consulte [ApacheHttpClient.Builder y [ProxyConfiguration.Builder](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/apache/ProxyConfiguration.Builder.html)](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/apache/ApacheHttpClient.Builder.html).

## Acceso al `ApacheHttpClient`
<a name="http-apache-dependency"></a>

En la mayoría de las situaciones, `ApacheHttpClient` se utiliza sin ninguna configuración explícita. Declare sus clientes de servicios y el SDK configurará los `ApacheHttpClient` con valores estándar por usted.

Si quiere configurar de forma explícita el `ApacheHttpClient` o usarlo con varios clientes de servicio, tiene que hacerlo disponible para su configuración.

### No se necesita configuración
<a name="http-config-apache-no-config"></a>

Cuando declara una dependencia de un cliente de servicio en Maven, el SDK añade una dependencia en *tiempo de ejecución* del artefacto `apache-client`. Esto hace que la clase `ApacheHttpClient` esté disponible para su código en el tiempo de ejecución, pero no en el de compilación. Si no está configurando el cliente HTTP basado en Apache, no necesita especificar una dependencia para él.

En el siguiente fragmento XML de un archivo `pom.xml` Maven, la dependencia declarada con `<artifactId>s3</artifactId>` trae de forma transitoria el cliente HTTP basado en Apache. No necesita declarar una dependencia específicamente para ella.

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

Con estas dependencias, no puede realizar ningún cambio en la configuración HTTP, ya que la biblioteca `ApacheHttpClient` solo se encuentra en la ruta de clases del tiempo de ejecución. 

### Se necesita configuración
<a name="http-config-apache-yes-config"></a>

Para configurar el `ApacheHttpClient`, es necesario añadir una dependencia a la biblioteca `apache-client` en el momento de la *compilación*. 

Consulte el siguiente ejemplo de un archivo `pom.xml` Maven para configurar el `ApacheHttpClient`.

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

## Utilizar y configurar el `ApacheHttpClient`
<a name="http-apache-config"></a>

Puede configurar una instancia del `ApacheHttpClient` 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 estos enfoques, utilice `[ApacheHttpClient.Builder](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/apache/ApacheHttpClient.Builder.html)` para configurar las propiedades de la instancia de cliente HTTP basada en Apache.

### Práctica recomendada: dedicar una instancia de `ApacheHttpClient` a un cliente de servicio
<a name="http-config-apache-recomm"></a>

Si necesita configurar una instancia del `ApacheHttpClient`, le recomendamos que cree la instancia `ApacheHttpClient` 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 `ApacheHttpClient` no se cierra cuando ya no se necesita.

En el ejemplo siguiente, se crea un `S3Client` y se configura la instancia integrada de `ApacheHttpClient` con los valores `maxConnections` y `connectionTimeout`. La instancia HTTP se crea mediante el método `httpClientBuilder` de `S3Client.Builder`.

 **Importaciones** 

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

### Enfoque alternativo: compartir una instancia `ApacheHttpClient`
<a name="http-config-apache-alt"></a>

Para reducir el uso de recursos y memoria en su aplicación, puede configurar un `ApacheHttpClient` 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 `ApacheHttpClient`, 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 Apache, utilizado por dos clientes de servicio. La instancia de `ApacheHttpClient` 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.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.
```

## Ejemplo de configuración proxy
<a name="http-configuration-apache-proxy-conf-ex"></a>

El siguiente fragmento de código utiliza el [generador de configuración proxy para el cliente HTTP de Apache](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/apache/ProxyConfiguration.Builder.html).

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

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 = ApacheHttpClient.builder()
                .proxyConfiguration(ProxyConfiguration.builder()
                        .useSystemPropertyValues(Boolean.FALSE)
                        .build())
                .build();

// Run the application.
// $ java -cp ... App
```

**nota**  
El cliente HTTP de Apache no admite actualmente las propiedades del sistema proxy de HTTPS ni la variable de entorno HTTPS\$1PROXY.