例如,如果我们想用

得到-用户?name =鲍勃

or

获取/用户/鲍勃

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

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

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

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


当前回答

Python 3.8 with boto3 v1.16v - 2020年12月

配置路由时,必须配置“API网关”接受路由。否则,除了基本路由之外,其他所有内容都将以{missing auth令牌}或其他内容结束…

一旦你配置API网关接受路由,确保你启用了lambda代理,这样事情就会更好地工作,

要访问路由,

new_route = event['path'] # /{some_url}

访问查询参数

query_param = event['queryStringParameters'][{query_key}]

其他回答

我已经使用这个映射模板为Lambda事件提供了Body、Headers、Method、Path和URL查询字符串参数。我写了一篇博客文章详细解释了这个模板:http://kennbrodhagen.net/2015/12/06/how-to-create-a-request-object-for-your-lambda-event-from-api-gateway/

下面是你可以使用的映射模板:

{
  "method": "$context.httpMethod",
  "body" : $input.json('$'),
  "headers": {
    #foreach($param in $input.params().header.keySet())
    "$param": "$util.escapeJavaScript($input.params().header.get($param))" #if($foreach.hasNext),#end

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

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

    #end
  }  
}

对我来说有效的方法是

转到集成请求 单击URL查询字符串参数 单击“添加查询字符串” 在name字段中放入查询名称,这里是“name” 在Mapped From字段中,放入method.request.querystring.name

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

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

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

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

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

接受的答案对我来说很好,但是扩展gimenete的答案,我想要一个通用的模板,我可以用它来传递所有的查询/路径/头参数(目前只是字符串),我得到了下面的模板。我把它贴在这里,以防有人觉得有用:

#set($keys = [])
#foreach($key in $input.params().querystring.keySet())
  #set($success = $keys.add($key))
#end

#foreach($key in $input.params().headers.keySet())
  #if(!$keys.contains($key))
    #set($success = $keys.add($key))
  #end
#end

#foreach($key in $input.params().path.keySet())
  #if(!$keys.contains($key))
    #set($success = $keys.add($key))
  #end
#end

{
#foreach($key in $keys)
  "$key": "$util.escapeJavaScript($input.params($key))"#if($foreach.hasNext),#end
#end
}