如何将数组查询参数传递给 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¶m=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
}
如果有人在 AWS Api 网关中使用 OpenAPI 3.0 规范,那么您需要像这样在 x-amazon-apigateway-integration
中定义它。
x-amazon-apigateway-integration:
...
requestParameters:
integration.request.querystring.colors: method.request.multivaluequerystring.colors
...
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¶m=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
}
如果有人在 AWS Api 网关中使用 OpenAPI 3.0 规范,那么您需要像这样在 x-amazon-apigateway-integration
中定义它。
x-amazon-apigateway-integration:
...
requestParameters:
integration.request.querystring.colors: method.request.multivaluequerystring.colors
...