

# Administración de usuarios conectados y aplicaciones cliente: rutas `$connect` y `$disconnect`
<a name="apigateway-websocket-api-route-keys-connect-disconnect"></a>

En la siguiente sección se describe cómo utilizar las rutas `$connect` y `$disconnect` para la API de WebSocket.

**Topics**
+ [La ruta `$connect`](#apigateway-websocket-api-routes-about-connect)
+ [Transmitir información de conexión de la ruta `$connect`](#apigateway-websocket-api-passing-connectionId-on-connect)
+ [La ruta `$disconnect`](#apigateway-websocket-api-routes-about-disconnect)

## La ruta `$connect`
<a name="apigateway-websocket-api-routes-about-connect"></a>

Las aplicaciones cliente se conectan a la API de WebSocket enviando una solicitud de actualización de WebSocket. Si la solicitud se realiza correctamente, la ruta `$connect` se ejecuta mientras se establece la conexión.

Dado que la conexión de WebSocket es una conexión con estado, solo se puede configurar la autorización en la ruta `$connect`. `AuthN`/`AuthZ` solo se realizará en el momento de la conexión.

Hasta que se complete la ejecución de la integración asociada a la ruta `$connect`, la solicitud de actualización está pendiente y la conexión real no se establece. Si la solicitud `$connect` da error (por ejemplo, debido a un error de `AuthN`/`AuthZ` o de integración), la conexión no se realizará.

**nota**  
Si se produce un error en la autorización en `$connect`, la conexión no se establece y el cliente recibirá una respuesta `401` o `403`.

La configuración de una integración para `$connect` es opcional. Considere la posibilidad de configurar una integración `$connect` si:
+ Desea habilitar a los clientes para especificar subprotocolos mediante el campo `Sec-WebSocket-Protocol`. Para ver código de ejemplo, consulte [Configuración de una ruta `$connect` que requiere un subprotocolo WebSocket](websocket-connect-route-subprotocol.md).
+ Desea recibir una notificación cuando los clientes se conectan.
+ Desea limitar las conexiones o controlar quién se conecta.
+ Desea que el backend envíe mensajes de respuesta a los clientes mediante una URL de devolución de llamada.
+ Desea almacenar los ID de conexión y otra información en una base de datos (por ejemplo, Amazon DynamoDB).

## Transmitir información de conexión de la ruta `$connect`
<a name="apigateway-websocket-api-passing-connectionId-on-connect"></a>

 Puede utilizar integraciones con y sin proxy para transferir información de la ruta `$connect` a una base de datos u otro Servicio de AWS. 

### Para transferir información de conexión mediante una integración de proxy
<a name="websocket-connect-proxy-integration"></a>

En ese caso, puede acceder a la información de conexión desde una integración de proxy de Lambda. Utilice otro Servicio de AWS o función de AWS Lambda para publicar en la conexión. 

La siguiente función de Lambda muestra cómo utilizar el objeto `requestContext` para registrar el ID de conexión, el nombre de dominio, el nombre de etapa y las cadenas de consulta. 

------
#### [ Node.js ]

```
 export const handler = async(event, context) => {
    const connectId = event["requestContext"]["connectionId"]
    const domainName = event["requestContext"]["domainName"]
    const stageName = event["requestContext"]["stage"]
    const qs = event['queryStringParameters']
    console.log('Connection ID: ', connectId, 'Domain Name: ', domainName, 'Stage Name: ', stageName, 'Query Strings: ', qs )
    return {"statusCode" : 200}
};
```

------
#### [ Python ]

```
import json
import logging
logger = logging.getLogger()
logger.setLevel("INFO")


def lambda_handler(event, context):
    connectId = event["requestContext"]["connectionId"]
    domainName = event["requestContext"]["domainName"]
    stageName = event["requestContext"]["stage"]
    qs = event['queryStringParameters']
    connectionInfo = {
        'Connection ID': connectId,
        'Domain Name': domainName,
        'Stage Name': stageName,
        'Query Strings': qs}
    logging.info(connectionInfo)
    return {"statusCode": 200}
```

------

### Para transferir información de conexión mediante una integración que no sea de proxy
<a name="websocket-connect-non-proxy-integration"></a>
+ Puede acceder a la información de conexión con una integración que no sea de proxy. Configure la solicitud de integración y proporcione una plantilla de solicitud de API de WebSocket. La siguiente plantilla de mapeo [Velocity Template Language (VTL)](https://velocity.apache.org/engine/devel/vtl-reference.html) proporciona una solicitud de integración. Esta solicitud envía los siguientes detalles a una integración que no sea de proxy: 
  + ID de la conexión
  + Nombre del dominio
  + Nombre de la fase
  + Ruta
  + Encabezados
  + Cadenas de consulta

  Esta solicitud envía el ID de conexión, el nombre de dominio, el nombre de etapa, las rutas, los encabezados y las cadenas de consulta a una integración que no sea de proxy.

  ```
  {
      "connectionId": "$context.connectionId",
      "domain": "$context.domainName",
      "stage": "$context.stage",
      "params": "$input.params()"
  }
  ```

  Para obtener más información sobre la configuración de transformaciones de datos, consulte [Transformaciones de datos para las API de WebSocket en API Gateway](websocket-api-data-transformations.md).

  Para completar la solicitud de integración, establezca `StatusCode: 200` para la respuesta de integración. Para obtener más información sobre la configuración de una respuesta de integración, consulte [Configuración de una respuesta de integración mediante la consola de API Gateway](apigateway-websocket-api-integration-responses.md#apigateway-websocket-api-integration-response-using-console).

## La ruta `$disconnect`
<a name="apigateway-websocket-api-routes-about-disconnect"></a>

La ruta `$disconnect` se ejecuta una vez que se ha cerrado la conexión.

La conexión la puede cerrar el servidor o el cliente. Como la conexión ya está cerrada cuando se ejecuta, `$disconnect` es un evento de mejor esfuerzo. API Gateway hará todo lo posible para entregar el evento `$disconnect` a su integración, pero no puede garantizar la entrega.

El backend puede iniciar la desconexión mediante la API `@connections`. Para obtener más información, consulte [Uso de comandos de `@connections` en el servicio de backend](apigateway-how-to-call-websocket-api-connections.md).