相关疑难解决方法(0)

通过API网关在aws Lambda中获取json主体

我目前正在使用NodeJS通过AWS Api Gateway在AWS lambda上构建机器人,我遇到了POST请求和JSON数据的问题.我的api使用'使用Lambda代理集成',甚至当我测试代理发送内容类型的Application/json和一些json在体内时,例如{"foo":"bar"}我无法访问该对象而不先解析它

例如

  var json = JSON.parse(event.body);
  console.log(json.foo);
Run Code Online (Sandbox Code Playgroud)

现在我知道通过JSON.parse运行它似乎并不是什么大不了的事,但我已经看到了许多其他例子,根本不是这种情况.请看这里https://github.com/pinzler/fb-messenger-bot-aws-lambda/blob/master/index.js

我是否需要向API网关添加任何内容才能正确处理?'post method request'部分中的'request body'步骤具有针对请求主体的内容类型application/json设置.

据我所知,上面例子的自述文件似乎没有使用代理集成,所以我不确定我应该在这里做什么

aws-lambda aws-api-gateway

52
推荐指数
3
解决办法
6万
查看次数

Lambda集成与Lambda代理:优点和缺点

您认为在AWS API Gateway中使用和不使用代理功能的Lambda集成的优点和缺点是什么(更具体地说,在使用无服务器框架时)?这是我现在的想法:

Lambda与代理集成

  • Pro:人们可以快速进行原型设计和编码,而无需担心所有必需的配置细节(并重新发明一些轮子,如通用模板映射等).
  • Pro:返回任何状态代码和自定义标题非常容易,同时还有一种通用的方法来读取请求的正文,标题和参数.
  • Con:一切都在代码中完成,因此自动生成文档有点困难.依赖关系(标题,模型,返回的状态代码)在代码中"隐藏".

没有代理的Lambda集成

  • Con:需要更多的工作来设置它,并且这种配置可能在不同的资源中重复.
  • Pro:它允许人们分离lambda接收和返回的内容,以及如何将其映射到不同的HTTP状态代码,标头和有效负载.
  • Pro:非常有用,因为它预先规定了它返回的内容,以及它在标题和有效负载方面的要求.
  • Pro:从长远来看,设置所有内容时的艰苦工作非常有用,因为可以将所有内容导出到Swagger,以便其他人可以使用它为它生成不同的SDK.

你的想法是什么?您通常使用Lambda Proxy还是普通的Lambda集成?你喜欢什么,为什么?

编辑:到目前为止,我倾向于总是选择不使用代理功能,因为提到的原因(解耦和说明依赖关系 - 标题,状态代码等 - 预先).

aws-lambda aws-api-gateway serverless-framework

32
推荐指数
2
解决办法
5982
查看次数

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

我已经尝试了几天来获取从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 at [来源:[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
};
Run Code Online (Sandbox Code Playgroud)

从Lambda控制台测试并使用测试数据时,我得到结果:

{
    "Hello": "TestUser123"
}
Run Code Online (Sandbox Code Playgroud)

从API网关测试中测试时,结果还是:

 {
    "Hello": "TestUser123"
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以看到为什么两个测试控制台都允许这项工作,但是当使用POSTMAN进行测试或在Swift脚本中使用它时它不起作用?

编辑1

在postman中,我已将content-type设置为application/json

该脚本返回默认值:

 {
    "Hello": "user"
}
Run Code Online (Sandbox Code Playgroud)

但是,当我在POSTMAN中添加参数名称TestUser123时,这是它返回错误的时间.

更新1

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

{ "name": "$input.params('name')" }
Run Code Online (Sandbox Code Playgroud)

结果是:

{ …
Run Code Online (Sandbox Code Playgroud)

json amazon-web-services node.js aws-lambda

15
推荐指数
3
解决办法
2万
查看次数