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


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

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

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

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

Использование объектов запроса и ответа 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 .

При маршрутизации приложения 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 .

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