requestParameters返回“指定的映射表达式无效:true”

时间:2016-03-21 02:33:47

标签: amazon-web-services aws-cli aws-api-gateway serverless-framework

我正在配置lambda函数的API网关与Serverless Framework版本0.4.2的集成。

我的问题是定义端点的请求参数。 AWS docs for API gateway条目说:

  

requestParameters的

     

表示Amazon API Gateway可以接受的请求参数。请求参数表示为键/值映射,源为键,布尔标志为值。 Boolean标志用于指定参数是否是必需的。源必须匹配模式method.request。{location}。{name},其中location是查询字符串,路径或标头。 name是有效的唯一参数名称。此处指定的源可用于集成以映射到集成请求参数或模板。

据我了解,s-function.json中的配置直接提供给AWS CLI,因此我已按以下格式指定了请求参数: "method.request.querystring.startYear": true。但是,我收到Invalid mapping expression specified: true错误。我也尝试将配置指定为"method.request.querystring.startYear": "true",结果相同。

s-function.json

{
    "name": "myname",
    // etc...
    "endpoints": [
        {
            "path": "mypath",
            "method": "GET",
            "type": "AWS",
            "authorizationType": "none",
            "apiKeyRequired": false,
            "requestParameters": {
                "method.request.querystring.startYear": true,
                "method.request.querystring.startMonth": true,
                "method.request.querystring.startDay": true,
                "method.request.querystring.currentYear": true,
                "method.request.querystring.currentMonth": true,
                "method.request.querystring.currentDay": true,
                "method.request.querystring.totalDays": true,
                "method.request.querystring.volume": true,
                "method.request.querystring.userId": true
            },
            // etc...
        }
    ],
    "events": []
}

有什么想法吗?提前谢谢!

4 个答案:

答案 0 :(得分:2)

看起来requestParameters文件中的s-function.json适用于configuring the integration request section,所以我最终使用了:

"requestParameters": {
    "integration.request.querystring.startYear" : "method.request.querystring.startYear",
    "integration.request.querystring.startMonth" : "method.request.querystring.startMonth",
    "integration.request.querystring.startDay" : "method.request.querystring.startDay",
    "integration.request.querystring.currentYear" : "method.request.querystring.currentYear",
    "integration.request.querystring.currentMonth" : "method.request.querystring.currentMonth",
    "integration.request.querystring.currentDay" : "method.request.querystring.currentDay",
    "integration.request.querystring.totalDays" : "method.request.querystring.totalDays",
    "integration.request.querystring.volume" : "method.request.querystring.volume",
    "integration.request.querystring.userId" : "method.request.querystring.userId"
},

最终将它们自动添加到信息中心的方法请求部分:

Method request section with parameters automatically added

然后我可以在映射模板中使用它们将它们变成一个方法帖子,该帖子将作为event发送到我的Lambda函数中。现在我有一个我正在使用的特定映射模板,但我将来可能会使用Alua K's suggested method以通用方式映射所有输入,这样我就不必为其配置单独的映射模板每个功能。

答案 1 :(得分:1)

您可以将查询参数传递给lambda,如

"requestTemplates": {
     "application/json": {
        "querystring": "$input.params().querystring"
      }
 }

在lambda函数中访问查询字符串,如event.querystring

答案 2 :(得分:0)

确保您也使用正确的终点。在AWS中有两种类型或类似的东西。我的朋友在过去就被抓住了。

答案 3 :(得分:0)

首先,您需要执行put-method命令来创建带有查询参数的Method-Request:

aws apigateway put-method --rest-api-id "yourAPI-ID" --resource-id "yourResource-ID" --http-method GET --authorization-type "NONE" --no-api-key-required --request-parameters "method.request.querystring.paramname1=true","method.request.querystring.paramname2=true"

在此之后,您可以执行put-integration命令,仅此命令会起作用。否则会给出无效的映射错误

"requestParameters": {
    "integration.request.querystring.paramname1" : "method.request.querystring.paramname1",
    "integration.request.querystring.paramname2" : "method.request.querystring.paramname2",