

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 endpoints do cliente
<a name="config-endpoint"></a>

Quando ele AWS SDK para Kotlin chama um AWS service (Serviço da AWS), uma de suas primeiras etapas é determinar para onde encaminhar a solicitação. O processo é conhecido como resolução de endpoint.

Você pode configurar a resolução de endpoint para o SDK ao criar um cliente de serviço. A configuração padrão para resolução de endpoints geralmente é boa, mas há vários motivos que podem levar você a modificar a configuração padrão. Estes são dois exemplos de motivos:
+ Faça solicitações para uma versão de pré-lançamento de um serviço ou para uma implantação local de um serviço.
+ Acesso a recursos de serviço específicos ainda não modelados no SDK.

**Atenção**  
A resolução de endpoints é um tópico avançado do SDK. Se você alterar as configurações padrão, corre o risco de quebrar seu código. As configurações padrão devem ser aplicadas à maioria dos usuários em ambientes de produção.

## Configuração personalizada
<a name="config-endpoint-custom-config"></a>

Você pode personalizar a resolução do endpoint de um cliente de serviço com duas propriedades que estão disponíveis ao criar o cliente:

1. `endpointUrl: Url`

1. `endpointProvider: EndpointProvider`

### Definir `endpointUrl`
<a name="config-endpoint-custom-config-endpointurl"></a>

Você pode definir um valor para `endpointUrl` para indicar um nome de host “base” para o serviço. Esse valor, no entanto, não é final, pois é passado como parâmetro para a instância `EndpointProvider` do cliente. A `EndpointProvider` implementação então pode inspecionar e potencialmente modificar esse valor para determinar o endpoint final. 

Por exemplo, se você especificar um `endpointUrl` valor para um cliente do Amazon Simple Storage Service (Amazon S3) e realizar `GetObject` uma operação, a implementação padrão do provedor de endpoint injeta o nome do bucket no valor do nome do host.

Na prática, os usuários definem um `endpointUrl` valor para apontar para uma instância de desenvolvimento ou pré-visualização de um serviço.

### Definir `endpointProvider`
<a name="config-endpoint-custom-config-endpointprovider"></a>

A `EndpointProvider` implementação de um cliente de serviço determina a resolução final do endpoint. A `EndpointProvider` interface mostrada no bloco de código a seguir expõe o `resolveEndpoint` método.

```
public fun interface EndpointProvider<T> {
    public suspend fun resolveEndpoint(params: T): Endpoint
}
```

Um cliente de serviço chama o `resolveEndpoint` método para cada solicitação. O cliente do serviço usa o `Endpoint` valor retornado pelo provedor sem alterações adicionais.

#### Propriedades do `EndpointProvider`
<a name="config-endpoint-custom-config-endpointprovider-params"></a>

O `resolveEndpoint` método aceita um `EndpointParameters` objeto específico do serviço que contém propriedades usadas na resolução de endpoints.

Cada serviço inclui as seguintes propriedades básicas.


****  

| Nome | Tipo | Description | 
| --- | --- | --- | 
| region | String | A AWS região do cliente | 
| endpoint | String | Uma representação de string conjunto de valores de endpointUrl | 
| useFips | Booleano | Se os endpoints FIPS estiverem habilitados na configuração do cliente | 
| useDualStack | Booleano | Se os endpoints de pilha dupla estiverem habilitados na configuração do cliente | 

Os serviços podem especificar propriedades adicionais necessárias para a resolução. Por exemplo, o Amazon S3 [https://docs.aws.amazon.com/sdk-for-kotlin/api/latest/s3/aws.sdk.kotlin.services.s3.endpoints/-s3-endpoint-parameters/index.html](https://docs.aws.amazon.com/sdk-for-kotlin/api/latest/s3/aws.sdk.kotlin.services.s3.endpoints/-s3-endpoint-parameters/index.html)inclui o nome do bucket e também várias configurações de recursos específicos do Amazon S3. Por exemplo, a propriedade `forcePathStyle` determina se o endereço do host virtual pode ser usado. 

Se você implementar seu próprio provedor, não precisará criar sua própria instância do`EndpointParameters`. O SDK fornece as propriedades de cada solicitação e as passa para sua implementação do `resolveEndpoint`.

### `endpointUrl` ou `endpointProvider`
<a name="config-endpoint-custom-config-which"></a>

É importante entender que as duas declarações a seguir NÃO produzem clientes com comportamento de resolução de endpoint equivalente:

```
// Use endpointUrl.
S3Client.fromEnvironment { 
    endpointUrl = Url.parse("https://endpoint.example")
}

// Use endpointProvider.
S3Client.fromEnvironment {
    endpointProvider = object : S3EndpointProvider {
        override suspend fun resolveEndpoint(params: S3EndpointParameters): Endpoint = Endpoint("https://endpoint.example")
    }
}
```

A declaração que define a `endpointUrl` propriedade especifica uma URL *base* que é passada para o provedor (padrão), que pode ser modificada como parte da resolução do endpoint. 

A declaração que define o `endpointProvider` especifica o URL *final* que ele `S3Client` usa.

Embora você possa definir as duas propriedades, na maioria dos casos que precisam de personalização, você fornece uma delas. Como usuário geral do SDK, você geralmente fornece um `endpointUrl` valor.

### Uma observação sobre o Amazon S3
<a name="config-endpoint-custom-config-s3"></a>

O Amazon S3 é um serviço complexo com muitos de seus recursos modelados por meio de personalizações personalizadas de endpoints, como hospedagem virtual de bucket. A hospedagem virtual é um recurso do Amazon S3 em que o nome do bucket é inserido no nome do host.

Por isso, recomendamos que você não substitua a `EndpointProvider` implementação em um cliente de serviço do Amazon S3. Se você precisar estender seu comportamento de resolução, talvez enviando solicitações para uma pilha de desenvolvimento local com considerações adicionais de endpoint, recomendamos incluir a implementação padrão. O `endpointProvider` exemplo a seguir mostra um exemplo de implementação dessa abordagem.

## Exemplos
<a name="config-endpoint-examples"></a>

### Exemplo de `endpointUrl`
<a name="config-endpoint-examples-endpointurl"></a>

O trecho de código a seguir mostra como o endpoint de serviço geral pode ser substituído por um cliente Amazon S3.

```
val client = S3Client.fromEnvironment {
    endpointUrl = Url.parse("https://custom-s3-endpoint.local")
    // EndpointProvider is left as the default.
}
```

### Exemplo de `endpointProvider`
<a name="config-endpoint-examples-endpointprovider"></a>

O trecho de código a seguir mostra como fornecer um provedor de endpoint personalizado que encapsule a implementação padrão para o Amazon S3.

```
import aws.sdk.kotlin.services.s3.endpoints.DefaultS3EndpointProvider
import aws.sdk.kotlin.services.s3.endpoints.S3EndpointParameters
import aws.sdk.kotlin.services.s3.endpoints.S3EndpointProvider
import aws.smithy.kotlin.runtime.client.endpoints.Endpoint

public class CustomS3EndpointProvider : S3EndpointProvider {
    override suspend fun resolveEndpoint(params: S3EndpointParameters) =
        if (/* Input params indicate we must route another endpoint for whatever reason. */) {
            Endpoint(/* ... */)
        } else {
            // Fall back to the default resolution.
            DefaultS3EndpointProvider().resolveEndpoint(params)
        }
}
```

### `endpointUrl` e `endpointProvider`
<a name="config-endpoint-examples-both"></a>

O programa de exemplo a seguir demonstra a interação entre as `endpointProvider` configurações `endpointUrl` e. Esse é um caso de uso avançado.

```
import aws.sdk.kotlin.services.s3.S3Client
import aws.sdk.kotlin.services.s3.endpoints.DefaultS3EndpointProvider
import aws.sdk.kotlin.services.s3.endpoints.S3EndpointParameters
import aws.sdk.kotlin.services.s3.endpoints.S3EndpointProvider
import aws.smithy.kotlin.runtime.client.endpoints.Endpoint

fun main() = runBlocking {
    S3Client.fromEnvironment {
        endpointUrl = Url.parse("https://example.endpoint")
        endpointProvider = CustomS3EndpointProvider()
    }.use { s3 ->
        // ...
    }
}

class CustomS3EndpointProvider : S3EndpointProvider {
    override suspend fun resolveEndpoint(params: S3EndpointParameters) {
        // The resolved string value of the endpointUrl set in the client above is available here.
        println(params.endpoint) 
        // ...
    }
}
```