如何在AWS API Gateway WebSocket中将数组解析为主体?

时间:2019-07-17 09:13:36

标签: amazon-web-services websocket aws-api-gateway

我正在使用AWS API Gateway设置Websocket服务器,其中非我开发的IoT设备将连接并开始交互。这些设备实现基于Websocket的协议,该协议要求主体具有以下格式:

[
    2,
    "<RequestID>",
    "<Action>",
    {
        "parameter1": "value1",
        "parameter2": "value2",
        "parameter3": "value3"
    }
]

基于Action的值(上面数组中的第三个元素),我需要调用适当的Lambda函数,该函数将使用提供的参数来处理消息,因此我想在API Gateway中实现一个websocket选择表达式(https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-websocket-api-selection-expressions.html)可以从数组中获取该元素,但是官方文档并未提及有关数组主体的任何内容。

我猜想,替代方案是,我总是调用实现此评估的Lambda,然后调用适当的Lambda,但我想通过直接调用正确的函数来优化成本并最大程度地减少函数调用。

>

您知道是否可以这样做?

我尝试同时使用会引发错误的$request.body[2]和无法正常工作的$request.body.2(我猜它在主体对象内部查找键等于“ 2”的属性)。

2 个答案:

答案 0 :(得分:0)

我发现使用$request.body.[0]是可行的。我不知道这是一个有效的JSON表达式。刚刚在控制台中进行了测试,并选择了路由。唯一的问题是,如果$request.body.[0] == int()与该整数命名的路由不匹配。我假设当AWS针对路由表达式进行测试时,该求值的左侧是整数(JSON编号),右侧是字符串。

答案 1 :(得分:0)

看起来您正在处理 OCPP 消息。我们能够使用无服务器框架来实现这一点。如果您查看标准消息格式:

[2, 48799347859454, "BootNotification", {"Test": "Test"}]

我们可以通过操作(即 BootNotification)来路由消息。

在我们的 serverless.yml 文件中,我们在提供程序中指定了以下内容:

  websocketsApiName: test-websocket-api
  websocketsApiRouteSelectionExpression: $request.body.[2]

然后路由函数看起来像:

  BootNotificationHandler:
    name: bootnotification
    handler: bootNotification.handler
    events:
      - websocket:
          route: BootNotification