我已按照本教程连接了一个 Api 网关方法来推送到 SQS 队列。
https://dzone.com/articles/creating-aws-service-proxy-for-amazon-sqs https://dzone.com/articles/creating-aws-service-proxy-for-amazon-sqs
这一切都工作正常,但我想使用一些路径参数向我的消息添加一些消息属性,但我无法让它工作。
这是教程中当前的映射模板。
Action=SendMessage&MessageBody=$util.urlEncode($util.escapeJavaScript($input.json('$')))
我尝试保留“application/x-www-form-urlencoded”格式,并将 MessageAttributes 添加到此格式,将其更改为(目前使用静态值)
Action=SendMessage&MessageBody=$util.urlEncode($util.escapeJavaScript($input.json('$')))
&MessageAttribute[0][Name]=foo&MessageAttribute[0][Type]=String&MessageAttribute[0][Value]=bar
但我得到了这个错误
{
"Error": {
"Code": "MalformedQueryString",
"Message": "Keys may not contain [",
"Type": "Sender"
},
"RequestId": "ea121e6e-ca37-5d14-b92b-4a2c6fedf403"
}
我应该如何在不使用“[”的情况下对 MessageAttribues 数组进行编码
The SQS API 参考 https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html并没有完全清楚地说明这一点,事实上,这似乎与服务真正期望看到的内容有些不一致。在电线上,它使用.member.N.
符号,和N
是从 1 开始的,而不是从 0 开始的。还,MessageAttributes
是复数。
预期的格式如下所示:
&MessageAttributes.member.1.Name=source_ip##
&MessageAttributes.member.1.Value.DataType=String##
&MessageAttributes.member.1.Value.StringValue=$util.urlEncode($context.identity.sourceIp)##
&MessageAttributes.member.2.Name=user_agent##
&MessageAttributes.member.2.Value.DataType=String##
&MessageAttributes.member.2.Value.StringValue=$util.urlEncode($context.identity.userAgent)##
&MessageAttributes.member.3.Name=stage##
&MessageAttributes.member.3.Value.DataType=String##
&MessageAttributes.member.3.Value.StringValue=$util.urlEncode($context.stage)##
The ##
是为了可读性。构建 Web 表单时,映射模板中不能有换行符,因为它们最终会出现在表单本身中,并且##
告诉 VTL 从这里到行尾的所有内容都将被忽略,包括行尾的换行符。否则嵌入的换行符会导致表单构造不正确。
另请注意,API 不允许这些值为空,因此如果有任何属性可能不存在,您将需要额外的逻辑来测试这一点并将属性替换为其他内容,因为索引号(iirc) 必须是连续的。
为什么我们使用主体映射模板来构建 API Gateway + SQS 的 Web 表单,以及有关如何配置它的更多信息,我的回答中也有更详细的解释是否可以使用 POST 正文 POST 到 SQS URL? https://stackoverflow.com/a/49566676/1695906
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)