例如,如果我们想用
得到-用户?name =鲍勃
or
获取/用户/鲍勃
如何将这两个例子作为参数传递给Lambda函数?
我在文档中看到了一些关于设置“映射from”的内容,但我在API Gateway控制台中找不到该设置。
method.request.path。在方法请求页面中定义了一个名为parameter-name的路径参数。
method.request.querystring。parameter-name用于在方法请求页面中定义的名为parameter-name的查询字符串参数。
尽管我定义了一个查询字符串,但我没有看到这两个选项。
如今,AWS上的API Gateway控制台中包含了一个下拉模板。
对于您的API,单击资源名称…然后
展开“Body Mapping Templates”
输入
application / json
为Content-Type(必须显式地输入),并单击勾
一个新窗口将打开,显示“生成模板”和一个下拉菜单(见图)。
选择
请求传递
然后点击保存
要访问任何变量,只需使用以下语法(这是Python)
例如URL:
https://yourURL.execute-api.us-west-2.amazonaws.com/prod/confirmReg?token=12345&uid=5
可以得到如下变量:
from __future__ import print_function
import boto3
import json
print('Loading function')
def lambda_handler(event, context):
print(event['params']['querystring']['token'])
print(event['params']['querystring']['uid'])
因此,不需要显式地命名或映射您想要的每个变量。
我的2美分:很多答案建议激活“使用Lambda代理集成”选项,并从$.event中获取参数。queryStringParameter或$.event. pathparameters。但如果你碰巧激活了访问控制允许起源(又名CORS),请继续阅读。
在撰写本文时,Lambda代理集成和CORS还不能很好地协同工作。我的方法是禁用Lambda代理集成的复选框,并手动为请求和响应提供一个映射模板,如下所示:
为application/json请求模板:
{
#set($params = $input.params().querystring)
"queryStringParameters" : {
#foreach($param in $params.keySet())
"$param" : "$util.escapeJavaScript($params.get($param))" #if($foreach.hasNext),#end
#end
},
#set($params = $input.params().path)
"pathParameters" : {
#foreach($param in $params.keySet())
"$param" : "$util.escapeJavaScript($params.get($param))" #if($foreach.hasNext),#end
#end
}
}
请注意,我故意将属性命名为queryStringParameters和pathParameters,以模拟Lambda代理集成将生成的名称。这样,如果有一天我激活Lambda代理集成,我的lambdas将不会中断。
application/json的响应模板:
#set($payload = $util.parseJson($input.json('$')))
#set($context.responseOverride.status = $payload.statusCode)
$payload.body
你如何在你的lambda (python)中读取这些?(假设参数是可选的)
def handler(event, context):
body = event["queryStringParameters"] or {}
result = myfunction(**body)
return {
"statusCode": code,
"headers": {
"content-type": "application/json",
},
"body": result
}
我的目标是传递一个类似于:
protodb?sql=select * from protodb.prototab
到Node.js 12 Lambda函数通过一个URL从API网关。我尝试了其他答案中的一些想法,但真的想以最原生的API网关UI方式做一些事情,所以我想出了这个对我有用的方法(截至2020年12月的API网关UI):
在给定API的API Gateway控制台中,在资源下,选择get方法。然后选择其Integration Request并在页面顶部为lambda函数填写数据。
滚动到底部并打开映射模板部分。如果没有定义模板,则选择“请求正文传递”(推荐)。
点击添加映射模板,创建一个内容类型为application/json的映射模板,然后点击选中标记按钮。
对于该映射模板,在生成模板的下拉列表中选择方法请求传递,它将用AWS传递所有内容的一般方式填充它下面的文本框。
点击保存按钮。
现在当我测试它的时候,我不能让参数通过事件。在Lambda函数下node JS下的sql。事实证明,当API网关将URL sql查询参数发送给Lambda函数时,它对Node.js来说是这样的:
var insql = event.params.querystring.sql;
所以对我来说,花了一些时间的技巧是使用JSON。通过Stringify来显示完整的事件堆栈,然后通过下面的部分来从查询字符串中提取SQL参数。
基本上,你可以在API网关中使用默认的传递功能,诀窍是当你在Lambda函数中,参数是如何传递的。