例如,如果我们想用
得到-用户?name =鲍勃
or
获取/用户/鲍勃
如何将这两个例子作为参数传递给Lambda函数?
我在文档中看到了一些关于设置“映射from”的内容,但我在API Gateway控制台中找不到该设置。
method.request.path。在方法请求页面中定义了一个名为parameter-name的路径参数。
method.request.querystring。parameter-name用于在方法请求页面中定义的名为parameter-name的查询字符串参数。
尽管我定义了一个查询字符串,但我没有看到这两个选项。
为了将参数传递给lambda函数,您需要在API Gateway请求和lambda函数之间创建映射。映射在所选API Gateway资源的集成请求->映射模板部分中完成。
创建一个application/json类型的映射,然后在右侧编辑(单击铅笔)模板。
映射模板实际上是一个Velocity模板,你可以使用if,循环,当然还可以打印变量。模板中注入了这些变量,你可以分别访问查询字符串参数、请求头等等。使用下面的代码,您可以重新创建整个查询字符串:
{
"querystring" : "#foreach($key in $input.params().querystring.keySet())#if($foreach.index > 0)&#end$util.urlEncode($key)=$util.urlEncode($input.params().querystring.get($key))#end",
"body" : $input.json('$')
}
注意:点击复选符号保存模板。您可以使用资源中的“test”按钮测试更改。但是为了在AWS控制台中测试查询字符串参数,您需要在资源的Method Request部分中定义参数名称。
注意:查看Velocity用户指南以获得关于Velocity模板语言的更多信息。
然后在你的lambda模板中,你可以执行以下操作来解析查询字符串:
var query = require('querystring').parse(event.querystring)
// access parameters with query['foo'] or query.foo
正如@Jonathan的回答,在集成请求中标记使用Lambda代理集成后,在您的源代码中,您应该按以下格式实现通过502坏网关错误。
NodeJS 8.10:
exports.handler = async (event, context, callback) => {
// TODO: You could get path, parameter, headers, body value from this
const { path, queryStringParameters, headers, body } = event;
const response = {
"statusCode": 200,
"headers": {
"Content-Type": "application/json"
},
"body": JSON.stringify({
path,
query: queryStringParameters,
headers,
body: JSON.parse(body)
}),
"isBase64Encoded": false
};
return response;
};
在重新运行API之前,不要忘记在API网关部署您的资源。
Response JSON只返回正文中正确的集合。
你可以从事件中获取路径,参数,头,体值
const {path, queryStringParameters, headers, body} = event;
我的目标是传递一个类似于:
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函数中,参数是如何传递的。
为了将参数传递给lambda函数,您需要在API Gateway请求和lambda函数之间创建映射。映射在所选API Gateway资源的集成请求->映射模板部分中完成。
创建一个application/json类型的映射,然后在右侧编辑(单击铅笔)模板。
映射模板实际上是一个Velocity模板,你可以使用if,循环,当然还可以打印变量。模板中注入了这些变量,你可以分别访问查询字符串参数、请求头等等。使用下面的代码,您可以重新创建整个查询字符串:
{
"querystring" : "#foreach($key in $input.params().querystring.keySet())#if($foreach.index > 0)&#end$util.urlEncode($key)=$util.urlEncode($input.params().querystring.get($key))#end",
"body" : $input.json('$')
}
注意:点击复选符号保存模板。您可以使用资源中的“test”按钮测试更改。但是为了在AWS控制台中测试查询字符串参数,您需要在资源的Method Request部分中定义参数名称。
注意:查看Velocity用户指南以获得关于Velocity模板语言的更多信息。
然后在你的lambda模板中,你可以执行以下操作来解析查询字符串:
var query = require('querystring').parse(event.querystring)
// access parameters with query['foo'] or query.foo
Lambda函数需要JSON输入,因此需要解析查询字符串。解决方案是使用Mapping Template将查询字符串更改为JSON。我用它为c# . net核心,所以预期的输入应该是一个JSON与“queryStringParameters”参数。遵循以下4个步骤来实现这一目标:
打开API Gateway资源的映射模板,添加新的application/json content-tyap:
Copy the template below, which parses the query string into JSON, and paste it into the mapping template:
{
"queryStringParameters": {#foreach($key in $input.params().querystring.keySet())#if($foreach.index > 0),#end"$key":"$input.params().querystring.get($key)"#end}
}
In the API Gateway, call your Lambda function and add the following query string (for the example): param1=111¶m2=222¶m3=333
The mapping template should create the JSON output below, which is the input for your Lambda function.
{
"queryStringParameters": {"param3":"333","param1":"111","param2":"222"}
}
You're done. From this point, your Lambda function's logic can use the query string parameters.
Good luck!