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

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

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

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

Настройка 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!");
  }
);

Питон

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 значение 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) => {
// ...
});

Питон

@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);

Питон

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-адрес, выведенный из CLI после развертывания.

Например, 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;

Питон

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);

Питон

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

Интеграция с хостингом Firebase

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