我使用 lambda 作为具有 lambda 代理集成的 AWS API Gateway 的后端,并希望将 CORS 添加到响应标头中。
根据文档:
http://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-cors.html
但是,您必须依赖后端返回 Access-Control-Allow-Origin 标头,因为代理集成禁用了集成响应。
如何使用 Python 在 lambda 函数中对其进行编程。
要创建 OPTIONS 方法,您可以从网关启用它
它将在资源(端点)上创建一个方法 OPTIONS
对于 GET/POST 其他 HTTP 动词,您需要从代码中管理它(如果是 python)
return {
'statusCode': "200",
'body': json.dumps({"test" : "123"}),
'headers': {
"Content-Type" : "application/json",
"Access-Control-Allow-Origin" : "*",
"Allow" : "GET, OPTIONS, POST",
"Access-Control-Allow-Methods" : "GET, OPTIONS, POST",
"Access-Control-Allow-Headers" : "*"
}
}
对于其他未处理的情况,例如 IntegrationTimeout (504) 或代码中的错误 (502),您可以在 API 网关级别配置默认响应标头。请参阅默认响应标头:带代理集成的 AWS API 网关
您需要将方法“选项”添加到您的 api 网关并使用代理 lambda...返回
result.headers = { "Access-Control-Allow-Origin": "domain.com" }
因此,当浏览器首次向服务器调用选项时,它将返回 CORS 标头。
问题是,默认情况下,你的 lambda 方法将被“任何”方法调用,因此你需要将默认方法更改为 get、post 或任何你需要的
注意:您也可以使用相同的方法,例如any or options、get、post,如果是选项调用,则仅返回状态200和cors标头。这取决于您是否使用 get、post 等身份验证方法
如果您只是使用 lambda,没有什么奇怪的,那么 Lambda 控制台中有一个选项“启用 CORS”
如果您使用 Mangum 和 FastAPI,您可以通过定义自定义类来覆盖响应的标头:
from fastapi import FastAPI
class AWSMangum(Mangum):
"""
It overwrites the __call__ method of the Mangum class to add CORS headers to the response.
"""
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
def __call__(self, *args, **kwargs):
response = super().__call__(*args, **kwargs)
logger.info(response)
response["headers"]["Access-Control-Allow-Origin"] = "*"
return response
app = FastAPI(...)
handler = AWSMangum(app)