Вы можете запустить функцию через HTTP-запрос с помощью обработчика запроса. Это позволяет вам вызывать функцию с помощью следующих поддерживаемых методов HTTP: GET
, POST
, PUT
, DELETE
и OPTIONS
.
Дополнительные параметры HTTP
Вариант | Описание |
---|---|
region | Функции HTTP могут указывать как массив регионов, так и один регион. Если указано несколько регионов, для каждого региона будет развернут отдельный экземпляр функции. |
timeoutSeconds ( timeout_sec для Python) | Функции HTTP могут указывать тайм-аут до одного часа. |
cors | Функции HTTP могут указывать политики CORS. Вы можете установить для этого параметра значение true , чтобы разрешить все источники или string , regex или array для указания разрешенных источников. По умолчанию используются политики false/no 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 .