我一直在尝试将AWS中API网关发送的参数发送到Lambda函数,但我没有成功。
我决定从头开始,所以我跟着他们的演练(http://docs.aws.amazon.com/apigateway/latest/developerguide/getting-started.html#getting-started-new-lambda)
我已经检查过两次这次演练了,我已按照这些步骤进行了操作。
当我从Postman或Swift测试API时,我收到错误:
{“message”:“无法将请求正文解析为json:意外字符(\' - \'(代码45))的数值:预期数字(0-9)跟随减号,表示有效数值\ n在[来源:[B @ c036d15;第1行,第3栏]“}
在postman中,当我将结果视为JSON时,我得到
坏字符串
该功能是演练的基本示例:
console.log('Loading event');
exports.handler = function(event, context) {
var name = (event.name === undefined ? 'No-Name' : event.name);
console.log('"Hello":"' + name + '"');
context.done(null, {"Hello":name}); // SUCCESS with message
};
从Lambda控制台测试并使用测试数据时,我得到结果:
{
"Hello": "TestUser123"
}
从API网关测试中测试时,结果还是:
{
"Hello": "TestUser123"
}
任何人都可以看到为什么两个测试控制台都允许这项工作,但是当使用POSTMAN进行测试或在Swift脚本中使用它时它不起作用?
在邮差中,我已将内容类型设置为 application / json
脚本返回默认值:
{
"Hello": "user"
}
但是,当我在POSTMAN中添加名称和 TestUser123 参数时,就会返回错误。
好的,所以我将映射模板更改为我在另一个答案中找到的模板:
{ "name": "$input.params('name')" }
现在的结果是:
{
"Hello": ""
}
任何想法为什么没有得到这个名字?
答案 0 :(得分:4)
我今天刚刚陷入困境。
您的地图模板是:
Dim matches = From str In strings
Where str Like "*.#.*"
Console.WriteLine(String.Join(Environment.NewLine, matches))
AWS使用AWS Velocity模板,其中;即使看起来像JSON,也是不同的。
如果您使用
{ "name": "$input.params('name')" }
对于集成请求步骤中的映射模板,它应该按预期工作。
答案 1 :(得分:1)
非常仔细地阅读错误消息,它实际上告诉您问题所在。例如,我得到了
无法将请求正文解析为json:意外字符(\'\“ \'(代码34)):是期望逗号分隔对象条目
所以问题是我缺少逗号。我检查了Lambda的集成请求-身体映射模板:
{
"age" : $input.json('$.persondata.age'),
"income" : $input.json('$.persondata.income')
"height" : $input.json('$.persondata.height')
}
您能发现问题吗?在收入线后我缺少逗号。
这是另一个例子。
无法将请求正文解析为json:意外字符(\'} \'(代码125)):预期值为
当我查看集成请求-主体映射模板时:
#set($inputRoot = $input.path('$'))
{
"age" : $inputRoot.age,
"height" : $inputRoot.height,
"income" : $inputRootincome
}
您能发现问题吗?我在$ inputRootincome中缺少一个点。
答案 2 :(得分:0)
错误消息:
Could not parse request body into json: Could not parse payload into json: Unrecognized token \' \': was expecting (\'true\', \'false\' or \'null\')
错误原因:当在aws映射模板中未使用双引号分配json内的字符串值时,就会发生错误。
解决方案:(请注意:此示例适用于应用程序/ json类型请求模板)
实际上,解决该问题的方法是,如果您在json中使用字符串类型的值,则应在映射模板的(“”-双引号)内分配其值。
下面显示的示例具有以下属性:
customerId - string (Please note : this value comes from a query parameter) customerName - string customerAge - integer isPermanentEmployee - boolean customerAddress - string (Please note this is an optional parameter)
应按照以下示例定义映射模板
请参考以下示例:
#set($inputRoot = $input.path('$'))
{
"CustomerId": "$input.params('customerId')",
"CustomerName": "$inputRoot.customerName",
"CustomerAge": $inputRoot.customerAge,
"IsPermanentEmployee": $inputRoot.isPermanentEmployee
"CustomerAddress ": #if($inputRoot.customerAddress == "") "" #elseif($inputRoot.customerAddress != "") "$inputRoot.customerAddress" #end
}
如果您注意到上面的映射模板,我将在双引号(“”)中给出字符串值,这将解决错误
此示例还包含如何使用#if#else语句在AWS映射模板中处理可选参数。
答案 3 :(得分:0)
您可能在 API 网关的“集成请求”中复制了多行。
复制一行并将其粘贴到下方时,您可能复制了该行末尾的隐藏字符“\n”。这可能会导致 lambda 函数出现问题。
示例:复制包含 age
的行并粘贴两次并修改它们分别具有高度和收入。
#set($inputRoot = $input.path('$'))
{
"age" : $inputRoot.age,
"height": $inputRoot.height,
"income": $inputRoot.income
}
无需复制粘贴,只需输入 height
和 income
的行。