Edu*_*nis 8 amazon-web-services aws-lambda aws-api-gateway aws-sam-cli serverless
每当我尝试通过浏览器通过 POST 访问无服务器 lambda 函数时,我都会收到错误消息
对预检请求的响应未通过访问控制检查:请求的资源上不存在 >'Access-Control-Allow-Origin' 标头。
当它是一个/GET它工作正常我读过它是因为它没有发送飞行前请求。当我把它改成POST这个的时候就是失败了。
我正在运行的命令:
sam local start-api
我的 template.yaml 是:
...
Resources:
PropertiesFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: target/service-0.0.1-SNAPSHOT.jar
Handler: com.aws.PropertiesHandler::handleRequest
Runtime: java8
Events:
PropertiesApi:
Type: Api
Properties:
Path: /properties
Method: post
...
Run Code Online (Sandbox Code Playgroud)
如何在这些端点上启用 CORS?
ngo*_*bui 10
我有同样的错误,我已经通过 3 个步骤修复了它。(Java8 中的 AWS Lambda,SAM CLI v0.37.0)
Map<String, String> headers = new HashMap<>();
headers.put("Content-Type", "application/json");
headers.put("X-Custom-Header", "application/json");
headers.put("Access-Control-Allow-Origin", "*");
headers.put("Access-Control-Allow-Methods", "GET, POST, OPTIONS, PUT, PATCH, DELETE");
headers.put("Access-Control-Allow-Headers", "X-Requested-With,content-type");
Run Code Online (Sandbox Code Playgroud)
Globals:
Function:
Timeout: 20
Api:
Cors:
AllowMethods: "'GET,POST,OPTIONS'"
AllowHeaders: "'content-type'"
AllowOrigin: "'*'"
AllowCredentials: "'*'"
Run Code Online (Sandbox Code Playgroud)
Events:
HelloWorld:
Type: Api
Properties:
# Path: /hello
# Method: get
Path: "/{proxy+}"
Method: ANY
Run Code Online (Sandbox Code Playgroud)
首先,您需要在 template.yml 中添加以下部分以在 API 网关中启用 cors:
Globals:
Api:
Cors:
AllowMethods: "'GET,POST,OPTIONS'"
AllowHeaders: "'content-type'"
AllowOrigin: "'*'"
AllowCredentials: "'*'"
Run Code Online (Sandbox Code Playgroud)
然后在你的 lambda 函数响应中
MultivaluedMap<String, Object> headers = responseContext.getHeaders();
headers.add("Access-Control-Allow-Origin", "*");
headers.add("Access-Control-Allow-Headers", requestContext.getHeaderString("Access-Control-Request-Headers"));
headers.add("Access-Control-Allow-Methods", "GET,PUT,POST,DELETE,HEAD,OPTIONS");
Run Code Online (Sandbox Code Playgroud)
您应该能够通过在处理程序函数中将以下标头显式添加到响应中来解决本地测试的问题:
"Access-Control-Allow-Origin": "*"
Run Code Online (Sandbox Code Playgroud)
如果您在本地运行,则可以使用仅添加标头的环境变量。
下面是我拥有的处理函数中的一个简单 Python 示例:
if not all(field in values for field in required_fields):
response = {
'statusCode': 400,
'body': json.dumps(
{
'message': 'Required data missing from request body'
}
)
}
# explicitly add CORs headers for local testing
response['headers'] = {"Access-Control-Allow-Origin": "*"}
return response
Run Code Online (Sandbox Code Playgroud)
这仅适用于本地测试,当您部署到 API 网关时,COR 由 API 网关上的配置处理。
这个解决方案对我有用,直到我还使用 Cognito 用户池向 API 添加了授权,我目前正在尝试解决该问题。
这是关于该问题的类似帖子: How to Enable CORS for an AWS API Gateway Resource
| 归档时间: |
|
| 查看次数: |
4893 次 |
| 最近记录: |