如何将数组查询参数传递给 AWS API 网关?

How to pass array query params to AWS API Gateway?

A Rails API 通常喜欢这样的数组查询参数:

example.com?colors[]=cyan&colors[]=magenta&colors[]=yellow&colors[]=black

我如何将其映射到 lambda 函数?

一点点试错表明它是这样的:

example.com?colors=['cyan','magenta','yellow','black']

您不能做的一件事是根据 https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-known-issues.html:

复制查询字符串参数键

Duplicated headers are not supported.

API 网关将参数映射到 JSON 对象,因此只要每个项目都有自己唯一的密钥,您就不会受到任何破坏。

你的选择不错,但我想出了一些其他的选择。您可以做一些事情,例如在方括号中添加索引:

example.com?colors[0]=cyan&colors[1]=magenta&colors[2]=yellow&colors[3]=black

如果您愿意从 GET 转换为 POST,您可以在 POST 正文中发送查询字符串。然后您可以自己解析原始查询字符串。你甚至可以在这里重复参数键,因为你正在解析它。

?colors=cyan&colors=magenta&colors=yellow&colors=black

另一个POST选项是在POST正文中发送一个JSON数组。我知道 POST 不像 GET 那样容易使用,但它是一个选项。

["cyan","magenta","yellow","black"]

如@kjs3 回答中所述,API 网关不支持查询字符串或 headers 中的重复参数。但是,您可以使用单参数数组格式。

支持重复参数键+值是我们想要做的事情,但我目前没有预计到达时间。

API 网关代理现在支持查询字符串中具有相同名称的多个参数。 它们在 multiValueQueryStringParameters 字典中传递。

例如

 GET /api/path/?param=value&param=othervalue&something=thing

将生成以下请求:

{
    "resource": "/{proxy+}",
    "path": "/ap/path/",
    "httpMethod": "GET",
    "queryStringParameters": {
        "param": "othervalue",  # only the last value is kept here
        "something": "thing"
    },
    "multiValueQueryStringParameters": {
        "param": [
            "value",
            "othervalue"
        ],
        "something": [
            "thing"
        ]
    },
    "pathParameters": {
        "proxy": "api/path"
    },
    # etc
}

documentation

如果有人在 AWS Api 网关中使用 OpenAPI 3.0 规范,那么您需要像这样在 x-amazon-apigateway-integration 中定义它。

x-amazon-apigateway-integration:
        ...
        requestParameters:
            integration.request.querystring.colors: method.request.multivaluequerystring.colors
        ...