我正在使用无服务器框架开发AWS Lambda,我需要在functions.yml
中为每个API指定两个方法。例如,如果我必须创建一个获取书籍的端点http://basic-url.com/api/books/all
。我必须在functions.yml
中添加两种方法,如下所示。
get_books:
handler: books/handler.get_books
tags:
Name: get-books
events:
- httpApi:
method: GET
path: /api/books/all
get_books_preflight:
handler: default/handler.get_preflight
tags:
Name: get-preflight
events:
- httpApi:
method: OPTIONS
path: /api/books/all
我必须为我想在functions.yml
中创建的所有端点指定预飞行。有没有任何方法可以自动管理每个端点的这些飞行前端点?
不需要为每个飞行前端点创建一个函数。
当浏览器接收到非简单的HTTP请求时,CORS协议要求浏览器向服务器发送飞行前请求,并在发送实际请求之前等待服务器的批准(或证书请求(。飞行前请求在API中显示为HTTP请求,该请求为:
- 包括一个Origin标头
- 使用OPTIONS方法
- 包括以下标题:
- 访问控制请求方法
- 访问控制请求标头
因此,为了支持CORS,REST API资源需要实现OPTIONS方法,该方法可以通过Fetch标准规定的至少以下响应头来响应OPTIONS预飞请求:
- 访问控制允许方法
- 访问控制允许标头
- 访问控制允许原点
使用无服务器框架,您可以通过两个简单的步骤做到这一点:
- 将
cors: true
标志添加到serverless.yml
中的每个HTTP端点:
getBooks:
handler: books/handler.getBooks
tags:
Name: get-books
events:
- http:
path: /api/books/all
method: GET
cors: true
- 在响应中添加以下标题:
module.exports.getBooks = (event, context, callback) => {
// Do work to retrieve a Book
const book = retrieveBook(event);
const response = {
statusCode: 200,
headers: {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Credentials': true,
'Access-Control-Allow-Headers': 'Authorization',
},
body: JSON.stringify({
book: book
}),
};
callback(null, response);
};
最后,如果您使用Javascript,请查看用于Lambda的Middy中间件引擎。它有很多不错的中间件,其中一个是cors中间件,它会自动将cors头添加到您的函数中。