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

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

Дополнительные параметры HTTP

Вариант Описание
region HTTP-функции могут указывать как массив регионов, так и один регион. При указании нескольких регионов для каждого региона будет создан отдельный экземпляр функции.
timeoutSeconds ( timeout_sec для Python) В HTTP-функциях можно указать тайм-аут до одного часа.
cors Функции HTTP могут задавать политики CORS. Вы можете установить значение true , чтобы разрешить все источники, или указать разрешенные источники с string , regex или array . По умолчанию, если политика CORS не задана явно, используется значение false/без указания источников.

Настройка CORS (совместного использования ресурсов между источниками)

Используйте параметр cors , чтобы контролировать, какие источники могут получить доступ к вашей функции. По умолчанию для HTTP-функций CORS не настроен, а это значит, что любой междоменный запрос к вашей функции приведет к следующей ошибке:

request has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

Вы также можете явно отключить CORS, установив для параметра cors значение false для вашей функции.

Чтобы разрешить некоторые междоменные запросы, но не все, вы можете передать список конкретных доменов или регулярных выражений, которые должны быть разрешены. Например, если вы являетесь владельцем доменов firebase.com и flutter.com , и firebase.com может иметь множество поддоменов, вы можете установить параметр cors в значение [/firebase\.com$/, 'https://flutter.com'] для Node.js или [r'firebase\.com$', r'https://flutter\.com'] для Python:

Node.js

const { onRequest } = require("firebase-functions/v2/https");

exports.sayHello = onRequest(
  { cors: [/firebase\.com$/, "https://flutter.com"] },
  (req, res) => {
    res.status(200).send("Hello world!");
  }
);

Python

from firebase_functions import https_fn, options

@https_fn.on_request(
    cors=options.CorsOptions(
        cors_origins=[r"firebase\.com$", r"https://flutter\.com"],
        cors_methods=["get", "post"],
    )
)
def say_hello(req: https_fn.Request) -> https_fn.Response:
    return https_fn.Response("Hello world!")

Если ваша функция должна быть общедоступной, например, если она обслуживает публичный API или веб-сайт, установите для параметра cors policy значение true .

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

Используйте обработчик запросов для вашей платформы ( onRequest() или on_request ), чтобы создать функцию, обрабатывающую HTTP-события. Примеры в этом разделе основаны на примере «сервера времени», который срабатывает при отправке HTTP GET запроса к конечной точке функций. Пример функции получает текущее время сервера, форматирует время в соответствии с параметром запроса URL и отправляет результат в HTTP-ответе.

Использование объектов запроса и ответа

Объект запроса предоставляет доступ к свойствам HTTP-запроса, отправленного клиентом, а объект ответа позволяет отправить ответ обратно клиенту.

Node.js

exports.date = onRequest(
    {timeoutSeconds: 1200, region: ["us-west1", "us-east1"]},
    (req, res) => {
// ...
});

Python

@https_fn.on_request(cors=options.CorsOptions(cors_origins="*", cors_methods=["get", "post"]))
def date(req: https_fn.Request) -> https_fn.Response:
    """Get the server's local date and time."""

Использование существующих приложений Express или Flask

Используя приложение в качестве аргумента для обработчика запроса, вы можете передать целое приложение в HTTP-функцию:

Node.js

const { onRequest } = require('firebase-functions/v2/https');

const express = require('express');
const app = express();

// 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 = onRequest(app);

Python

from firebase_admin import initialize_app, db
from firebase_functions import https_fn
import flask

initialize_app()
app = flask.Flask(__name__)

# Build multiple CRUD interfaces:


@app.get("/widgets")
@app.get("/widgets/<id>")
def get_widget(id=None):
    if id is not None:
        return db.reference(f"/widgets/{id}").get()
    else:
        return db.reference("/widgets").get()


@app.post("/widgets")
def add_widget():
    new_widget = flask.request.get_data(as_text=True)
    db.reference("/widgets").push(new_widget)
    return flask.Response(status=201, response="Added widget")


# Expose Flask app as a single Cloud Function:


@https_fn.on_request()
def httpsflaskexample(req: https_fn.Request) -> https_fn.Response:
    with app.request_context(req.environ):
        return app.full_dispatch_request()

Вызов HTTP-функции

После развертывания HTTP-функции вы можете вызвать ее, используя ее уникальный URL-адрес. Используйте точный URL-адрес, полученный из командной строки после развертывания.

Например, URL-адрес для вызова функции date() выглядит следующим образом:

https://us-central1-<project-id>.cloudfunctions.net/date

При использовании маршрутизации приложений Express и Flask имя функции добавляется в качестве префикса к URL-адресам в определяемом вами приложении.

Считывание значений из запроса

В примере с функцией date() функция проверяет как параметр URL, так и тело запроса на наличие значения format для установки используемого формата даты/времени:

Node.js

let format = req.query.format;
format = req.body.format;

Python

format = req.args["format"] if "format" in req.args else None

Завершение работы HTTP-функций

После получения и форматирования серверного времени функция date() завершает работу отправкой результата в HTTP-ответе:

Node.js

Всегда завершайте HTTP-функцию вызовами send() , redirect() или end() . В противном случае ваша функция может продолжить выполнение и быть принудительно завершена системой. См. также Sync, Async и Promises .

const formattedDate = moment().format(`${format}`);
logger.log("Sending formatted date:", formattedDate);
res.status(200).send(formattedDate);

Python

formatted_date = datetime.now().strftime(format)
print(f"Sending Formatted date: {formatted_date}")
return https_fn.Response(formatted_date)

Интеграция с Firebase Hosting

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