Вы можете запустить функцию через HTTP-запрос с помощью functions.https. Это позволяет вызывать синхронную функцию с помощью следующих поддерживаемых методов HTTP: GET, POST, PUT, DELETE и OPTIONS.
Примеры на этой странице основаны на примере функции, которая активируется, когда вы отправляете HTTP-запрос GET конечной точке функции. Пример функции получает текущее время сервера, форматирует его в соответствии с параметром запроса URL и отправляет результат в HTTP-ответе.
Как запустить функцию с помощью HTTP-запроса
Чтобы создать функцию, которая обрабатывает HTTP-события, используйте functions.https. Обработчик событий для HTTP-функции прослушивает событие onRequest(), которое поддерживает маршрутизаторы и приложения, управляемые веб-фреймворком Express.
Использование объектов запросов и ответов Express
Объект Request, используемый в качестве аргумента для onRequest(), предоставляет доступ к свойствам HTTP-запроса, отправленного клиентом, а объект Response позволяет отправить ответ клиенту.
exports.date = functions.https.onRequest((req, res) => { // ... });
Как использовать существующие приложения Express
Используя App в качестве аргумента для onRequest(), вы можете передать полное приложение Express в функцию HTTP. Шаблонный код можно переместить в промежуточное ПО, как показано ниже:
const express = require('express');
const cors = require('cors');
const app = express();
// Automatically allow cross-origin requests
app.use(cors({ origin: true }));
// Add middleware to authenticate requests
app.use(myMiddleware);
// build multiple CRUD interfaces:
app.get('/:id', (req, res) => res.send(Widgets.getById(req.params.id)));
app.post('/', (req, res) => res.send(Widgets.create()));
app.put('/:id', (req, res) => res.send(Widgets.update(req.params.id, req.body)));
app.delete('/:id', (req, res) => res.send(Widgets.delete(req.params.id)));
app.get('/', (req, res) => res.send(Widgets.list()));
// Expose Express API as a single Cloud Function:
exports.widgets = functions.https.onRequest(app);
Как вызвать HTTP-функцию
После развертывания HTTP-функции ее можно вызвать по уникальному URL. URL содержит следующие элементы в указанном порядке:
- Регион (или регионы), в котором вы развернули свою функцию. Для некоторых рабочих функций может потребоваться явно задать местоположение, чтобы минимизировать задержку в сети.
- Идентификатор проекта Firebase
cloudfunctions.net- Название функции.
Например, URL для вызова date() выглядит так:
https://us-central1-<project-id>.cloudfunctions.net/date
Если при развертывании функций возникают ошибки, связанные с разрешениями, убедитесь, что пользователю, выполняющему команды развертывания, назначены соответствующие роли IAM.
При использовании маршрутизации приложений Express название функции добавляется в качестве префикса к путям URL в определяемом вами приложении. Например, URL для вызова метода получения в примере приложения Express, приведенном выше, выглядит следующим образом:
https://us-central1-<project-id>.cloudfunctions.net/widgets/<id>
Если вы вызываете HTTP-функции за брандмауэром или IP-фильтром, вы можете найти IP-адреса, которые Google использует для обслуживания HTTP-функций.
Как использовать модули промежуточного ПО с Cloud Functions
Если вам нужно внедрить зависимости промежуточного ПО, например для поддержки файлов cookie или CORS, вызовите их в функции. Например, чтобы включить поддержку CORS, добавьте следующий блок:
// Enable CORS using the `cors` express middleware. cors(req, res, () => { // ... });
Считывание значений из запроса
В таблице ниже приведены некоторые распространенные сценарии.| Тип контента | Тело запроса | Поведение |
|---|---|---|
application/json |
'{"name":"John"}' |
request.body.name равно "Иван" |
application/octet-stream |
'my text' | request.body равно '6d792074657874' (необработанные байты запроса; см. документацию по буферу Node.js) |
text/plain |
'my text' | request.body равно "мой текст" |
application/x-www-form-urlencoded |
'name=John' | request.body.name равно "Иван" |
Для этого используются следующие синтаксические анализаторы:
- Синтаксический анализатор тела JSON
- Синтаксический анализатор необработанного тела
- Синтаксический анализатор текста
- Синтаксический анализатор тела формы с кодировкой URL
Предположим, что ваша функция вызывается со следующим запросом:
curl -X POST -H "Content-Type:application/json" -H "X-MyHeader: 123" YOUR_HTTP_TRIGGER_ENDPOINT?foo=baz -d '{"text":"something"}'
то отправленные данные будут материализованы в следующем виде:
| Свойство/метод | Значение |
|---|---|
req.method |
"POST" |
req.get('x-myheader') |
"123" |
req.query.foo |
"baz" |
req.body.text |
"что-то" |
req.rawBody |
Необработанные (непроанализированные) байты запроса. |
В примере функции date() проверяется, есть ли значение format в параметре URL и теле запроса, чтобы задать формат даты и времени:
let format = req.query.format; format = req.body.format;
Завершение HTTP-функций
Всегда завершайте HTTP-функцию с помощью send(), redirect() или end(). В противном случае функция может продолжить работу и будет принудительно завершена системой. Также ознакомьтесь со статьей Синхронность, асинхронность и промисы.
После получения и форматирования времени сервера с помощью модуля Node.js moment функция date() отправляет результат в HTTP-ответе:
const formattedDate = moment().format(`${format}`); functions.logger.log('Sending Formatted date:', formattedDate); res.status(200).send(formattedDate);
Подключение функций HTTP к Firebase Hosting
Вы можете подключить функцию HTTP к Firebase Hosting. Запросы на сайте Firebase Hosting можно перенаправлять на определенные функции HTTP. Это также позволяет использовать собственный домен с функцией HTTP. Подробнее о том, как подключить Cloud Functions к Firebase Hosting…