Вы можете вызвать функцию через 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 .