Membaca Data dengan GET
Kita bisa membaca data dari database Firebase dengan mengeluarkan permintaan GET
ke endpoint URL-nya. Mari kita lanjutkan dengan contoh blog dari bagian sebelumnya dan membaca semua data postingan blog kita:
curl 'https://docs-examples.firebaseio.com/fireblog/posts.json?print=pretty'
Permintaan yang berhasil akan ditunjukkan oleh kode status HTTP 200 OK
, dan responsnya akan berisi data yang diambil.
Menambahkan Parameter URI
REST API menerima beberapa parameter kueri ketika membaca data dari database Firebase. Di bawah ini adalah parameter yang paling sering digunakan. Untuk daftar lengkapnya, lihat Referensi REST API.
auth
Parameter permintaan auth
mengizinkan akses ke data yang dilindungi oleh Aturan Keamanan Firebase Realtime Database, dan didukung oleh semua jenis permintaan. Argumennya bisa berupa rahasia aplikasi Firebase Anda atau token autentikasi, seperti yang dijelaskan dalam artikel Pengguna dalam Project Firebase. Dalam contoh berikut, kita akan mengirimkan permintaan GET
dengan parameter auth
, dengan CREDENTIAL
sebagai rahasia aplikasi Firebase kita atau token autentikasi:
curl 'https://docs-examples.firebaseio.com/auth-example.json?auth=CREDENTIAL'
Jika print=pretty
ditentukan, data akan ditampilkan dalam format yang dapat dibaca manusia.
curl 'https://docs-examples.firebaseio.com/fireblog/posts.json?print=pretty'
Jika print=silent
ditentukan, 204 No Content
akan ditampilkan saat berhasil.
curl 'https://docs-examples.firebaseio.com/fireblog/posts.json?print=silent'
callback
Untuk membuat panggilan REST dari browser web di seluruh domain, Anda dapat menggunakan JSONP untuk mengemas respons dalam fungsi callback JavaScript. Tambahkan callback=
agar REST API mengemas data yang ditampilkan dalam fungsi callback yang Anda tentukan. Contoh:
<script> function gotData(data) { console.log(data); } </script> <script src="https://docs-examples.firebaseio.com/fireblog/posts.json?callback=gotData">
shallow
Ini adalah fitur canggih yang dirancang untuk membantu Anda bekerja dengan set data besar tanpa perlu mendownload semuanya. Untuk menggunakannya, tambahkan shallow=true
sebagai parameter. Ini akan membatasi kedalaman data yang ditampilkan. Jika data pada lokasi tersebut adalah JSON sederhana (string, angka, atau boolean), nilainya akan ditampilkan. Jika snapshot data di lokasi adalah objek JSON, nilai untuk setiap kunci akan terpotong menjadi true. Misalnya, dengan menggunakan data berikut:
{ "message": { "user": { "name": "Chris" }, "body": "Hello!" } } // A request to /message.json?shallow=true // would return the following: { "user": true, "body": true } // A request to /message/body.json?shallow=true // would simply return: "Hello!"
Cobalah dengan permintaan curl
ini:
curl 'https://docs-examples.firebaseio.com/rest/retrieving-data.json?shallow=true&print=pretty'
timeout
Gunakan ini untuk membatasi waktu baca yang dibutuhkan di sisi server. Permintaan baca yang tidak selesai dalam waktu yang ditentukan akan berakhir dengan error HTTP 400. Ini sangat berguna ketika Anda mengharapkan transfer data kecil dan tidak ingin menunggu terlalu lama untuk mengambil sub-hierarki yang mungkin berukuran besar. Waktu baca yang sebenarnya dapat bervariasi berdasarkan ukuran data dan cache.
Tentukan timeouts
menggunakan format berikut: 3ms
,
3s
, atau 3min
, dengan angka dan satuan. Jika tidak ditentukan, batas timeout
maksimum sebesar 15min
akan diterapkan. Jika timeout
tidak positif, atau melebihi batas maksimum, permintaan akan ditolak dengan error HTTP 400.
Dalam contoh berikut, permintaan GET
menyertakan timeout
sebesar 10 detik.
curl 'https://docs-examples.firebaseio.com/rest/retrieving-data.json?timeout=10s'
Memfilter Data
Kita dapat membuat kueri untuk memfilter data berdasarkan berbagai faktor. Untuk memulai, tetapkan cara Anda memfilter data menggunakan parameter orderBy
. Kemudian, gabungkan orderBy
dengan lima parameter lain mana pun: limitToFirst
, limitToLast
, startAt
, endAt
, dan equalTo
.
Karena kami semua di Firebase suka dinosaurus, kami akan menggunakan cuplikan dari contoh database fakta dinosaurus untuk menunjukkan bagaimana Anda bisa memfilter data:
{ "lambeosaurus": { "height": 2.1, "length": 12.5, "weight": 5000 }, "stegosaurus": { "height": 4, "length": 9, "weight": 2500 } }
Kita dapat memfilter data menggunakan salah satu dari tiga cara berikut: berdasarkan kunci turunan, kunci, atau nilai. Kueri dimulai dengan salah satu parameter ini, lalu harus dikombinasikan dengan satu atau beberapa parameter berikut: startAt
, endAt
, limitToFirst
, limitToLast
, atau equalTo
.
Memfilter berdasarkan kunci turunan yang ditentukan
Kita dapat memfilter node berdasarkan kunci turunan yang sama dengan meneruskan kunci tersebut ke parameter orderBy
. Misalnya, untuk mengambil semua dinosaurus dengan tinggi lebih dari 3, kita bisa melakukan hal berikut:
curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="height"&startAt=3&print=pretty'
Setiap node yang tidak memiliki kunci turunan yang sesuai dengan filter akan diurutkan dengan nilai null
. Untuk mempelajari detail mengenai cara data diurutkan, baca artikel Metode Pengurutan Data.
Firebase juga mendukung pengurutan kueri berdasarkan turunan bertingkat yang dalam, bukan hanya turunan satu tingkat di bawah. Hal ini berguna jika Anda memiliki data bertingkat yang dalam seperti ini:
{ "lambeosaurus": { "dimensions": { "height" : 2.1, "length" : 12.5, "weight": 5000 } }, "stegosaurus": { "dimensions": { "height" : 4, "length" : 9, "weight" : 2500 } } }
Untuk kueri tentang tinggi, sekarang kita menggunakan jalur lengkap ke objek alih-alih kunci tunggal:
curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="dimensions/height"&startAt=3&print=pretty'
Kueri hanya bisa memfilter berdasarkan satu kunci pada satu waktu. Penggunaan parameter orderBy
beberapa kali pada permintaan yang sama akan memunculkan error.
Memfilter berdasarkan kunci
Kita juga dapat memfilter node berdasarkan kuncinya menggunakan parameter orderBy="$key"
. Contoh berikut mengambil semua dinosaurus yang namanya diawali huruf a
sampai m
:
curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="$key"&startAt="a"&endAt="m"&print=pretty'
Memfilter berdasarkan nilai
Kita bisa memfilter node berdasarkan nilai kunci turunannya menggunakan parameter orderBy="$value"
. Anggap saja para dinosaurus sedang mengadakan kompetisi olahraga dino, dan kita mengikuti perkembangan skor mereka dalam format berikut:
{ "scores": { "bruhathkayosaurus": 55, "lambeosaurus": 21, "linhenykus": 80, "pterodactyl": 93, "stegosaurus": 5, "triceratops": 22 } }
Untuk mengambil semua dinosaurus dengan skor di atas 50, kita bisa membuat permintaan berikut:
curl 'https://dinosaur-facts.firebaseio.com/scores.json?orderBy="$value"&startAt=50&print=pretty'
Baca bagian Metode Pengurutan Data untuk mendapatkan penjelasan tentang pengurutan nilai null
, boolean, string, dan objek jika orderBy="$value"
digunakan.
Pemfilteran Kompleks
Kita dapat menggabungkan beberapa parameter untuk membuat kueri yang lebih kompleks.
Kueri Batas
Parameter limitToFirst
dan limitToLast
digunakan untuk menetapkan jumlah turunan maksimum yang akan menerima data. Jika 100 ditetapkan sebagai batasnya, hanya 100 turunan yang cocok yang akan kita terima. Jika pesan yang tersimpan dalam database kurang dari 100, maka kita akan menerima setiap turunan. Namun, jika ada lebih dari 100 pesan, kita hanya akan menerima data untuk 100 pesan. Jika limitToFirst
digunakan, pesan yang diterima adalah 100 pesan pertama yang diurutkan. Jika limitToLast
digunakan, pesan yang diterima adalah 100 pesan terakhir yang diurutkan.
Dengan menggunakan database fakta dinosaurus dan orderBy
, kita bisa menemukan dua dinosaurus terberat:
curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="weight"&limitToLast=2&print=pretty'
Demikian pula, kita bisa menemukan dua dinosaurus terpendek dengan menggunakan limitToFirst
:
curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="height"&limitToFirst=2&print=pretty'
Kita juga bisa melakukan kueri batas dengan orderBy="$value"
. Jika ingin membuat papan peringkat yang menampilkan tiga kompetitor dengan skor tertinggi dalam turnamen olahraga dino, kita bisa melakukan hal berikut:
curl 'https://dinosaur-facts.firebaseio.com/scores.json?orderBy="$value"&limitToLast=3&print=pretty'
Kueri Rentang
Dengan menggunakan startAt
, endAt
, dan equalTo
, kita dapat memilih titik awal dan akhir arbitrer untuk kueri yang kita buat. Misalnya, jika ingin menemukan semua dinosaurus yang memiliki tinggi minimal tiga meter, kita bisa menggabungkan orderBy
dan startAt
:
curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="height"&startAt=3&print=pretty'
Kita bisa menggunakan endAt
untuk menemukan semua dinosaurus yang namanya muncul sebelum Pterodactyl secara leksikografis:
curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="$key"&endAt="pterodactyl"&print=pretty'
Kita bisa menggabungkan startAt
dan endAt
untuk membatasi kedua ujung kueri.
Contoh berikut menemukan semua dinosaurus yang namanya dimulai dengan huruf "b":
curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="$key"&startAt="b"&endAt="b\uf8ff"&print=pretty'
Kueri rentang juga berguna ketika Anda perlu memisahkan data Anda menjadi beberapa halaman.
Menggabungkan semuanya
Kita bisa menggabungkan semua teknik ini untuk membuat kueri yang kompleks. Misalnya, mungkin Anda ingin menemukan nama semua dinosaurus yang tingginya lebih pendek dari atau sama dengan jenis favorit kami, Stegosaurus:
MY_FAV_DINO_HEIGHT=`curl "https://dinosaur-facts.firebaseio.com/dinosaurs/stegosaurus/height.json"` curl "https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy=\"height\"&endAt=${MY_FAV_DINO_HEIGHT}&print=pretty"
Metode Pengurutan Data
Bagian ini menjelaskan cara data diurutkan ketika menggunakan tiga parameter filter yang berbeda.
orderBy
Ketika menggunakan orderBy
dengan nama suatu kunci turunan, data yang berisi kunci turunan yang ditentukan akan diurutkan sebagai berikut:
-
Turunan yang memiliki nilai
null
untuk kunci turunan yang ditentukan akan muncul terlebih dahulu. -
Turunan yang memiliki nilai
false
untuk kunci turunan yang ditentukan akan muncul berikutnya. Jika beberapa turunan memiliki nilaifalse
, turunan tersebut akan diurutkan secara leksikografis berdasarkan kunci. -
Turunan yang memiliki nilai
true
untuk kunci turunan yang ditentukan akan muncul berikutnya. Jika beberapa turunan memiliki nilaitrue
, turunan tersebut akan diurutkan secara leksikografis berdasarkan kunci. - Turunan dengan nilai numerik akan muncul berikutnya, dan diurutkan dalam urutan menaik. Jika beberapa turunan memiliki nilai numerik yang sama untuk node turunan yang ditentukan, turunan tersebut akan diurutkan berdasarkan kunci.
- String muncul setelah angka, dan diurutkan secara leksikografis dalam urutan menaik. Jika beberapa turunan memiliki nilai yang sama untuk node turunan yang ditentukan, turunan tersebut akan diurutkan secara leksikografis berdasarkan kunci.
- Objek muncul terakhir, dan diurutkan secara leksikografis berdasarkan kunci dalam urutan menaik.
orderBy="$key"
Ketika menggunakan parameter orderBy="$key"
untuk mengurutkan data Anda, data tersebut akan ditampilkan dalam urutan menaik berdasarkan kunci seperti berikut. Perlu diingat bahwa kunci hanya bisa berupa string.
- Turunan dengan kunci yang bisa diurai sebagai bilangan bulat 32-bit muncul pertama, dan diurutkan secara menaik.
- Turunan dengan nilai string sebagai kuncinya muncul berikutnya, dan diurutkan menaik secara leksikografis.
orderBy="$value"
Ketika menggunakan parameter orderBy="$value"
untuk mengurutkan data, turunan akan diurutkan berdasarkan nilainya. Kriteria pengurutannya sama seperti data yang diurutkan berdasarkan kunci turunan, namun yang digunakan adalah nilai node, bukan nilai kunci turunan yang ditentukan.
orderBy="$priority"
Ketika menggunakan parameter orderBy="$priority"
untuk mengurutkan data, pengurutan turunan ditentukan berdasarkan prioritas dan kuncinya seperti berikut. Perlu diingat bahwa nilai prioritas hanya bisa berupa angka atau string.
- Turunan tanpa prioritas (default) akan muncul pertama.
- Turunan dengan angka sebagai prioritasnya akan muncul berikutnya. Turunan ini diurutkan secara numerik berdasarkan prioritas, dari kecil ke besar.
- Turunan dengan string sebagai prioritasnya akan muncul terakhir. Turunan ini diurutkan secara leksikografis berdasarkan prioritas.
- Setiap kali ada dua turunan yang memiliki prioritas sama (termasuk tanpa prioritas), keduanya akan diurutkan berdasarkan kunci. Kunci numerik muncul lebih dahulu (diurutkan secara numerik), dan diikuti kunci yang tersisa (diurutkan secara leksikografis).
Untuk informasi lebih lanjut tentang prioritas, lihat referensi API.
Streaming dari REST API
Endpoint Firebase REST mendukung protokol EventSource/Server-Sent Events, sehingga memudahkan kita mengalirkan perubahan ke satu lokasi dalam database Firebase.
Untuk memulai streaming, lakukan hal berikut:
- Tetapkan header Accept klien ke
text/event-stream
- Patuhi Pengalihan HTTP, terutama kode status HTTP 307
- Sertakan parameter kueri
auth
jika lokasi database Firebase memerlukan izin baca
Sebagai balasannya, server akan mengirimkan peristiwa bernama sebagai status data pada perubahan URL yang diminta. Struktur pesan ini sesuai dengan protokol EventSource:
event: event name data: JSON encoded data payload
Server mungkin akan mengirimkan peristiwa berikut:
put | Data yang dienkode JSON akan menjadi objek dengan dua kunci: jalur dan data Jalur akan menunjuk ke lokasi yang relatif terhadap URL permintaan Klien harus mengganti semua data di lokasi tersebut dalam cache-nya dengan data yang diberikan dalam pesan |
patch | Data yang dienkode JSON akan menjadi objek dengan dua kunci: jalur dan data Jalur akan menunjuk ke lokasi yang relatif terhadap URL permintaan Untuk setiap kunci dalam data, klien harus mengganti kunci yang sesuai dalam cache-nya dengan data untuk kunci tersebut dalam pesan |
keep-alive | Data untuk peristiwa ini adalah null, tindakan tidak diperlukan |
batal | Data untuk peristiwa ini adalah null Peristiwa ini akan dikirim jika Aturan Keamanan Firebase Realtime Database menyebabkan pembacaan di lokasi yang diminta tidak lagi diizinkan |
auth_revoked | Data untuk peristiwa ini adalah string yang menunjukkan bahwa kredensial sudah tidak berlaku Peristiwa ini akan dikirim jika parameter auth yang disediakan tidak lagi valid |
Berikut contoh rangkaian peristiwa yang mungkin akan dikirim oleh server:
// Set your entire cache to {"a": 1, "b": 2} event: put data: {"path": "/", "data": {"a": 1, "b": 2}} // Put the new data in your cache under the key 'c', so that the complete cache now looks like: // {"a": 1, "b": 2, "c": {"foo": true, "bar": false}} event: put data: {"path": "/c", "data": {"foo": true, "bar": false}} // For each key in the data, update (or add) the corresponding key in your cache at path /c, // for a final cache of: {"a": 1, "b": 2, "c": {"foo": 3, "bar": false, "baz": 4}} event: patch data: {"path": "/c", "data": {"foo": 3, "baz": 4}}
Jika Anda menggunakan Go, cobalah Firego, yaitu wrapper pihak ketiga untuk Firebase REST dan Streaming API.