如何可靠地将 JSON 对象从 API 网关传递到 SQS 队列

问题描述 投票:0回答:1

这方面似乎没有太多文档,而且大多数其他问题似乎并不完整。

我想可靠地将命中我的 API 网关端点的 json 对象转换为

application/x-www-form-urlencoded
,以便我可以将其传递到 SQS 队列中。

到目前为止,我已经尝试了网上可以找到的所有可用选项:

上面的方法在转换后产生以下主体:

MessageBody=%7B%22event_type%22%3A%22click%22%2C%22click_time%22%3A%222023-10-17T00%3A55%3A04Z%22%2C%22user_agent%22%3A%22Mozilla%2F5.0%20(iPhone%3B%20CPU%20iPhone%20OS%2016_3_1%20like%20Mac%20OS%20X)%20AppleWebKit%2F605.1.15%20(KHTML%2C%20like%20Gecko)%20Version%2F16.3%20Mobile%2F15E148%20Safari%2F604.1%22%7D&Action=SendMessage

我也尝试过:

产生与上面类似的结果。

在这两种情况下,api 网关中都会抛出相同的错误:

Received response. Status: 404, Integration latency

再往下几行:

 Endpoint response body before transformations: <UnknownOperationException/>

我什至尝试做一些奇特的映射模板的东西,但这不起作用(也许你可以发现其中的错误:

#set($inputJson = $input.body)

#set($urlEncodedParams = "")
#foreach($key in $inputJson.keySet())
  #set($value = $inputJson.get($key))
  #if($foreach.hasNext)
    #set($urlEncodedParams = "$urlEncodedParams${esc.url($key)}=${esc.url($value)}&")
  #else
    #set($urlEncodedParams = "$urlEncodedParams${esc.url($key)}=${esc.url($value)}")
  #end
#end

MessageBody=$urlEncodedParams&Action=SendMessage

注意:我目前没有设置内容类型标头,它是开放的,因为该端点将接收 urlencoded 和 json 数据,依靠正确的映射模板来获取它。

请尽你所能,我觉得如果解决得可靠的话,随着时间的推移,这可以帮助很多人。

伊森

TLDR:我想将到达我的 api 网关的 JSON 数据转换为 x-www-form-encoded,以便我可以将其转发到我的 SQS 队列。

之前(传入):

{
  "event_type": "click",
  "click_time": "2023-10-16T22:39:59Z",
  "user_agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 16_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.3 Mobile/15E148 Safari/604.1"
}

之后(传递给SQS):

MessageBody=event_type%3Dclick%26click_time%3D2023-10-16T22%3A39%3A59Z%26user_agent%3DMozilla%2F5.0%20%28iPhone%3B%20CPU%20iPhone%20OS%2016_3_1%20like%20Mac%20OS%20X%29%20AppleWebKit%2F605.1.15%20%28KHTML%2C%20like%20Gecko%29%20Version%2F16.3%20Mobile%2F15E148%20Safari%2F604.1&Action=SendMessage

更新2:

当我切换到如下所示的本机集成时,我收到此错误:

{"Error":{"Code":"AWS.SimpleQueueService.NonExistentQueue","Message":"The specified queue does not exist for this wsdl version...

检查cloudwatch,我看到:

Sending request to https://sqs.us-east-1.amazonaws.com/?Action=SendMessage

显然,这缺少实际队列的路径,即使我在转换后将其包含在请求正文中:

{
    "MessageBody": "{\"event_type\":\"click\"}",
    "QueueUrl": "https://sqs.us-east-1.amazonaws.com/..."
}

之前,我将操作类型设置为

Use Path Override
,这样我就可以直接放置队列 url,如下所示:

{ACCOUNTID}/{QUEUE-PATH}

这有效,但不适用于下面的映射模板。

aws-api-gateway amazon-sqs vtl mapping-template
1个回答
0
投票

您不需要使用

application/x-www-form-urlencoded
来调用SQS,JSON工作正常。

  1. 创建原生 AWS 服务集成:使用 SQS 表示服务,
    SendMessage
    表示操作。
  2. 将此模板用于
    application/json
    {
      "MessageBody": "$util.escapeJavaScript($input.json('$'))",
      "QueueUrl": "[queue-url]"
    }
    

这也可以作为穷人的验证:如果您的输入不是有效的 JSON,端点将失败。

如果您有适当的验证,或者如果您不关心 JSON 的格式是否良好,则可以稍微简化一下:

{
  "MessageBody": "$util.escapeJavaScript($input.body)",
  "QueueUrl": "[queue-url]"
}
© www.soinside.com 2019 - 2024. All rights reserved.