Вы можете вызвать функцию через 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 равно 'Джон' |
Этот анализ выполняется следующими анализаторами тела:
- Анализатор тела JSON
- Анализатор необработанного тела
- Анализатор текста
- Анализатор тела формы, закодированной в URL
Предположим, ваша функция вызывается следующим запросом:
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 .