API网关 - 主体映射模板 - 可选的主体参数

时间:2016-07-28 22:14:30

标签: amazon-web-services post http-post aws-lambda aws-api-gateway

我有一个POST API网关方法,我发送以下应用程序/ json正文,以便将参数从它传递给该方法所连接的Lambda:

{ 
    "otherClientId": "12345",
    "message": "Text",
    "seconds": 0,
    "hours": 0
}

我使用以下映射模板:

#set($inputRoot = $input.path('$'))
{
  "authorizedUser": "$context.authorizer.principalId",
  "otherClientId": "$inputRoot.otherClientId",
  "message": "$inputRoot.message",
  "amount": $inputRoot.amount,
  "duration": $inputRoot.duration
}

我遇到的问题是,在尝试发送没有金额或持续时间的请求时,我收到“Bad String”错误。由于某些原因,这些参数似乎不是可选的(但我需要它们!)。 我可以错过其他参数,例如消息,但不能错过两个数字参数。

有没有其他人经历过这个,或者有人能指出我可能遗失的明显事实? AWS文档在这个主题上有点稀疏。

2 个答案:

答案 0 :(得分:3)

可能发生了这种情况,因为没有通过这些参数,你的json请求看起来像:

#set($inputRoot = $input.path('$'))
{
  "authorizedUser": "$context.authorizer.principalId",
  "otherClientId": "$inputRoot.otherClientId",
  "message": "$inputRoot.message",
  "amount": ,
  "duration": 
}

最简单的解决方法是用引号括起$inputRoot.amount$inputRoot.duration

#set($inputRoot = $input.path('$'))
{
   "authorizedUser": "$context.authorizer.principalId",
   "otherClientId": "$inputRoot.otherClientId",
   "message": "$inputRoot.message",
   "amount": "$inputRoot.amount",
   "duration": "$inputRoot.duration"
}

或者,您可以使用if条件连接请求,例如:

#set($hasLimit = $input.params('limit') != "")
#set($hasOffset = $input.params('offset') != "")
#set($hasPeriod = $input.params('period') != "")
#set($hasType = $input.params('type') != "")
{
    "environment": "$input.params('environment')"
    #if($hasLimit),"limit": $input.params('limit')#end
    #if($hasOffset),"offset": $input.params('offset')#end
    #if($hasPeriod),"period": "$input.params('period')"#end
    #if($hasType),"type": "$input.params('type')"#end
}

答案 1 :(得分:0)

当您想要引用“秒”和“小时”的输入字段名称时,我认为您通过$ inputRoot意外地引用了转换后的字段名称。不确定您希望该映射查找金额和持续时间,但您提供的输入中不存在$ inputRoot.amount和$ inputRoot.duration。

#set($inputRoot = $input.path('$'))
{
  "authorizedUser": "$context.authorizer.principalId",
  "otherClientId": "$inputRoot.otherClientId",
  "message": "$inputRoot.message",
  "amount": $inputRoot.seconds,
  "duration": $inputRoot.hours
}