无法将请求主体解析为json:意外字符(\' - \'(代码45))AWS Lambda + API +邮递员

时间:2016-03-24 21:13:04

标签: json node.js amazon-web-services aws-lambda

我一直在尝试将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时,我得到

  

坏字符串

Lambda函数

该功能是演练的基本示例:

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脚本中使用它时它不起作用?

编辑1

在邮差中,我已将内容类型设置为 application / json

脚本返回默认值:

 {
    "Hello": "user"
}

但是,当我在POSTMAN中添加名称 TestUser123 参数时,就会返回错误。

更新1

好的,所以我将映射模板更改为我在另一个答案中找到的模板:

{ "name": "$input.params('name')" }

现在的结果是:

{
   "Hello": ""
}

任何想法为什么没有得到这个名字?

4 个答案:

答案 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
}

无需复制粘贴,只需输入 heightincome 的行。