例如,如果我们想用

得到-用户?name =鲍勃

or

获取/用户/鲍勃

如何将这两个例子作为参数传递给Lambda函数?

我在文档中看到了一些关于设置“映射from”的内容,但我在API Gateway控制台中找不到该设置。

method.request.path。在方法请求页面中定义了一个名为parameter-name的路径参数。 method.request.querystring。parameter-name用于在方法请求页面中定义的名为parameter-name的查询字符串参数。

尽管我定义了一个查询字符串,但我没有看到这两个选项。


当前回答

让它工作的步骤是:

在API网关控制台中…

Go to Resources -> Integration Request Click on the plus or edit icon next to the templates dropdown (odd I know since the template field is already open and the button here looks greyed out) Explicitly type application/json in the content-type field even though it shows a default (if you don't do this it will not save and will not give you an error message) put this in the input mapping { "name": "$input.params('name')" } click on the check box next to the templates dropdown (I'm assuming this is what finally saves it)

其他回答

查询字符串可以直接在lambda中用javascript解析

GET /user?name =鲍勃

 var name = event.queryStringParameters.name;

但是,这并不能解决GET用户/bob的问题。

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&param2=222&param3=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!

如今,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'])

因此,不需要显式地命名或映射您想要的每个变量。

我的目标是传递一个类似于:

 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函数中,参数是如何传递的。

这里的很多答案都很棒。但我想要简单一点的东西。 我想要一些东西,将与“Hello World”样本免费工作。这意味着我想要一个简单的生成一个匹配查询字符串的请求体:

{
#foreach($param in $input.params().querystring.keySet())
  "$param": "$util.escapeJavaScript($input.params().querystring.get($param))" #if($foreach.hasNext),#end
#end
}

我认为上面的答案在构建一些真实的东西时产生了一些更有用的东西,但是对于使用AWS的模板快速运行一个hello世界来说,这非常有用。