Вызов функций через 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$/, '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$/, "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 .