Memanggil fungsi melalui permintaan HTTP


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

Contoh di halaman ini didasarkan pada fungsi contoh yang terpicu saat Anda mengirimkan 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.

Memicu fungsi dengan permintaan HTTP

Gunakan functions.https untuk membuat fungsi yang menangani peristiwa HTTP. Pengendali peristiwa untuk fungsi HTTP akan memproses peristiwa onRequest(), yang mendukung router dan aplikasi yang dikelola oleh framework web Express.

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 = functions.https.onRequest((req, res) => {
  // ...
});

Menggunakan aplikasi Express yang ada

Dengan menggunakan App sebagai argumen untuk onRequest(), Anda dapat meneruskan aplikasi Express lengkap ke fungsi HTTP. Kode boilerplate dapat dipindahkan ke middleware seperti ditunjukkan di bawah ini:

const express = require('express');
const cors = require('cors');

const app = express();

// Automatically allow cross-origin requests
app.use(cors({ origin: true }));

// 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 = functions.https.onRequest(app);

Memanggil fungsi HTTP

Setelah fungsi HTTP di-deploy, Anda dapat memanggilnya melalui URL uniknya sendiri. Secara berurutan, URL tersebut mencakup hal-hal berikut:

  • Region tempat Anda men-deploy fungsi. Beberapa fungsi produksi mungkin perlu menetapkan lokasi secara eksplisit untuk meminimalkan latensi jaringan.
  • Project ID Firebase Anda
  • cloudfunctions.net
  • Nama fungsi Anda

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

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

Jika Anda mengalami error izin saat men-deploy fungsi, pastikan peran IAM yang sesuai ditetapkan kepada pengguna yang menjalankan perintah deployment.

Dengan perutean aplikasi Express, nama fungsi ditambahkan sebagai awalan ke jalur URL pada aplikasi yang Anda tentukan. Misalnya, URL untuk memanggil pengambil dalam contoh aplikasi Express di atas akan terlihat seperti ini:

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

Jika memanggil fungsi HTTP di balik firewall atau filter IP, Anda dapat mencari alamat IP yang digunakan Google untuk menyalurkan fungsi HTTP.

Menggunakan modul middleware dengan Cloud Functions

Jika perlu memasukkan dependensi middleware untuk hal-hal seperti dukungan cookie atau CORS, panggil dependensi tersebut di dalam fungsi. Misalnya, untuk mengaktifkan dukungan CORS, tambahkan blok berikut:

// Enable CORS using the `cors` express middleware.
cors(req, res, () => {
  // ...
});

Membaca nilai dari permintaan

Tabel berikut mencantumkan beberapa skenario umum:

Jenis Konten Isi Permintaan Perilaku
application/json '{"name":"John"}' request.body.name sama dengan 'John'
application/octet-stream 'my text' request.body sama dengan '6d792074657874' (byte mentah permintaan; baca dokumentasi Buffer Node.js)
text/plain 'my text' request.body sama dengan 'my text'
application/x-www-form-urlencoded 'name=John' request.body.name sama dengan 'John'

Penguraian ini dilakukan oleh parser isi berikut:

Misalnya fungsi Anda dipanggil dengan permintaan berikut:

curl -X POST -H "Content-Type:application/json" -H "X-MyHeader: 123" YOUR_HTTP_TRIGGER_ENDPOINT?foo=baz -d '{"text":"something"}'

maka data yang dikirim akan terwujud dalam:

Properti/Metode Nilai
req.method "POST"
req.get('x-myheader') "123"
req.query.foo "baz"
req.body.text "something"
req.rawBody Byte mentah (tidak terurai) 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}`);
functions.logger.log('Sending Formatted date:', formattedDate);
res.status(200).send(formattedDate);

Menghubungkan Fungsi HTTP ke 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.