【发布时间】:2018-12-04 15:01:26
【问题描述】:
我正在尝试从 API Gateway 创建 AWS SQS 代理,但我在使用 Body Mapping Template 时遇到了困难。
我收到application/x-www-form-urlencoded 内容类型的请求:
IDLote=lote434&IDCliente=5&Status=22&Resposta=testmessage
所以我创建了以下模板(将表单值映射到 JSON 对象,然后序列化到消息正文中 - 我不确定是否有更好的方法):
#set($idLote = "")
#set($idCliente = "")
#set($status = "")
#set($resposta = "")
#foreach( $token in $input.path('$').split('&') )
#set( $keyVal = $token.split('=') )
#set( $keyValSize = $keyVal.size() )
#if( $keyValSize >= 1 )
#set( $key = $util.urlDecode($keyVal[0]) )
#if( $keyValSize >= 2 )
#set( $val = $util.urlDecode($keyVal[1]) )
#else
#set( $val = '' )
#end
#if( $key == "IDLote" )
#set($idLote = $val)
#elseif( $key == "IDCliente" )
#set($idCliente = $val)
#elseif( $key == "Status" )
#set($status = $val)
#elseif( $key == "Resposta" )
#set($resposta = $val)
#end
#end
#end
#set($event = "{
""idLote"": ""1"",
""idCliente"": ""2"",
""status"": ""3"",
""resposta"": ""434""
}")
Action=SendMessage&MessageGroupId=2&MessageBody=TestMessage
变形后的身体是:
Action=SendMessage&MessageGroupId=2&MessageBody=TestMessage 符合预期(因为我没有使用创建的 JSON)。
但我从 SQS 收到错误消息:
<?xml version="1.0"?><ErrorResponse xmlns="http://queue.amazonaws.com/doc/2009-02-01/"><Error><Type>Sender</Type><Code>AccessDenied</Code><Message>Access to the resource https://sqs.us-east-1.amazonaws.com/XXXXXXXXX/queue-events.fifo is denied.</Message><Detail/></Error><RequestId>92f717d8-369c-58c8-abe9-4473b9fb2aab</RequestId></ErrorResponse>
但是,如果我从模板中删除 #foreach 并保持这样:
#set($event = "{
""idLote"": ""1"",
""idCliente"": ""2"",
""status"": ""3"",
""resposta"": ""434""
}")
Action=SendMessage&MessageGroupId=2&MessageBody=TestMessage
一切都按预期进行。转换后的请求正文和上次一样,但这次可以了。
我已授予 SQS 的完全访问权限,但我仍然收到错误消息。
我认为我做错了什么,但我无法确定到底是什么。
有人可以帮忙吗? 谢谢
【问题讨论】:
标签: amazon-web-services aws-api-gateway velocity amazon-sqs