我启用了Lambda代理集成,并将响应标头设置为Lambda输出和API网关的一部分,它将作为HTTP响应的一部分返回给客户端。
示例代码:
callback(null, {
"statusCode": 302,
"Location" : "https://somewebsite.com"
"headers": { "headerName": "headerValue", ... },
"body": "..."
});
我需要在标题中发送3个Cookie。我试过了。但是,失败了:
callback(null, {
"statusCode": 302,
"Location" : "https://somewebsite.com"
"headers": { "Set-Cookie": [cookie1String, cookie2String, cookie3String] },
"body": "..."
});
[编辑] 我连接了cookie并作为响应传入,客户端获取cookie。但是当客户端在“location”中调用目标时,请求在标头中没有cookie。
callback(null, {
"statusCode": 302,
"Location" : "https://somewebsite.com"
"headers": { "Set-Cookie": c1=cookie1String;c2=cookie2String; c3=cookie3String] },
"body": "..."
});
请帮助将这3个饼干发送给我的客户。
答案 0 :(得分:4)
API网关不允许您多次映射相同的标头。我使用不同的套管来设置cookie方法。
callback(null, {
"statusCode": 302,
"Location" : "https://somewebsite.com"
"headers": { "Set-Cookie": cookie1, "set-Cookie": cookie2 },
"body": "..."
});
答案 1 :(得分:1)
使用multiValueHeaders
代替headers
。
const response = {
isBase64Encoded: true,
statusCode: 200,
multiValueHeaders : {"Set-Cookie": [`language=${language}`, `theme=${theme}`]},
body: JSON.stringify('User profile set successfully')
};
callback(null, response);
如果您需要使其更智能,请考虑类似
function createHeaders(headers) {
const defaultHeaders = {
'Access-Control-Allow-Origin': '*',
};
const allHeaders = Object.assign({}, defaultHeaders, headers);
const singleValueHeaders = {};
const multiValueHeaders = {};
Object.entries(allHeaders).forEach(([key, value]) => {
const targetHeaders = Array.isArray(value) ? multiValueHeaders : singleValueHeaders;
Object.assign(targetHeaders, { [key]: value });
});
return {
headers: singleValueHeaders,
multiValueHeaders,
};
}
然后在回调函数中使用它。
callback(null, {
statusCode: status || 200,
body: JSON.stringify(body),
...createHeaders({ 'Set-Cookie': cookie }),
});
答案 2 :(得分:0)
我想说你的问题与回调中的响应对象没有像api网关所期望的那样格式化的事实有关。
这些链接专门引用了aws文档。
http://docs.aws.amazon.com/apigateway/latest/developerguide/handle-errors-in-lambda-integration.html
您的代码问题......
不要忘记为api网关和lambda启用日志,并提供完整的请求和响应。这两个日志将帮助您进行调试。