我正在尝试从API Gateway创建AWS SQS的代理,但是在主体映射模板方面遇到了困难。
我收到一个内容类型为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的完全访问权限,但仍然出现错误。
我相信自己做错了什么,但我无法确切地确定是什么。
有人可以帮忙吗? 谢谢
答案 0 :(得分:0)
SQS错误可能是由查询字符串解析中的错误或异常引起的,碰巧会捕获到该错误或异常,否则模板的其余部分将不会显示,但会生成某种其他报告事件。
您可以继续二分法以了解哪些行确实存在问题。
但是您为什么要自己执行解析?您可以这样做:
#set($idLote = "$!input.params('IDLote')")
#set($idCliente = "$!input.params('IDCliente')")
#set($status = "$!input.params('Status')")
#set($resposta = "$!input.params('Reposta')")