【问题标题】:Could not parse request body into json: Unexpected character (\'-\' (code 45)) AWS Lambda + API + Postman无法将请求正文解析为 json:意外字符(\'-\'(代码 45))AWS Lambda + API + Postman
【发布时间】:2016-07-12 15:04:12
【问题描述】:

我已经尝试了几天从 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]"}

在邮递员中,当我以 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 Gateway 测试时,结果也是:

 {
    "Hello": "TestUser123"
}

谁能明白为什么两个测试控制台都允许这项工作,但是当使用 POSTMAN 测试或在 Swift 脚本中使用时,它却不起作用?

编辑 1

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

脚本返回默认值:

 {
    "Hello": "user"
}

但是,当我在 POSTMAN 中添加参数 nameTestUser123 时,它会返回错误。

更新 1

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

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

现在结果是:

{
   "Hello": ""
}

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

【问题讨论】:

  • 任何不赞成投票且没有任何 cmets 的理由 - 不是很有帮助
  • 我注意到 Postman 默认返回“Bad string”(Body > Pretty)。更改为原始响应。

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


【解决方案1】:

我今天刚被这个卡住了。

您的映射模板是:

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

AWS 使用 AWS Velocity 模板,该模板;即使看起来像 JSON,也是不同的。

如果你使用

{ "name": $input.params('name') } // notice no quotes

对于集成请求步骤中的映射模板,它应该可以按预期工作。

【讨论】:

  • @ARUNBALANNV 您能否在此问题中添加您的详细信息,以便我查看问题所在?
  • @AmreshVenugopal $input.params('name') 的原始输出到底是什么?
  • 如果您的请求参数有一个名为 'name' ?name=text 的模板 "name":input.params('name') 的查询参数,则 name 属性将设置为 name 的值,此处为 text。默认 API Gateway 行为是在请求对象与模板不匹配时按原样传递它们,因此您可能不会注意到任何差异。
  • 非常有价值的信息,拯救了我的一天
【解决方案2】:

仔细阅读错误信息,它实际上告诉你问题所在。例如,我得到了

无法将请求正文解析为 json:意外字符(\'\"\'(代码 34)):期望用逗号分隔对象条目

所以问题是我缺少一个逗号。我检查了我的 Lambda 的 Integration Request - Body Mapping Template

{
"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 中缺少一个点。

【讨论】:

  • 我收到此错误{"message": "Unsupported Media Type"}
【解决方案3】:

错误信息:

Could not parse request body into json: Could not parse payload into json: Unrecognized token \' \': was expecting (\'true\', \'false\' or \'null\')

错误原因:当 json 中的字符串值未在 aws 映射模板中使用双引号分配时,会发生错误。

解决方案:(请注意:此示例为 application/json 类型的请求模板)

其实这个问题的解决方法是,如果你在json中使用的是string类型的值,那么它的值应该在映射模板中的(“”-双引号)内赋值。

下面显示的示例具有以下属性:

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 映射模板中的可选参数。

【讨论】:

  • 这应该更高。为字符串类型值添加双引号解决了它。
【解决方案4】:

您可能在 API 网关的“集成请求”中复制粘贴了多行。

复制一行并将其粘贴到下方时,您可能复制了该行末尾的隐藏字符“\n”。这可能会导致 lambda 函数出现问题。

示例:复制包含age的行并粘贴两次,分别修改为身高和收入。

#set($inputRoot = $input.path('$'))
{
  "age" : $inputRoot.age,
  "height": $inputRoot.height,
  "income": $inputRoot.income
}

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

【讨论】:

    猜你喜欢
    • 2021-01-16
    • 2018-12-01
    • 2016-02-07
    • 2016-01-30
    • 2017-01-10
    • 1970-01-01
    • 2020-04-16
    • 1970-01-01
    • 2021-10-03
    相关资源
    最近更新 更多