Funkcję możesz aktywować za pomocą żądania HTTP z obsługą żądań. Umożliwia to wywoływanie funkcji 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 oraz pojedynczy region. Gdy określonych jest kilka regionów, dla każdego z nich zostanie wdrożona osobna instancja funkcji. |
timeoutSeconds (timeout_sec w Pythonie) |
Funkcje HTTP mogą określać limit czasu do 1 godziny. |
cors |
Funkcje HTTP mogą określać zasady CORS. Możesz ustawić tę opcję na true, aby zezwolić na wszystkie punkty początkowe, lub na string, regex lub array, aby określić dozwolone punkty początkowe. Jeśli nie zostanie skonfigurowana, domyślnie ma wartość false/brak zasad CORS. |
Konfigurowanie CORS (współdzielenia zasobów między serwerami z różnych domen)
Użyj opcji cors, aby określić, które punkty początkowe mogą uzyskiwać dostęp do Twojej funkcji. Domyślnie funkcje HTTP nie mają skonfigurowanych zasad CORS, co oznacza, że każde żądanie z innego punktu początkowego do Twojej 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 dla funkcji opcję cors na false.
Aby zezwolić na niektóre żądania z innych punktów początkowych, ale nie na wszystkie, możesz przekazać listę konkretnych domen lub wyrażeń regularnych, które mają 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$/, 'https://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$/, "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!")
Jeśli Twoja funkcja ma być ogólnodostępna, np. jeśli obsługuje publiczny interfejs API lub witrynę, ustaw zasadę cors na true.
Aktywowanie funkcji za pomocą żądania HTTP
Aby utworzyć funkcję obsługującą zdarzenia HTTP, użyj obsługi żądań dla swojej platformy (onRequest()
lub on_request)
. Przykłady w tej sekcji są oparte na przykładzie „serwera czasu”, który jest aktywowany, gdy wysyłasz żądanie HTTP GET do punktu końcowego funkcji. Przykładowa funkcja pobiera aktualny czas serwera, formatuje go zgodnie z parametrem zapytania w adresie URL i wysyła wynik w odpowiedzi HTTP.
Używanie obiektów żądania i odpowiedzi
Obiekt żądania umożliwia dostęp do właściwości żądania HTTP wysłanego przez klienta, a obiekt odpowiedzi 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."""
Używanie istniejących aplikacji Express lub Flask
Używając aplikacji jako argumentu obsługi żądań, możesz przekazać pełną 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 unikalnego adresu URL. Użyj dokładnego adresu URL, który został wyświetlony w interfejsie CLI po wdrożeniu.
Na przykład adres URL do wywołania funkcji date() wygląda tak:
https://us-central1-<project-id>.cloudfunctions.net/date
W przypadku routingu aplikacji Express i Flask nazwa funkcji jest dodawana jako prefiks do ścieżek URL w zdefiniowanej aplikacji.
Odczytywanie wartości z żądania
W przykładzie funkcji date() funkcja sprawdza zarówno parametr adresu URL, jak i treść pod kątem wartości format, aby ustawić format daty i godziny:
Node.js
let format = req.query.format; format = req.body.format;
Python
format = req.args["format"] if "format" in req.args else None
Kończenie funkcji HTTP
Po pobraniu i sformatowaniu czasu serwera funkcja date() kończy się wysłaniem wyniku w odpowiedzi HTTP:
Node.js
Zawsze kończ funkcję HTTP za pomocą send(), redirect(),
lub end(). W przeciwnym razie funkcja może nadal działać i zostać wymuszona 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
Możesz połączyć funkcję HTTP z Firebase Hosting. Żądania w witrynie Firebase Hosting mogą być przekierowywane do określonych funkcji HTTP. Umożliwia to też używanie własnej domeny niestandardowej z funkcją HTTP. Dowiedz się więcej o łączeniu Cloud Functions z Firebase Hosting.