Memanggil fungsi melalui permintaan HTTP

Seperti pada generasi ke-1, Anda dapat memicu fungsi melalui permintaan HTTP dengan pengendali onRequest(). 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 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, sementara firebase.com dapat memiliki banyak subdomain, Anda dapat menyetel opsi cors ke [/firebase\.com$/, 'flutter.com'].

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 onRequest() dari subpaket firebase-functions/v2/https untuk membuat fungsi yang menangani peristiwa HTTP. Peristiwa onRequest() mendukung router dan aplikasi yang dikelola oleh framework web Express.

Contoh di halaman 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 request dan response Express

Objek Request yang digunakan sebagai argumen untuk onRequest() memberikan Anda akses ke properti permintaan HTTP yang dikirimkan oleh klien, dan objek Response dapat Anda gunakan untuk mengirimkan respons kembali ke klien.

exports.date = onRequest(
    {timeoutSeconds: 1200, region: ["us-west1", "us-east1"]},
    (req, res) => {
  // ...
});

Menggunakan aplikasi Express yang ada

Dengan menggunakan App sebagai argumen untuk onRequest(), Anda dapat meneruskan aplikasi Express lengkap ke fungsi HTTP:

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);

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://date-<random-hash>-<region>.a.run.app

Dengan perutean aplikasi Express, 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:

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

Menghentikan Fungsi HTTP

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.

Setelah mengambil dan memformat waktu server menggunakan modul moment Node.js, fungsi date() akan berakhir dengan mengirimkan hasilnya dalam respons HTTP:

const formattedDate = moment().format(`${format}`);
logger.log("Sending formatted date:", formattedDate);
res.status(200).send(formattedDate);

Integrasi dengan Firebase Hosting

Anda bisa 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.