Memanggil fungsi melalui permintaan HTTP


Anda dapat memicu fungsi melalui permintaan HTTP dengan pengendali permintaan. Dengan cara ini, Anda dapat memanggil fungsi melalui metode HTTP yang didukung berikut: GET, POST, PUT, DELETE, dan OPTIONS.

Opsi HTTP tambahan

Opsi Deskripsi
region Fungsi HTTP dapat menentukan array beberapa region serta satu region. Jika beberapa region ditentukan, instance fungsi terpisah akan di-deploy untuk setiap region.
timeoutSeconds (timeout_sec untuk Python) Fungsi HTTP dapat menentukan waktu tunggu hingga satu jam.
cors Fungsi HTTP dapat menentukan kebijakan CORS. Anda dapat menyetelnya ke true untuk mengizinkan semua asal atau string, regex, atau array untuk menentukan asal yang diizinkan. Kebijakan defaultnya adalah salah/tidak ada CORS jika tidak ditetapkan secara eksplisit.

Mengonfigurasi CORS (Cross-Origin Resource Sharing)

Gunakan opsi cors untuk mengontrol sumber mana yang dapat mengakses fungsi Anda. Secara default, fungsi HTTP tidak dikonfigurasi dengan CORS, yang berarti bahwa permintaan lintas asal apa pun ke fungsi Anda akan menyebabkan error ini:

request has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

Anda juga dapat menonaktifkan CORS secara eksplisit dengan menetapkan opsi cors ke false untuk fungsi Anda.

Untuk mengizinkan beberapa permintaan lintas asal, tetapi tidak semua, Anda dapat meneruskan daftar domain atau ekspresi reguler tertentu yang akan diizinkan. Misalnya, jika Anda memiliki domain firebase.com dan flutter.com, dan firebase.com dapat memiliki banyak subdomain, Anda dapat menyetel opsi cors ke [/firebase\.com$/, 'flutter.com'] untuk Node.js atau [r'firebase\.com$', r'https://flutter\.com'] untuk 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!");
  }
);

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!")

Jika fungsi Anda harus tersedia secara terbuka, misalnya jika menayangkan API atau situs publik, setel kebijakan cors ke true.

Memicu fungsi dengan permintaan HTTP

Gunakan pengendali permintaan untuk platform Anda (onRequest() atau on_request) untuk membuat fungsi yang menangani peristiwa HTTP. Contoh di bagian ini didasarkan pada contoh "server waktu" yang terpicu saat Anda mengirim permintaan GET HTTP ke endpoint fungsi. Fungsi contoh tersebut mengambil waktu server saat ini, memformat waktu seperti yang ditentukan dalam parameter kueri URL, lalu mengirimkan hasilnya dalam respons HTTP.

Menggunakan objek permintaan dan respons

Objek permintaan memberikan Anda akses ke properti permintaan HTTP yang dikirim oleh klien, sementara objek respons dapat Anda gunakan untuk mengirimkan respons kembali ke klien.

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."""

Menggunakan aplikasi Express atau Flask yang sudah ada

Dengan menggunakan aplikasi sebagai argumen untuk pengendali permintaan, Anda dapat meneruskan aplikasi lengkap ke fungsi 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()

Memanggil fungsi HTTP

Setelah fungsi HTTP di-deploy, Anda dapat memanggilnya melalui URL uniknya sendiri. Gunakan output URL yang tepat dari CLI setelah deployment.

Misalnya, URL untuk memanggil date() akan terlihat seperti ini:

https://us-central1-<project-id>.cloudfunctions.net/date

Dengan perutean aplikasi Express dan Flask, nama fungsi ditambahkan sebagai awalan ke jalur URL pada aplikasi yang Anda tentukan.

Membaca nilai dari permintaan

Pada contoh fungsi date(), fungsi tersebut menguji parameter URL dan isi untuk menemukan nilai format agar dapat menetapkan format tanggal/waktu yang akan digunakan:

Node.js

let format = req.query.format;
format = req.body.format;

Python

format = req.args["format"] if "format" in req.args else None

Menghentikan Fungsi HTTP

Setelah mengambil dan memformat waktu server, fungsi date() akan berakhir dengan mengirimkan hasilnya dalam respons HTTP:

Node.js

Selalu akhiri fungsi HTTP dengan send(), redirect(), atau end(). Jika tidak, fungsi Anda mungkin akan terus berjalan dan dihentikan secara paksa oleh sistem. Baca juga artikel Sinkronisasi, Asinkronisasi, dan Promise.

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)

Melakukan integrasi dengan Firebase Hosting

Anda dapat menghubungkan fungsi HTTP ke Firebase Hosting. Permintaan di situs Firebase Hosting Anda dapat di-proxy-kan ke fungsi HTTP tertentu. Anda juga dapat menggunakan domain kustom Anda sendiri dengan fungsi HTTP. Pelajari lebih lanjut cara menghubungkan Cloud Functions ke Firebase Hosting.