Wywoływanie funkcji za pomocą żądań HTTP


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, DELETEOPTIONS.

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.