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.