我正在编写一个 Lambda 函数,该函数返回 Python 中的 Lambda 代理集成 的响应。 API 期望标头是字典。
{
"isBase64Encoded": true|false,
"statusCode": httpStatusCode,
"headers": { "headerName": "headerValue", ... },
"body": "..."
}
这要求每个标头字段都是唯一的,因此无法使用多个
Set-Cookie
。
我已经尝试将字典转换为元组列表
{
"isBase64Encoded": true|false,
"statusCode": httpStatusCode,
"headers": [ ("headerName": "headerValue"), ... ],
"body": "..."
}
但 API 网关抱怨
Malformed Lambda proxy response
。
知道如何设置同名的标题吗?
目前无法通过 lambda 集成发送多个 cookie。
如果您发送多个set-cookie,那么它将采用最后一个。好吧,这样的垃圾实现对吧。
参考,如何使用代理 Lambda 从 API Gateway 发送多个 Set-Cookie 标头
让我们看看其他可用的选项,
Lambda@Edge:
这是我发现与 Lambda@Edge 合作的结果,
您可以为查看者响应创建 lambda 函数并修改标头以设置 cookie。
'use strict';
exports.handler = (event, context, callback) => {
const response = event.Records[0].cf.response;
const headers = response.headers;
// send via a single header and split it into multiple set cookie here.
headers['set-Cookie'] = 'cookie1';
headers['Set-Cookie'] = 'cookie2';
callback(null, response);
};
API网关集成请求映射:
这是我发现并处理集成请求的内容,
希望有帮助。
Lambda@Edge:
可以这样设置标题:
response.headers['set-cookie'] = [
{ key: 'Set-Cookie', value: 'cookie1=value1' },
{ key: 'Set-Cookie', value: 'cookie2=value2' },
]
API网关:
使用多值标头:
response.multiValueHeaders = {
"Set-Cookie": [
'cookie1=value1',
'cookie1=value1'
]
}
我也无法让多值示例起作用。我受到启发而写了这个:
// Lambda only allows one value per header, so to set multiple cookies
// we must set multiple case variations between "set-cookie" and "SET-COOKIE".
// There are 512 combinations, which should be enough.
function AwsSetCookie(aws, cookie, count)
{
let b = count.toString(2);
if(b.length < 9) b = "0".repeat(9-b.length)+b
const key = "set-cookie"
let bp = 0;
let kp = 0;
let keyOut = "";
while(kp < key.length)
{
let c = key.charAt(kp);
if(c !== "-") {
if(b.charAt(bp) === "1") c = c.toUpperCase();
bp++;
}
keyOut += c;
kp++;
}
aws.headers[keyOut] = cookie;
}