Funkcję możesz aktywować za pomocą żądania HTTP z obsługą żądania. Dzięki temu możesz wywołać funkcję za pomocą tych obsługiwanych metod HTTP: GET
, POST
, PUT
, DELETE
i OPTIONS
.
Dodatkowe opcje HTTP
Opcja | Opis |
---|---|
region |
Funkcje HTTP mogą określać tablicę regionów lub pojedynczy region. Jeśli określisz wiele regionów, w każdym z nich zostanie wdrożona osobna instancja funkcji. |
timeoutSeconds (timeout_sec w przypadku Pythona) |
Funkcje HTTP mogą określać limit czasu do 1 godziny. |
cors |
Funkcje HTTP mogą określać zasady CORS. Możesz ustawić wartość true , aby zezwolić na wszystkie punkty początkowe, lub wartość string , regex lub array , aby określić dozwolone punkty początkowe. Jeśli nie zostanie skonfigurowany, domyślnie ma wartość false (fałsz) lub brak zasad CORS. |
Konfigurowanie CORS (współdzielenie zasobów pomiędzy serwerami z różnych domen)
Użyj opcji cors
, aby określić, które źródła mogą uzyskiwać dostęp do funkcji. Domyślnie funkcje HTTP nie mają skonfigurowanej zasady CORS, co oznacza, że każde żądanie między domenami wysłane do funkcji powoduje ten błąd:
request has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
Możesz też wyraźnie wyłączyć CORS, ustawiając opcję cors
na false
w przypadku swojej funkcji.
Aby zezwolić na niektóre żądania między domenami, ale nie na wszystkie, możesz podać listę konkretnych domen lub wyrażeń regularnych, które powinny być dozwolone. Jeśli na przykład jesteś właścicielem domen firebase.com
i flutter.com
, a domena firebase.com
może mieć wiele subdomen, możesz ustawić opcję cors
na [/firebase\.com$/, 'flutter.com']
w przypadku Node.js lub [r'firebase\.com$', r'https://flutter\.com']
w przypadku Pythona:
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!");
}
);
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!")
Jeśli funkcja ma być ogólnie dostępna, np. jeśli jest to interfejs API lub witryna publiczna, ustaw zasadę cors
na true
.
Aktywowanie funkcji za pomocą żądania HTTP
Użyj modułu obsługującego żądania na swojej platformie (onRequest()
lub on_request
), aby utworzyć funkcję, która obsługuje zdarzenia HTTP. Przykłady w tej sekcji są oparte na przykładowej funkcji „serwer czasu”, która jest wywoływana, gdy wysyłasz żądanie HTTP GET
do punktu końcowego funkcji. Przykładowa funkcja pobiera bieżący czas serwera, formatuje go zgodnie z parametrem zapytania w adresie URL i wysyła wynik w odpowiedzi HTTP.
Korzystanie z obiektów żądań i odpowiedzi
Obiekt request zapewnia dostęp do właściwości żądania HTTP wysłanego przez klienta, a obiekt response umożliwia wysłanie odpowiedzi do klienta.
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."""
Korzystanie z istniejących aplikacji Express lub Flask
Korzystając z aplikacji jako argumentu dla funkcji obsługi żądania, możesz przekazać całą aplikację do funkcji 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()
Wywoływanie funkcji HTTP
Po wdrożeniu funkcji HTTP możesz ją wywołać za pomocą jej własnego adresu URL. Użyj dokładnego adresu URL z wyjścia interfejsu wiersza poleceń po wdrożeniu.
Adres URL wywołania date()
może wyglądać na przykład tak:
https://us-central1-<project-id>.cloudfunctions.net/date
W przypadku Express i Flask nazwa funkcji jest dodawana jako prefiks do ścieżek URL w określonej przez Ciebie aplikacji.
Odczytywanie wartości z żądania
W przykładzie funkcji date()
funkcja sprawdza zarówno parametr adresu URL, jak i tekst w polu „body” pod kątem wartości format
, aby ustawić format daty/godziny:
Node.js
let format = req.query.format; format = req.body.format;
Python
format = req.args["format"] if "format" in req.args else None
Zamykanie funkcji HTTP
Po pobraniu i sformatowaniu czasu serwera funkcja date()
wysyła wynik w odpowiedzi HTTP:
Node.js
Funkcje HTTP zawsze kończ się za pomocą send()
, redirect()
lub end()
. W przeciwnym razie funkcja może nadal działać i zostać przymusowo zakończona przez system. Zobacz też Synchronizacja, asynchroniczność i obietnice.
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)
Integracja z Hostingiem Firebase
Funkcję HTTP możesz połączyć z Firebase Hosting. Żądania w witrynie Firebase Hosting mogą być przekierowywane do określonych funkcji HTTP. Pozwala też używać własnej domeny niestandardowej z funkcją HTTP. Dowiedz się więcej o łączeniu Cloud Functions z Firebase Hosting.