Вызов функций через 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 'имя=Джон' 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 .