Вызов функций через HTTP-запросы (1-го поколения)

Вы можете вызвать функцию через 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 равно 'John'
application/octet-stream 'мой текст' request.body равен '6d792074657874' (необработанные байты запроса; см. документацию Node.js Buffer ).
text/plain 'мой текст' request.body equals 'my text'
application/x-www-form-urlencoded 'имя=Джон' request.body.name равно 'John'

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

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

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 Hosting

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