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

You can trigger a function through an HTTP request with a request handler. This allows you to invoke a function through the following supported HTTP methods: GET , POST , PUT , DELETE , and OPTIONS .

В этом руководстве предполагается, что вы выполнили задачи по настройке, описанные в нашем руководстве по началу работы с Node.js и Python , или задачи по настройке экспериментального SDK Dart .

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

Вариант Описание
region HTTP-функции могут указывать как массив регионов, так и один регион. При указании нескольких регионов для каждого региона будет создан отдельный экземпляр функции.
timeoutSeconds ( timeout_sec для Python) В HTTP-функциях можно указать тайм-аут до одного часа.
cors HTTP functions may specify CORS policies. You can set this to true to allow all origins or a string , regex , or array to specify allowed origins. Defaults to false/no CORS policies if not explicitly set.

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

Use the cors option to control which origins can access your function. By default, HTTP functions don't have CORS configured, meaning that any cross-origin request to your function results in this error:

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

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

To allow some cross-origin requests, but not all, you can pass a list of specific domains or regular expressions that should be allowed. For example, if you own the domains firebase.com and flutter.com , and firebase.com can have many subdomains, you might want to set the cors option as shown:

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!")

Dart (экспериментальный)

import 'package:firebase_functions/firebase_functions.dart';

void main() {
  runFunctions((firebase) {
    firebase.https.onRequest(
      name: 'sayHello',
      options: const HttpsOptions(
        cors: Cors([RegExp(r'^https:\/\/firebase\.com$'), 'https://flutter.com']),
      ),
      (request) async => Response(200, body: 'Hello world!'),
    );
  });
}

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

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

Use the request handler for your platform to create a function that handles HTTP events. Examples in this section are based on a "time server" sample 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-запроса, отправленного клиентом, а объект ответа позволяет отправить ответ обратно клиенту.

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."""

Dart (экспериментальный)

void main() {
  runFunctions((firebase) {
    firebase.https.onRequest(name: 'date', (request) async {

Использование существующих приложений 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

Dart (экспериментальный)

var format = request.url.queryParameters['format'];
final bodyString = await request.readAsString();
try {
  if (bodyString.isNotEmpty) {
    final body = jsonDecode(bodyString) as Map<String, dynamic>;
    format = body['format'] as String?;
  }
} catch (e) {
  return Response.badRequest(body: 'invalid JSON');
}

Завершение работы 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)

Dart (экспериментальный)

final formattedDate = DateFormat(format).format(DateTime.now());
print('Sending formatted date: $formattedDate');
return Response.ok(formattedDate);

Интеграция с 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 .