这方面似乎没有太多文档,而且大多数其他问题似乎并不完整。
我想可靠地将命中我的 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}
这有效,但不适用于下面的映射模板。
您不需要使用
application/x-www-form-urlencoded
来调用SQS,JSON工作正常。
SendMessage
表示操作。application/json
:
{
"MessageBody": "$util.escapeJavaScript($input.json('$'))",
"QueueUrl": "[queue-url]"
}
这也可以作为穷人的验证:如果您的输入不是有效的 JSON,端点将失败。
如果您有适当的验证,或者如果您不关心 JSON 的格式是否良好,则可以稍微简化一下:
{
"MessageBody": "$util.escapeJavaScript($input.body)",
"QueueUrl": "[queue-url]"
}