#aws-lambda #serverless-framework #serverless #preflight
#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
. Есть ли какой-либо способ автоматического управления этими предполетными конечными точками для каждой конечной точки?
Ответ №1:
Нет необходимости создавать функцию для каждой предполетной конечной точки.
Когда браузер получает непростой HTTP-запрос, протокол CORS требует, чтобы браузер отправил предполетный запрос на сервер и дождался утверждения (или запроса учетных данных) с сервера перед отправкой фактического запроса. Предполетный запрос отображается в вашем API как HTTP-запрос, который:
- Включает заголовок источника.
- Использует метод OPTIONS.
- Включает следующие заголовки:
- Метод запроса управления доступом
- Заголовки запросов управления доступом
Поэтому для поддержки CORS ресурсу REST API необходимо реализовать метод OPTIONS, который может отвечать на предполетный запрос OPTIONS по крайней мере следующими заголовками ответа, требуемыми стандартом выборки:
- Управление доступом-Разрешить-Методы
- Access-Control-Allow-Headers
- Access-Control-Allow-Origin
С помощью Serverless Framework вы можете сделать это в два простых шага:
- Добавьте
cors: true
флаг к каждой конечной точке HTTP в вашемserverless.yml
:
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, посмотрите на механизм промежуточного программного обеспечения Middy для использования с Lambda. В нем много хороших промежуточных программ, и одним из них является промежуточное программное обеспечение cors, которое автоматически добавляет заголовки CORS к вашим функциям.
Комментарии:
1. Спасибо за приветствие гардемарина!
2. Привет @willFarrell, спасибо за потрясающую работу, которую вы делаете 😉