

# 在 API Gateway 中设置 WebSocket API 集成请求
<a name="apigateway-websocket-api-integration-requests"></a>

设置集成请求涉及以下内容：
+ 选择要集成到后端的路由键。
+ 指定要调用的后端端点。WebSocket API 支持以下集成类型：
  + `AWS_PROXY`
  + `AWS`
  + `HTTP_PROXY`
  + `HTTP`
  + `MOCK`

  有关集成类型的更多信息，请参阅《API Gateway V2 REST API》中的 [IntegrationType](https://docs.aws.amazon.com/apigatewayv2/latest/api-reference/apis-apiid-integrations-integrationid.html#apis-apiid-integrations-integrationid-prop-integration-integrationtype)。
+ 通过指定一个或多个请求模板，配置如何根据需要将路径请求数据转换为集成请求数据。

## 使用 API Gateway 控制台设置 WebSocket API 集成请求
<a name="apigateway-websocket-api-integration-request-using-console"></a>

**使用 API Gateway 控制台向 WebSocket API 中的路由添加集成请求**

1. 登录到 API Gateway 控制台，选择 API，然后选择**路由**。

1. 在**路由**中，选择所需路由。

1. 选择**集成请求**选项卡，然后在**集成请求设置**部分中，选择**编辑**。

1. 对于**集成类型**，选择下列选项之一：
   + 仅当您的 API 将与您已在此账户或其它账户中创建的 AWS Lambda 函数集成时，才选择 **Lambda 函数**。

     要在 AWS Lambda 中创建新的 Lambda 函数，要为 Lambda 函数设置资源权限，或者要执行任何其他 Lambda 服务操作，请改为选择 **AWS 服务**。
   + 如果您的 API 将与现有 HTTP 端点集成，请选择 **HTTP**。有关更多信息，请参阅 [针对 API Gateway 中的 REST API 的 HTTP 集成](setup-http-integrations.md)。
   + 如果要直接从 API Gateway 生成 API 响应，而无需集成后端，请选择**模拟**。有关更多信息，请参阅 [针对 API Gateway 中的 REST API 的模拟集成](how-to-mock-integration.md)。
   + 如果您的 API 将与某项 AWS 服务集成，则选择 **AWS 服务**。
   + 如果您的 API 将使用 `VpcLink` 作为私有集成端点，请选择 **VPC 链接**。有关更多信息，请参阅 [设置私有集成](set-up-private-integration.md)。

1. 如果您选择 **Lambda 函数**，请执行以下操作：

   1. 对于**使用 Lambda 代理集成**，如果您打算使用 [Lambda 代理集成](set-up-lambda-proxy-integrations.md#api-gateway-create-api-as-simple-proxy)或[跨账户 Lambda 代理集成](apigateway-cross-account-lambda-integrations.md)，请选中此复选框。

   1. 对于 **Lambda 函数**，请通过以下方式之一指定函数：
      + 如果您的 Lambda 函数在同一账户中，请输入函数名称，然后从下拉列表中选择函数。
**注意**  
函数名称可以包含（可选）其别名或版本规范，如在 `HelloWorld`、`HelloWorld:1` 或 `HelloWorld:alpha` 中。
      + 如果该函数位于不同账户，请输入该函数的 ARN。

   1. 要使用默认超时值 29 秒，请保持**默认超时**处于开启状态。要设置自定义超时，请选择**默认超时**，然后输入一个介于 `50` 到 `29000` 毫秒之间的超时值。

1. 如果您选择了 **HTTP**，请遵循[使用 API Gateway 控制台设置 API 集成请求](how-to-method-settings-console.md)的步骤 4 中的说明。

1. 如果您选择了**模拟**，请继续执行**请求模板**步骤。

1. 如果您选择了 **AWS 服务**，请遵循[使用 API Gateway 控制台设置 API 集成请求](how-to-method-settings-console.md)的步骤 6 中的说明操作。

1. 如果您选择了 **VPC 链接**，请执行以下操作：

   1. 对于 **VPC 代理集成**，如果要将请求通过代理连接到 `VPCLink` 的端点，请选中该复选框。

   1. 对于 **HTTP 方法**，选择与 HTTP 后端中的方法最匹配的 HTTP 方法类型。

   1. 从 **VPC 链接**下拉列表中，选择一个 VPC 链接。您可以选择 `[Use Stage Variables]` 并在列表下方的文本框中输入 **\$1\$1stageVariables.vpcLinkId\$1**。

      您可以在将 API 部署到阶段之后定义 `vpcLinkId` 阶段变量，并将其值设置为 `VpcLink` 的 ID。

   1. 对于**端点 URL**，请输入您希望此集成使用的 HTTP 后端的 URL。

   1. 要使用默认超时值 29 秒，请保持**默认超时**处于开启状态。要设置自定义超时，请选择**默认超时**，然后输入一个介于 `50` 到 `29000` 毫秒之间的超时值。

1. 选择**保存更改**。

1. 在**请求模板**下方，执行以下操作：

   1. 要输入**模板选择表达式**，请在**请求模板**下选择**编辑**。

   1. 输入**模板选择表达式**。使用 API Gateway 在消息负载中查找的表达式。如果找到，则对其进行评估，结果是模板键值，用于选择要应用于消息负载中的数据的数据映射模板。您将在下一步中创建数据映射模板。选择**编辑**以保存所做更改。

   1. 选择**创建模板**以创建数据映射模板。对于**模板密钥**，输入一个模板密钥值，用于选择要应用于消息负载中的数据的数据映射模板。然后，输入映射模板。选择**创建模板**。

      有关模板选择表达式的信息，请参阅[模板选择表达式](websocket-api-data-transformations.md#apigateway-websocket-api-template-selection-expressions)。

## 使用 AWS CLI 设置集成请求
<a name="apigateway-websocket-api-integration-request-using-awscli"></a>

您可以使用 AWS CLI 为 WebSocket API 中的路由设置集成请求，如以下示例所示（这将创建模拟集成）：

1. 使用以下内容创建名为 `integration-params.json` 的文件：

   ```
   {"PassthroughBehavior": "WHEN_NO_MATCH", "TimeoutInMillis": 29000, "ConnectionType": "INTERNET", "RequestTemplates": {"application/json": "{\"statusCode\":200}"}, "IntegrationType": "MOCK"}
   ```

1. 使用以下 [create-integration](https://docs.aws.amazon.com/cli/latest/reference/apigatewayv2/create-integration.html) 命令创建模拟集成。

   ```
   aws apigatewayv2 --region us-east-1 create-integration --api-id aabbccddee --cli-input-json file://integration-params.json
   ```

   输出将与以下内容类似：

   ```
   {
       "PassthroughBehavior": "WHEN_NO_MATCH",
       "TimeoutInMillis": 29000,
       "ConnectionType": "INTERNET",
       "IntegrationResponseSelectionExpression": "${response.statuscode}",
       "RequestTemplates": {
           "application/json": "{\"statusCode\":200}"
       },
       "IntegrationId": "0abcdef",
       "IntegrationType": "MOCK"
   }
   ```

或者，您可以使用 AWS CLI 为代理集成设置集成请求。

1. 在 Lambda 控制台中创建 Lambda 函数，并为其提供基本的 Lambda 执行角色。

1. 使用以下 [create-integration](https://docs.aws.amazon.com/cli/latest/reference/apigatewayv2/create-integration.html) 命令创建集成。

   ```
   aws apigatewayv2 create-integration --api-id aabbccddee --integration-type AWS_PROXY --integration-method POST --integration-uri arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-1:123412341234:function:simpleproxy-echo-e2e/invocations
   ```

输出将与以下内容类似：

```
{
    "PassthroughBehavior": "WHEN_NO_MATCH",
    "IntegrationMethod": "POST",
    "TimeoutInMillis": 29000,
    "ConnectionType": "INTERNET",
    "IntegrationUri": "arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-1:123412341234:function:simpleproxy-echo-e2e/invocations",
    "IntegrationId": "abcdefg",
    "IntegrationType": "AWS_PROXY"
}
```

## 适用于 WebSocket API 的代理集成的 Lambda 函数的输入格式
<a name="api-gateway-simple-proxy-for-lambda-input-format-websocket"></a>

使用 Lambda 代理集成，API Gateway 可以将整个客户端请求映射到后端 Lambda 函数的输入 `event` 参数：以下示例显示了 API Gateway 发送到 Lambda 代理集成的 `$connect` 路由中输入事件和 `$disconnect` 路由中输入事件的结构。

------
#### [ Input from the \$1connect route ]

```
{
    headers: {
      Host: 'abcd123.execute-api.us-east-1.amazonaws.com',
      'Sec-WebSocket-Extensions': 'permessage-deflate; client_max_window_bits',
      'Sec-WebSocket-Key': '...',
      'Sec-WebSocket-Version': '13',
      'X-Amzn-Trace-Id': '...',
      'X-Forwarded-For': '192.0.2.1',
      'X-Forwarded-Port': '443',
      'X-Forwarded-Proto': 'https'
    },
    multiValueHeaders: {
      Host: [ 'abcd123.execute-api.us-east-1.amazonaws.com' ],
      'Sec-WebSocket-Extensions': [ 'permessage-deflate; client_max_window_bits' ],
      'Sec-WebSocket-Key': [ '...' ],
      'Sec-WebSocket-Version': [ '13' ],
      'X-Amzn-Trace-Id': [ '...' ],
      'X-Forwarded-For': [ '192.0.2.1' ],
      'X-Forwarded-Port': [ '443' ],
      'X-Forwarded-Proto': [ 'https' ]
    },
    requestContext: {
      routeKey: '$connect',
      eventType: 'CONNECT',
      extendedRequestId: 'ABCD1234=',
      requestTime: '09/Feb/2024:18:11:43 +0000',
      messageDirection: 'IN',
      stage: 'prod',
      connectedAt: 1707502303419,
      requestTimeEpoch: 1707502303420,
      identity: { sourceIp: '192.0.2.1' },
      requestId: 'ABCD1234=',
      domainName: 'abcd1234.execute-api.us-east-1.amazonaws.com',
      connectionId: 'AAAA1234=',
      apiId: 'abcd1234'
    },
    isBase64Encoded: false
  }
```

------
#### [ Input from the \$1disconnect route ]

```
{
    headers: {
      Host: 'abcd1234.execute-api.us-east-1.amazonaws.com',
      'x-api-key': '',
      'X-Forwarded-For': '',
      'x-restapi': ''
    },
    multiValueHeaders: {
      Host: [ 'abcd1234.execute-api.us-east-1.amazonaws.com' ],
      'x-api-key': [ '' ],
      'X-Forwarded-For': [ '' ],
      'x-restapi': [ '' ]
    },
    requestContext: {
      routeKey: '$disconnect',
      disconnectStatusCode: 1005,
      eventType: 'DISCONNECT',
      extendedRequestId: 'ABCD1234=',
      requestTime: '09/Feb/2024:18:23:28 +0000',
      messageDirection: 'IN',
      disconnectReason: 'Client-side close frame status not set',
      stage: 'prod',
      connectedAt: 1707503007396,
      requestTimeEpoch: 1707503008941,
      identity: { sourceIp: '192.0.2.1' },
      requestId: 'ABCD1234=',
      domainName: 'abcd1234.execute-api.us-east-1.amazonaws.com',
      connectionId: 'AAAA1234=',
      apiId: 'abcd1234'
    },
    isBase64Encoded: false
  }
```

------