You can trigger a function through an HTTP request by using functions.https . This allows you to invoke a synchronous function through the following supported HTTP methods: GET , POST , PUT , DELETE , and OPTIONS .
Examples in this page are based on a sample function that triggers when you send an HTTP GET request to the functions endpoint. The sample function retrieves the current server time, formats the time as specified in a URL query parameter, and sends the result in the HTTP response.
Запуск функции с помощью HTTP-запроса
Use functions.https to create a function that handles HTTP events. The event handler for an HTTP function listens for the onRequest() event, which supports routers and apps managed by the Express web framework.
Использование объектов запроса и ответа Express
Used as arguments for onRequest() , the Request object gives you access to the properties of the HTTP request sent by the client, and the Response object gives you a way to send a response back to the client.
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 .
With Express app routing, the function name is added as a prefix to the URL paths in the app you define. For example, the URL to invoke the getter in the Express app example above looks like this:
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' |
Этот анализ выполняется следующими парсерами тела запроса:
- Парсер тела 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 .
После получения и форматирования серверного времени с помощью модуля 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
You can connect an HTTP function to Firebase Hosting . Requests on your Firebase Hosting site can be proxied to specific HTTP functions. This also allows you to use your own custom domain with an HTTP function. Learn more about connecting Cloud Functions to Firebase Hosting .