有没有任何方法可以自动管理无服务器(AWS Lambda)中每个端点的飞行前端点



我正在使用无服务器框架开发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预飞请求:

  • 访问控制允许方法
  • 访问控制允许标头
  • 访问控制允许原点

使用无服务器框架,您可以通过两个简单的步骤做到这一点:

  1. cors: true标志添加到serverless.yml中的每个HTTP端点:
getBooks:
handler: books/handler.getBooks
tags:
Name: get-books
events:
- http:
path: /api/books/all
method: GET
cors: true 
  1. 在响应中添加以下标题:
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头添加到您的函数中。

最新更新