

# Uso de comandos de `@connections` en el servicio de backend
<a name="apigateway-how-to-call-websocket-api-connections"></a>

El servicio de backend puede utilizar las siguientes solicitudes HTTP de conexión de WebSocket para enviar un mensaje de devolución de llamada a un cliente conectado, obtener información sobre la conexión o desconectar el cliente.

**importante**  
Estas solicitudes utilizan la [autorización de IAM](apigateway-websocket-control-access-iam.md), por lo que debe firmarlas con [Signature Version 4 (SigV4)](https://docs.aws.amazon.com/IAM/latest/UserGuide/create-signed-request.html). Para hacerlo, puede usar la API de administración de API Gateway. Para obtener más información, consulte [ApiGatewayManagementApi](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/apigatewaymanagementapi.html).

En el siguiente comando, tiene que sustituir `{api-id}` por el ID real de la API, que se muestra en la consola de API Gateway o se obtiene mediante el comando [create-api](https://docs.aws.amazon.com/cli/latest/reference/apigatewayv2/create-api.html) de la AWS CLI. Debe establecer la conexión antes de utilizar este comando. 

Para enviar un mensaje de devolución de llamada al cliente, utilice:

```
POST https://{api-id}.execute-api.us-east-1.amazonaws.com/{stage}/@connections/{connection_id}
```

Puede probar esta solicitud mediante `[Postman](https://www.postman.com/)` o llamando a `[awscurl](https://github.com/okigan/awscurl)`, tal y como se muestra en el siguiente ejemplo:

```
awscurl --service execute-api -X POST -d "hello world" https://{prefix}.execute-api.us-east-1.amazonaws.com/{stage}/@connections/{connection_id}
```

Tiene que codificar el comando como URL, tal y como se muestra en el siguiente ejemplo:

```
awscurl --service execute-api -X POST -d "hello world" https://aabbccddee.execute-api.us-east-1.amazonaws.com/prod/%40connections/R0oXAdfD0kwCH6w%3D
```

Para obtener el estado de conexión más reciente del cliente, utilice:

```
GET https://{api-id}.execute-api.us-east-1.amazonaws.com/{stage}/@connections/{connection_id}
```

Para desconectar el cliente, utilice:

```
DELETE https://{api-id}.execute-api.us-east-1.amazonaws.com/{stage}/@connections/{connection_id}
```

Puede crear una URL de devolución de llamada dinámicamente mediante el uso de las variables `$context` de su integración. Por ejemplo, si utiliza la integración de proxy de Lambda con una función de Lambda `Node.js`, puede crear la URL y enviar un mensaje a un cliente conectado como se indica a continuación:

```
import {
  ApiGatewayManagementApiClient,
  PostToConnectionCommand,
} from "@aws-sdk/client-apigatewaymanagementapi";

export const handler = async (event) => {
  const domain = event.requestContext.domainName;
  const stage = event.requestContext.stage;
  const connectionId = event.requestContext.connectionId;
  const callbackUrl = `https://${domain}/${stage}`;
  const client = new ApiGatewayManagementApiClient({ endpoint: callbackUrl });

  const requestParams = {
    ConnectionId: connectionId,
    Data: "Hello!",
  };

  const command = new PostToConnectionCommand(requestParams);

  try {
    await client.send(command);
  } catch (error) {
    console.log(error);
  }

  return {
    statusCode: 200,
  };
};
```

Si utiliza un nombre de dominio personalizado para la API de WebSocket, quite la variable `stage` del código de la función.

Al enviar un mensaje de devolución de llamada, la función de Lambda debe tener permiso para llamar a la API de administración de puertas de enlace de API. Es posible que reciba un mensaje de error que contiene `GoneException` si publica un mensaje antes de que se establezca la conexión o después de que el cliente se haya desconectado. 