Как вызывать функции с помощью HTTP-запросов (первое поколение)

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

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

Как активировать функцию с помощью HTTP-запроса

Используйте functions.https, чтобы создать функцию, обрабатывающую события HTTP. Обработчик событий для 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 "мой текст" request.body равно "6d792074657874" (необработанные байты запроса; см. документацию по буферу Node.js).
text/plain "мой текст" request.body равно "мой текст"
application/x-www-form-urlencoded 'name=John' 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 POST
req.get('x-myheader') "123"
req.query.foo "baz"
req.body.text "что-то"
req.rawBody Необработанные байты запроса

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

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

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

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

После получения и форматирования времени сервера с помощью модуля 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…