Вызов функций через 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) => {
  // ...
});

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

При экспресс-маршрутизации приложений имя функции добавляется в качестве префикса к 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 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 Hosting

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