

# Solicitar validação para APIs de WebSocket no API Gateway
<a name="websocket-api-request-validation"></a>

É possível configurar o API Gateway para realizar a validação em uma solicitação de rota antes de prosseguir com a solicitação de integração. Se a validação falhar, o API Gateway falhará na solicitação sem chamar seu backend, enviará uma resposta de gateway “Corpo de solicitação incorreto” ao cliente e publicará os resultados da validação no CloudWatch Logs. Usar a validação dessa forma reduz chamadas desnecessárias para o backend da API.

## Expressões de seleção de modelo
<a name="apigateway-websocket-api-model-selection-expressions"></a>

Você pode usar uma expressão de seleção de modelo para validar solicitações dinamicamente dentro da mesma rota. A validação de modelos ocorrerá se você fornecer uma expressão de seleção de modelo para integrações proxy ou não proxy. Talvez seja necessário definir o modelo `$default` como um fallback quando nenhum modelo correspondente for encontrado. Se não houver nenhum modelo correspondente e `$default` não estiver definido, a validação falhará. A expressão de seleção é semelhante a `Route.ModelSelectionExpression` e é avaliada como a chave de `Route.RequestModels`.

Ao definir uma rota para uma API de WebSocket, é possível especificar, opcionalmente, uma *expressão de seleção de modelo*. Esta expressão é avaliada para selecionar o modelo a ser usado para a validação do corpo quando uma solicitação é recebida. A expressão é avaliada como uma das entradas em de uma rota [https://docs.aws.amazon.com/apigatewayv2/latest/api-reference/apis-apiid-routes.html#apis-apiid-routes-prop-route-requestmodels](https://docs.aws.amazon.com/apigatewayv2/latest/api-reference/apis-apiid-routes.html#apis-apiid-routes-prop-route-requestmodels).

Um modelo é expresso como um [esquema JSON](https://datatracker.ietf.org/doc/html/draft-zyp-json-schema-04) e descreve a estrutura de dados do corpo da solicitação. A natureza dessa expressão de seleção permite que você escolha dinamicamente o modelo para validar com base no tempo de execução para uma rota específica. Para obter informações sobre como criar um modelo, consulte [Modelos de dados para APIs REST](models-mappings-models.md). 

## Configurar a validação de solicitação usando o console do API Gateway
<a name="apigateway-websocket-api-model-selection-expression-example"></a>

O seguinte exemplo mostra como configurar a validação da solicitação em uma rota.

 Primeiro, crie um modelo e depois crie uma rota. Em seguida, configure a validação da solicitação na rota criada. Por fim, implante e teste a API. Para concluir este tutorial, você precisa de uma API de WebSocket com `$request.body.action` como a expressão de seleção de rota e um endpoint de integração para sua nova rota.

Você também precisa que o `wscat` se conecte à sua API. Para obter mais informações, consulte [Use `wscat` para se conectar a uma API do WebSocket e enviar mensagens a ela](apigateway-how-to-call-websocket-api-wscat.md).

**Como criar um modelo**

1. Faça login no console do API Gateway em [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway).

1. Escolha uma API de WebSocket.

1. No painel de navegação principal, selecione **Modelos**.

1. Escolha **Criar modelo**.

1. Em **Nome**, digite **emailModel**.

1. Em **Tipo de conteúdo**, insira **application/json**.

1. Em **Esquema do modelo**, insira o seguinte modelo:

   ```
   {
       "$schema": "http://json-schema.org/draft-04/schema#",
       "type" : "object",
       "required" : [ "address"],
       "properties" : {
           "address": {
               "type": "string"
           }
       }
   }
   ```

   Este modelo exige que a solicitação contenha um endereço de e-mail.

1. Escolha **Salvar**.

Nesta etapa, você cria uma rota para a API de WebSocket.

**Para criar uma rota**

1. No painel de navegação principal, selecione **Rotas**.

1. Escolha **Create route (Criar rota)**.

1. Em **Route key** (Chave de rota), insira **sendMessage**.

1. Escolha um tipo de integração e especifique um endpoint de integração. Para obter mais informações, consulte [Integrações para APIs de WebSocket no API Gateway](apigateway-websocket-api-integrations.md).

1. Escolha **Create route (Criar rota)**.

Nesta etapa, você configura a validação da solicitação para a rota `sendMessage`.

**Para configurar a validação da solicitação**

1. Na guia **Solicitação de rota**, em **Configurações de solicitação de rota**, escolha **Editar**.

1. Em **Expressão de seleção de modelos**, insira **\$1\$1request.body.messageType\$1**.

   O API Gateway usa a propriedade `messageType` para validar a solicitação de entrada.

1. Escolha **Adicionar modelo de solicitação**.

1. Em **Chave do modelo**, insira **email**.

1. Em **Modelo**, escolha **emailModel**.

   O API Gateway valida as mensagens de entrada com a propriedade `messageType` definida como `email` em relação a este modelo.
**nota**  
Se o API Gateway não combinar a expressão de seleção de modelo com uma chave do modelo, ele selecionará o modelo `$default`. Se não houver nenhum modelo `$default`, a validação falhará. Para APIs de produção, recomendamos que você crie um modelo `$default`.

1. Escolha **Salvar alterações**.

Nesta etapa, você implanta e testa a API.

**Para implantar e testar sua API**

1. Escolha **Implantar API**.

1. Escolha o estágio desejado na lista suspensa ou insira o nome de um novo estágio.

1. Escolha **Implantar**.

1. No painel de navegação principal, selecione **Estágios**.

1. Copie o URL WebSocket da API. O URL deve ser semelhante a `wss://abcdef123.execute-api.us-east-2.amazonaws.com/production`.

1. Abra um novo terminal e execute o comando **wscat** com os parâmetros a seguir.

   ```
   wscat -c wss://abcdef123.execute-api.us-west-2.amazonaws.com/production
   ```

   ```
   Connected (press CTRL+C to quit)
   ```

1. Use o comando a seguir para testar a API.

   ```
   {"action": "sendMessage", "messageType": "email"}
   ```

   ```
   {"message": "Invalid request body", "connectionId":"ABCD1=234", "requestId":"EFGH="}
   ```

   O API Gateway falhará na solicitação.

   Use o próximo comando para enviar uma solicitação válida para sua API.

   ```
   {"action": "sendMessage", "messageType": "email", "address": "mary_major@example.com"}
   ```