gpt4 book ai didi

websocket - 连接到 AWS API Gateway websocket 时返回连接 ID

转载 作者:行者123 更新时间:2023-12-03 07:16:31 26 4
gpt4 key购买 nike

我正在使用 AWS Cloud Formation,并努力了解 API Gateway 如何适用于 Websocket。

我希望让 $connect 路由响应 OK 以及 AWS API Gateway 分配的连接 ID。例如,当做时

wscat -c wss://my-custom-api-gateway-ws.com

我希望得到

Connected (press CTRL+C to quit)

和一条消息,例如

< {"message": "Connected". "connectionId": "foo"}

或类似的。但我不断收到

wscat -c wss://my-custom-api-gateway-ws.com
error: Unexpected server response: 500

这是我尝试过的

  wsApiGateway:
Type: AWS::ApiGatewayV2::Api
Properties:
Name: !Sub ${prefix}-ws-gateway
Description: Api Gateway for Websockets
ProtocolType: WEBSOCKET
RouteSelectionExpression: $request.body.action
DisableExecuteApiEndpoint: true

wsConnectRoute:
Type: AWS::ApiGatewayV2::Route
DependsOn:
- wsConnectIntegration
Properties:
ApiId: !Ref wsApiGateway
RouteKey: $connect
AuthorizationType: NONE
OperationName: ConnectRoute
RouteResponseSelectionExpression: $default
Target: !Join
- /
- - integrations
- !Ref wsConnectIntegration

wsConnectIntegration:
Type: AWS::ApiGatewayV2::Integration
Properties:
ApiId: !Ref wsApiGateway
Description: Websocket $connect integration
IntegrationType: MOCK
RequestTemplates:
application/json: "{\"statusCode\": 200, \"connectionId\": \"$context.connectionId\", \"message\": \"Success\"}"
PayloadFormatVersion: 1.0

wsApiStage:
Type: AWS::ApiGatewayV2::Stage
DependsOn:
- wsConnectRoute
Properties:
StageName: production
Description: Autodeploy in production
AutoDeploy: true
ApiId: !Ref wsApiGateway
AccessLogSettings:
DestinationArn: !GetAtt wsApiGatewayLogGroup.Arn
Format: '{"requestTime":"$context.requestTime","requestId":"$context.requestId","connectionId":"$context.connectionId","domainName":"$context.domainName","stage":"$context.stage","httpMethod":"$context.httpMethod","path":"$context.path","routeKey":"$context.routeKey","status":$context.status,"responseLatency":$context.responseLatency, "responseLength":$context.responseLength, "integrationError":$context.integration.error}'

如果我完全删除路由 $connect,我可以连接,但不会返回任何消息

wscat -c wss://my-custom-api-gateway-ws.com
Connected (press CTRL+C to quit)

如果我通过 websocket 发送任何内容,我会收到一个包含连接 ID 的自动响应错误(我可以将其用作解决方法)。但我想在连接时获取该连接 ID,而不是在强制发生错误时获取该连接 ID。

wscat -c wss://my-custom-api-gateway-ws.com
Connected (press CTRL+C to quit)
> this is a silly message
< {"message": "Forbidden", "connectionId":"H-SaJeT8oECIUg=", "requestId":"H-SbUEHSoEF3JQ="}

我的理解是,我应该能够让它与 MOCK 集成类型一起使用,因为我不需要集成 http 服务或类似服务,并且 API 网关应该具有响应所需的所有内容。

有人取得过类似的成就吗?


更新1我已手动(尚未形成云)遵循 Setup a basic WebSocket mock in AWS ApiGateway 上的步骤添加 $connect 路由,与 MOCK 集成,响应模板为

{"statusCode" : 200, "connectionId" : "$context.connectionId"}

但我在连接时看不到该connectionId。

wscat -c wss://foo.execute-api.eu-west-1.amazonaws.com/production
Connected (press CTRL+C to quit)

另外,如果我添加 $default 路由,那么一旦连接,我就可以向 websocket 发送消息并接收预期的 connectionId,但我似乎找不到仅使用 $ 接收 connectionId 的方法连接路线,无需任何其他路线。

最佳答案

您正在尝试将 HTTP 响应返回到 websocket;一旦转换为 websocket,就无法再使用 HTTP 进行响应。

我只是返回一个null。要将数据发送到客户端,请启动 Lambda 并使用 postToConnection API 函数通过 connectionId 推送数据。 (这是 Javascript SDK 的链接。)


编辑:

嗯。我看到在较新的代码中,我确实从 Lambda 返回了 return { statusCode: 200 },但仅此而已。内容仍然通过 API 调用发出。

关于websocket - 连接到 AWS API Gateway websocket 时返回连接 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69770417/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com