我目前正在使用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 API Gateway中使用和不使用代理功能的Lambda集成的优点和缺点是什么(更具体地说,在使用无服务器框架时)?这是我现在的想法:
Lambda与代理集成
没有代理的Lambda集成
你的想法是什么?您通常使用Lambda Proxy还是普通的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 at [来源:[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
};
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脚本中使用它时它不起作用?
在postman中,我已将content-type设置为application/json
该脚本返回默认值:
{
"Hello": "user"
}
Run Code Online (Sandbox Code Playgroud)
但是,当我在POSTMAN中添加参数名称和TestUser123时,这是它返回错误的时间.
好的,所以我将映射模板更改为我在另一个答案中找到的模板:
{ "name": "$input.params('name')" }
Run Code Online (Sandbox Code Playgroud)
结果是:
{ …Run Code Online (Sandbox Code Playgroud)