定义API GATEWAY列表类型参数

时间:2018-09-07 12:17:25

标签: javascript arrays amazon-web-services aws-api-gateway

根据aws docs,可以将列表类型的查询参数以格式foo=1,2,3传递给

但是当我以这种方式进行操作时,我收到string而不是array的lambda event.queryStringParameters.foo === '1,2,3'

我是否缺少某些东西,或者aws不支持此功能?

2 个答案:

答案 0 :(得分:1)

经过一些日志记录后,API GATEWAY解析了与event.multiValueQueryStringParameters中的列表相同的查询键

因此,如果您提出请求

GET https://execute-api.eu-central-1.amazonaws.com/stage/foo?bar=1&bar=2&bar=3

它将作为数组出现在event.multiValueQueryStringParameters

答案 1 :(得分:0)

对不起,我没有足够的代表对此发表评论,因此必须将其提交为答案。

似乎有一个新的Lambda事件字段“ multiValueQueryStringParameters”。

例如,以下URL将在AWS Lambda中生成此事件:

https://example.uk/API/search?excludeLabels=sstc&excludeLabels=empty&excludeLabels=removed&limit=500

{
  "resource": "/{proxy+}",
  "path": "/API/search",
  "httpMethod": "GET",
  "headers": {},
  "multiValueHeaders": {},
  "queryStringParameters": {
      "excludeLabels": "removed",
      "limit": "500"
  },
  "multiValueQueryStringParameters": {
      "excludeLabels": [
          "sstc",
          "empty",
          "removed"
      ],
      "limit": [
          "500"
      ]
  },
  "pathParameters": {
      "proxy": "search"
  },
  "stageVariables": {},
  "requestContext": {},
  "body": null,
  "isBase64Encoded": false
}

请注意,字段“ queryStringParameters”仅包含最后一个值。

您可以通过urijs库轻松处理这两个问题:

module.exports.handler = async (event, context) => {
  const { path, queryStringParameters, multiValueQueryStringParameters } = event;

  const uriPath = new URI(path);
  if (queryStringParameters) {
    uriPath.query(queryStringParameters);
  }

  if (multiValueQueryStringParameters) {
    uriPath.query(multiValueQueryStringParameters);
  }
  
  // -- snip bootstrap of HAPI server --
  
  // map lambda event to hapi request
  const options = {
    credentials: event.requestContext.authorizer,
    headers,
    method: event.httpMethod,
    payload: event.body,
    url: uriPath.toString(),
    validate: false,
  };

  const res = await hapiServer.inject(options);

  return {
    statusCode: res.statusCode,
    headers: res.headers,
    body:
      typeof res.result === 'string' ? res.result : JSON.stringify(res.result),
  };
}