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