Функции вызова через HTTP-запросы

Вы можете запустить функцию через HTTP-запрос, используя functions.https . Это позволяет вам вызывать синхронную функцию с помощью следующих поддерживаемых HTTP-методов: GET , POST , PUT , DELETE и OPTIONS .

Примеры на этой странице основаны на примере функции , которая срабатывает, когда вы отправляете HTTP- GET в конечную точку функций. Пример функции извлекает текущее время сервера, форматирует время в соответствии с параметром запроса URL и отправляет результат в ответе HTTP.

Запуск функции с HTTP-запросом

Используйте functions.https для создания функции, которая обрабатывает события HTTP. Обработчик событий для функции HTTP прослушивает событие onRequest() , которое поддерживает маршрутизаторы и приложения, управляемые веб-платформой Express .

Использование объектов экспресс-запроса и ответа

Используемый в качестве аргументов для onRequest() , объект Request дает вам доступ к свойствам HTTP-запроса, отправленного клиентом, а объект Response дает вам способ отправить ответ обратно клиенту.

exports.date = functions.https.onRequest((req, res) => {
  // ...
});

Использование существующих экспресс-приложений

Используя 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 назначены пользователю, выполняющему команды развертывания.

При экспресс-маршрутизации приложений имя функции добавляется в качестве префикса к путям URL-адресов в определяемом вами приложении. Например, URL-адрес для вызова геттера в приведенном выше примере приложения Express выглядит следующим образом:

https://us-central1-<project-id>.cloudfunctions.net/widgets/<id>

Если вы вызываете функции HTTP за брандмауэром или IP-фильтром, вы можете искать IP-адреса, которые Google использует для обслуживания функций HTTP.

Используйте модули промежуточного программного обеспечения с облачными функциями

Если вам нужно внедрить зависимости промежуточного программного обеспечения для таких вещей, как поддержка файлов cookie или CORS, вызовите их внутри функции. Например, чтобы включить поддержку CORS, добавьте следующий блок:

// Enable CORS using the `cors` express middleware.
cors(req, res, () => {
  // ...
});

Чтение значений из запроса

В следующей таблице перечислены некоторые распространенные сценарии:

Тип содержимого Тело запроса Поведение
application/json '{"name":"John"}' request.body.name равно 'Джон'
application/octet-stream 'мой текст' request.body равен '6d792074657874' (необработанные байты запроса; см. документацию Node.js Buffer )
text/plain 'мой текст' request.body равно «мой текст»
application/x-www-form-urlencoded 'имя = Джон' request.body.name равно 'Джон'

Этот анализ выполняется следующими парсерами тела:

Предположим, ваша функция вызывается со следующим запросом:

curl -X POST -H "Content-Type:application/json" -H "X-MyHeader: 123" YOUR_HTTP_TRIGGER_ENDPOINT?foo=baz -d '{"text":"something"}'

тогда отправленные данные будут материализованы под:

Свойство/метод Ценность
req.method "ПОЧТА"
req.get('x-myheader') "123"
req.query.foo "баз"
req.body.text "что-то"
req.rawBody Необработанные (не проанализированные) байты запроса

В примере функции date() функция проверяет как параметр URL, так и тело на наличие значения format , чтобы установить используемый формат даты/времени:

let format = req.query.format;
format = req.body.format;

Завершить HTTP-функции

Всегда заканчивайте функцию HTTP с помощью send() , redirect() или end() . В противном случае ваша функция может продолжать работать и быть принудительно завершена системой. См. также Sync, Async и Promises .

После получения и форматирования времени сервера с помощью модуля moment Node.js функция date() завершается отправкой результата в HTTP-ответе:

const formattedDate = moment().format(`${format}`);
functions.logger.log('Sending Formatted date:', formattedDate);
res.status(200).send(formattedDate);

Подключение HTTP-функций к хостингу Firebase

Вы можете подключить функцию HTTP к хостингу Firebase. Запросы на вашем сайте Firebase Hosting могут быть проксированы для определенных функций HTTP. Это также позволяет вам использовать свой собственный домен с функцией HTTP. Узнайте больше о подключении Cloud Functions к хостингу Firebase .