【问题标题】:Is there any way to automatically manage preflight endpoints for each of the endpoint in serverless (AWS Lambda)有没有办法自动管理无服务器(AWS Lambda)中每个端点的预检端点
【发布时间】:2021-04-18 07:06:54
【问题描述】:

我正在使用无服务器框架开发 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 中创建的所有端点指定预检。有没有办法自动管理每个端点的这些预检端点?

【问题讨论】:

    标签: aws-lambda serverless-framework serverless preflight


    【解决方案1】:

    无需为每个预检端点创建函数。

    当浏览器收到非简单的 HTTP 请求时,CORS 协议要求浏览器向服务器发送预检请求,并等待服务器的批准(或凭据请求),然后再发送实际请求。预检请求在您的 API 中显示为 HTTP 请求:

    • 包括一个 Origin 标头。
    • 使用 OPTIONS 方法。
    • 包括以下标题:
      • 访问控制请求方法
      • 访问控制请求标头

    因此,为了支持 CORS,REST API 资源需要实现一个 OPTIONS 方法,该方法可以响应 OPTIONS 预检请求,至少具有以下 Fetch 标准规定的响应标头:

    • 访问控制允许方法
    • 访问控制允许标头
    • 访问控制允许来源

    使用无服务器框架,您可以通过两个简单的步骤完成此操作:

    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,请查看 Middy 中间件引擎以与 Lambda 一起使用。它有很多不错的中间件,其中一个是 cors middleware,它会自动将 CORS 标头添加到您的函数中。

    【讨论】:

    • 感谢水兵大喊!
    • 嗨@willFarrell,感谢您所做的出色工作;)
    猜你喜欢
    • 2014-03-14
    • 2019-06-02
    • 1970-01-01
    • 1970-01-01
    • 2018-11-19
    • 1970-01-01
    • 2022-08-20
    • 1970-01-01
    • 2017-01-15
    相关资源
    最近更新 更多