到SQS的AWS API网关-主体映射模板

时间:2018-06-26 01:04:21

标签: amazon-web-services aws-api-gateway velocity amazon-sqs

我正在尝试从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的完全访问权限,但仍然出现错误。

我相信自己做错了什么,但我无法确切地确定是什么。

有人可以帮忙吗? 谢谢

1 个答案:

答案 0 :(得分:0)

SQS错误可能是由查询字符串解析中的错误或异常引起的,碰巧会捕获到该错误或异常,否则模板的其余部分将不会显示,但会生成某种其他报告事件。

您可以继续二分法以了解哪些行确实存在问题。

但是您为什么要自己执行解析?您可以这样做:

#set($idLote = "$!input.params('IDLote')")
#set($idCliente = "$!input.params('IDCliente')")
#set($status = "$!input.params('Status')")
#set($resposta = "$!input.params('Reposta')")