尝试通过 JS 代码中的 API 调用(通过 API 网关设置)触发我的 Lambda 函数。
尽管启用了 CORS,并在“集成响应”部分中将标头映射设置为此,但我还是收到了“无 CORS”错误:
|| || |method.response.header.Access-Control-Allow-Credentials|'true'| |method.response.header.Access-Control-Allow-Headers|'内容类型,X-Amz-日期,授权,X-Api-Key,X-Amz-安全令牌'| |method.response.header.Access-Control-Allow-Methods|'DELETE、GET、HEAD、OPTIONS、PATCH、POST、PUT'| |method.response.header.Access-Control-Allow-Origin|'*'| |method.response.header.Access-Control-Expose-Headers|'内容类型、X-Amz-日期、授权、X-Api-Key、X-Amz-Security-Token'|
尽管在 Lambda 函数响应本身中公开返回标头:
return {
statusCode: 200,
headers: {
'Access-Control-Allow-Credentials': '*', // Allow credentials
'Access-Control-Allow-Headers': 'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token', // Headers allowed in requests
'Access-Control-Allow-Methods': 'DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT', // Allowed HTTP methods
'Access-Control-Allow-Origin': '*', // Origin allowed for CORS (use '*' to allow all origins or specify a domain)
'Access-Control-Expose-Headers': 'Content-Type, X-Amz-Date, Authorization, X-Api-Key, X-Amz-Security-Token' // Expose these headers to the client
},
body: JSON.stringify({ message: 'CORS settings applied successfully' })
};
我真的也尝试过你能想象到的所有这些事情的每一种变体:从标头响应、标头映射中包含/排除这些项目中的每一项,确保所有项目完美匹配,仅在响应等。是的,我部署 API 并部署每次更改的 Lambda 函数代码。
实际上,我在每个 StackOverflow 帖子上读到的修复程序都不起作用。我只是没有想法,完全放弃了。
有什么想法吗?谢谢。
错误会显示:
“...已被 CORS 策略阻止:请求的资源上不存在“Access-Control-Allow-Origin”标头。如果不透明响应满足您的需求,请将请求的模式设置为“no-cors”以获取禁用 CORS 的资源。”
或
“...已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:它没有 HTTP 正常状态。”
我的JS:
async function callLambda() {
const apiKey = '123123blahblah'; // omitted for StackOverflow post
const lambdaData = {
'message': 'hello'
};
const lambdaInvokeUrl = 'https://blah123.execute-api.us-east-2.amazonaws.com/blahblah1';
try {
const response = await fetch(lambdaInvokeUrl, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Api-Key': apiKey
},
body: JSON.stringify(lambdaData)
});
if (!response.ok) {
throw new Error(`HTTP error! Status: ${response.status}`);
}
const result = await response.json();
console.log("RESPONSE:", result);
} catch (error) {
console.error("Error:", error);
}
}
集成请求设置(对于任何)部分:
积分响应设置(针对选项部分):
默认网关响应 4xx 和 5xx 设置为具有相同的标头
在“API 网关资源”选项卡中,我必须单击“任何”,对于“集成响应”和“方法响应”,我必须使标头映射与选项的确切设置完全匹配。这就是让它发挥作用的原因。