我遇到了API Gateway + Lambda的CORS集成问题。我已经为与API相关的资源启用了COR。通过Lambda测试,Postman测试等一切似乎都能正常工作,但是从网页脚本调用api会产生以下错误:“请求资源上没有'Access-Control-Allow-Origin'标头。来源'null'是因此不允许访问。响应的HTTP状态代码为415.“我需要更改Lambda功能吗?感谢
这是我简单的Lambda代码..
'use strict';
var AWS = require('aws-sdk');
var dclient = new AWS.DynamoDB.DocumentClient();
var getItems = (event, context, callback) => {
var params = {
TableName: "OMSCaseDataTest",
Key: {
"IncidentID": event.IncidentID
}
}
dclient.get(params, (error, data) => {
if (error) {
callback(null, "error occured")
} else {
callback(null, data);
}
});
};
exports.getItems = getItems;
答案 0 :(得分:1)
如果您在API Gateway中使用代理集成,则无法从API Gateway启用CORS。您必须从Lambda代码本身设置标头“ Access-Control-Allow-Origin”。
它在文档中提到。
Python代码示例:
response = {
'statusCode': 200,
'headers': {
'Access-Control-Allow-Origin': '*'
},
'body': json.dumps({'message': 'CORS enabled')
}
return response
答案 1 :(得分:1)
假设您正在使用代理集成,则需要自己处理CORS。您的lambda函数将需要以不同的方式处理HTTP方法。当不接受飞行前选项请求时,通常会发生CORS问题。这是一个可以帮助您解决问题的代码段。
function main(event, context, lambdaCallback) {
if (event.httpMethod === 'OPTIONS') {
doneOptions(200, '{"status": "OK"}', 'application/json', lambdaCallback);
} else if (event.httpMethod === 'POST') {
// do your POST here
} else {
return done(400, '{"message":"Invalid HTTP Method"}', 'application/json', lambdaCallback);
}
}
将HTTP 200返回到您的前端的功能,这些功能决定您的前端/ API可以调用什么,不能调用什么。
function doneOptions(statusCode, body, contentType, lambdaCallback, isBase64Encoded = false) {
lambdaCallback(null, {
statusCode: statusCode,
isBase64Encoded: isBase64Encoded,
body: body,
headers: {
'Content-Type': contentType,
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Headers': 'Authorization,Content-Type',
'Access-Control-Allow-Method': 'GET,POST,OPTIONS',
}
});
}
答案 2 :(得分:0)