Cara Menyimpan Data |
|
---|---|
PUT | Menulis atau mengganti data ke lokasi yang ditetapkan, seperti messages/users/user1/<data> |
PATCH | Mengupdate sebagian kunci untuk sebuah lokasi yang ditetapkan tanpa mengganti semua data. |
POST | Menambahkan ke daftar data dalam database Firebase kami. Setiap kali permintaan POST dikirim, klien Firebase memunculkan kunci unik, seperti messages/users/<unique-id>/<data> |
DELETE | Menghapus data dari referensi database Firebase yang ditentukan. |
Menulis Data dengan PUT
Operasi tulis dasar melalui REST API adalah PUT
. Untuk mendemonstrasikan penyimpanan data, kita akan membuat aplikasi blogging dengan postingan dan pengguna. Semua data untuk aplikasi akan disimpan di URL database Firebase https://docs-examples.firebaseio.com/rest/saving-data/fireblog.
Mari kita mulai dengan menyimpan beberapa data pengguna ke database Firebase. Kita menyimpan setiap pengguna dengan nama pengguna yang unik, dan kita juga menyimpan nama lengkap dan tanggal lahir mereka. Karena setiap pengguna akan memiliki nama pengguna yang unik, maka masuk akal jika PUT
digunakan di sini, bukan POST
, karena kita telah memiliki kunci dan tidak perlu membuat kunci.
Dengan PUT
, kita bisa menulis string, angka, boolean, array atau sembarang objek JSON ke database Firebase. Dalam hal ini kita akan meneruskan sebuah objek:
curl -X PUT -d '{ "alanisawesome": { "name": "Alan Turing", "birthday": "June 23, 1912" } }' 'https://docs-examples.firebaseio.com/rest/saving-data/fireblog/users.json'
Ketika objek JSON disimpan ke database, properti objek secara otomatis dipetakan ke lokasi turunan secara bertingkat. Jika kita menuju ke node yang baru dibuat, kita akan melihat nilai "Alan Turing". Kita juga bisa menyimpan data secara langsung ke lokasi turunan:
curl -X PUT -d '"Alan Turing"' \ 'https://docs-examples.firebaseio.com/rest/saving-data/fireblog/users/alanisawesome/name.json'
curl -X PUT -d '"June 23, 1912"' \ 'https://docs-examples.firebaseio.com/rest/saving-data/fireblog/users/alanisawesome/birthday.json'
Kedua contoh di atas—menulis nilai secara bersamaan dengan objek dan menuliskannya secara terpisah ke lokasi turunan—mengakibatkan data yang sama disimpan ke database Firebase:
{ "users": { "alanisawesome": { "date_of_birth": "June 23, 1912", "full_name": "Alan Turing" } } }
Permintaan yang berhasil akan ditunjukkan oleh kode status HTTP 200 OK
dan responsnya akan memuat data yang dituliskan ke database. Contoh pertama hanya akan memicu 1 peristiwa pada klien yang mengamati data, sedangkan contoh kedua akan memicu 2 peristiwa. Penting dicatat bahwa jika data telah ada di lokasi pengguna, pendekatan pertama akan menimpa data tersebut, tetapi metode kedua hanya akan mengubah nilai dari setiap node turunan terpisah, sementara turunan lainnya tidak berubah. PUT
setara dengan set()
di JavaScript SDK kami.
Mengupdate Data dengan PATCH
Dengan permintaan PATCH
, kita dapat mengupdate turunan tertentu di sebuah lokasi tanpa menimpa data yang ada. Mari kita tambahkan nama panggilan Turing ke data penggunanya dengan permintaan PATCH
:
curl -X PATCH -d '{ "nickname": "Alan The Machine" }' \ 'https://docs-examples.firebaseio.com/rest/saving-data/users/alanisawesome.json'
Permintaan di atas akan menuliskan nickname
ke objek alanisawesome
tanpa menghapus turunan name
atau birthday
. Perhatikan bahwa seandainya permintaan PUT
telah dibuat di sini, name
dan birthday
tentu telah dihapus karena keduanya tidak tercantum pada permintaan. Data di database Firebase sekarang tampak seperti ini:
{ "users": { "alanisawesome": { "date_of_birth": "June 23, 1912", "full_name": "Alan Turing", "nickname": "Alan The Machine" } } }
Permintaan yang berhasil akan ditunjukkan oleh kode status HTTP 200 OK
dan responsnya akan memuat data terbaru yang dituliskan ke database.
Firebase juga mendukung update multi-lokasi. Artinya, PATCH
kini dapat memperbarui nilai di beberapa lokasi dalam database Firebase secara bersamaan. Ini adalah fitur canggih yang akan membantu Anda melakukan denormalisasi data. Dengan update multi-lokasi, kita bisa menambahkan nama panggilan untuk Alan dan Grace secara bersamaan:
curl -X PATCH -d '{ "alanisawesome/nickname": "Alan The Machine", "gracehopper/nickname": "Amazing Grace" }' \ 'https://docs-examples.firebaseio.com/rest/saving-data/users.json'
Setelah update ini, nama panggilan akan ditambahkan untuk Alan dan Grace:
{ "users": { "alanisawesome": { "date_of_birth": "June 23, 1912", "full_name": "Alan Turing", "nickname": "Alan The Machine" }, "gracehop": { "date_of_birth": "December 9, 1906", "full_name": "Grace Hopper", "nickname": "Amazing Grace" } } }
Perhatikan bahwa mencoba mengupdate objek dengan menulis objek beserta lokasinya akan menghasilkan perilaku yang berbeda. Mari kita lihat apa yang terjadi jika kita mencoba mengupdate Grace dan Alan dengan cara ini:
curl -X PATCH -d '{ "alanisawesome": {"nickname": "Alan The Machine"}, "gracehopper": {"nickname": "Amazing Grace"} }' \ 'https://docs-examples.firebaseio.com/rest/saving-data/users.json'
Cara ini menghasilkan perilaku yang berbeda, yaitu menimpa seluruh node /users
:
{ "users": { "alanisawesome": { "nickname": "Alan The Machine" }, "gracehop": { "nickname": "Amazing Grace" } } }
Mengupdate Data dengan Permintaan Bersyarat
Anda dapat menggunakan permintaan bersyarat, REST yang setara dengan transaksi, untuk mengupdate data sesuai dengan status yang ada. Misalnya, jika Anda ingin meningkatkan penghitung jumlah voting, dan ingin memastikan jumlah tersebut mencerminkan voting dalam jumlah banyak dan simultan secara akurat, gunakan permintaan bersyarat untuk menuliskan nilai baru ke penghitung. Bukannya 2 permintaan penulisan yang mengubah penghitung ke jumlah yang sama, melainkan salah satu permintaan penulisan gagal sehingga Anda dapat mencoba lagi untuk melakukan permintaan dengan nilai yang baru.- Untuk melakukan permintaan bersyarat di suatu lokasi, dapatkan ID unik untuk data saat ini di lokasi tersebut, atau ETag. Jika data berubah di lokasi tersebut, ETag juga akan berubah. Anda dapat meminta ETag dengan metode apa pun selain
PATCH
. Contoh berikut menggunakan permintaanGET
.curl -i 'https://test.example.com/posts/12345/upvotes.json' -H 'X-Firebase-ETag: true'
Pemanggilan ETag di header secara khusus akan menampilkan ETag di lokasi yang ditentukan dalam respons HTTP.HTTP/1.1 200 OK Content-Length: 6 Content-Type: application/json; charset=utf-8 Access-Control-Allow-Origin: * ETag: [ETAG_VALUE] Cache-Control: no-cache 10 // Current value of the data at the specified location
- Sertakan ETag yang ditampilkan dalam permintaan
PUT
atauDELETE
berikutnya, untuk mengupdate data yang secara khusus sesuai dengan nilai ETag. Dengan mengikuti contoh kami, untuk mengupdate penghitung menjadi 11, atau 1 angka lebih besar dari nilai awal yang diambil yaitu 10, dan menggagalkan permintaan jika nilainya tidak sesuai lagi, gunakan kode berikut ini:curl -iX PUT -d '11' 'https://[PROJECT_ID].firebaseio.com/posts/12345/upvotes.json' -H 'if-match:[ETAG_VALUE]'
Jika nilai data di lokasi yang ditentukan masih 10, ETag dalam permintaanPUT
akan sesuai, dan permintaan berhasil, sehingga menulis 11 ke database.HTTP/1.1 200 OK Content-Length: 6 Content-Type: application/json; charset=utf-8 Access-Control-Allow-Origin: * Cache-Control: no-cache 11 // New value of the data at the specified location, written by the conditional request
Jika lokasi tidak lagi sesuai dengan ETag, yang mungkin terjadi jika pengguna lain menulis nilai baru ke database, permintaan tersebut akan gagal tanpa menulis ke lokasi. Respons yang ditampilkan mencakup nilai baru dan ETag.HTTP/1.1 412 Precondition Failed Content-Length: 6 Content-Type: application/json; charset=utf-8 Access-Control-Allow-Origin: * ETag: [ETAG_VALUE] Cache-Control: no-cache 12 // New value of the data at the specified location
- Gunakan informasi baru jika Anda memutuskan untuk mencoba kembali permintaan tersebut. Realtime Database tidak secara otomatis mencoba kembali permintaan bersyarat yang telah gagal. Namun, Anda bisa menggunakan nilai baru dan ETag untuk membuat permintaan bersyarat baru dengan informasi yang ditampilkan oleh respons gagal.
Permintaan bersyarat berbasis REST menerapkan standar if-match HTTP. Namun, permintaan tersebut berbeda dari permintaan standar dalam hal berikut:
- Anda hanya bisa menyediakan 1 nilai ETag untuk setiap permintaan if-match, bukan dalam jumlah banyak.
- Meskipun permintaan standar menunjukkan bahwa ETag ditampilkan dengan semua permintaan, Realtime Database hanya menampilkan ETag dengan permintaan yang menyertakan header
X-Firebase-ETag
. Cara ini dapat mengurangi biaya penagihan untuk permintaan standar.
Permintaan bersyarat mungkin juga lebih lambat dari permintaan REST biasa.
Menyimpan Daftar Data
Untuk membuat kunci berbasis stempel waktu yang unik untuk setiap turunan yang ditambahkan ke referensi database Firebase, kita bisa mengirimkan permintaan POST
. Untuk lokasi users
, sebaiknya kita menetapkan kunci sendiri karena setiap pengguna memiliki nama pengguna yang unik. Tetapi ketika pengguna menambahkan postingan blog ke aplikasi, kita akan menggunakan permintaan POST
untuk otomatis membuat kunci untuk setiap postingan blog:
curl -X POST -d '{ "author": "alanisawesome", "title": "The Turing Machine" }' 'https://docs-examples.firebaseio.com/rest/saving-data/fireblog/posts.json'
Lokasi posts
kita sekarang memiliki data berikut:
{ "posts": { "-JSOpn9ZC54A4P4RoqVa": { "author": "alanisawesome", "title": "The Turing Machine" } } }
Perhatikan bahwa kunci -JSOpn9ZC54A4P4RoqVa
otomatis dibuat untuk kita karena kita menggunakan permintaan POST
. Permintaan yang sukses akan ditunjukkan dengan kode status HTTP 200 OK
, dan respons akan memuat kunci data baru yang telah ditambahkan:
{"name":"-JSOpn9ZC54A4P4RoqVa"}
Menghapus Data
Untuk menghapus data dari database, kita bisa mengirim permintaan DELETE
dengan URL dari lokasi tempat kita ingin menghapus data. Yang berikut ini akan menghapus Alan dari lokasi users
kita:
curl -X DELETE \ 'https://docs-examples.firebaseio.com/rest/saving-data/users/alanisawesome.json'
Permintaan DELETE
yang berhasil akan ditunjukkan dengan kode status HTTP 200 OK
dengan respons yang memuat JSON null
.
Parameter URI
REST API menerima parameter URI berikut ketika menulis data ke database:
auth
Parameter permintaan auth
mengizinkan akses ke data yang dilindungi oleh Aturan Firebase Realtime Database, dan didukung oleh semua jenis permintaan. Argumennya bisa berupa rahasia aplikasi Firebase atau token autentikasi, yang akan kita bahas di bagian otorisasi pengguna. Pada contoh berikut, kita mengirimkan permintaan POST
dengan parameter auth
, di mana CREDENTIAL
adalah rahasia aplikasi Firebase atau token autentikasi:
curl -X POST -d '{"Authenticated POST request"}' \ 'https://docs-examples.firebaseio.com/rest/saving-data/auth-example.json?auth=CREDENTIAL'
Parameter print
dapat kita gunakan untuk menentukan format respons dari database. Menambahkan print=pretty
ke permintaan akan menampilkan data dalam format yang terbaca oleh manusia. print=pretty
didukung oleh permintaan GET
, PUT
, POST
, PATCH
, dan DELETE
.
Untuk menyembunyikan output dari server saat menulis data, kita bisa menambahkan print=silent
ke permintaan. Respons yang dihasilkan akan kosong dan ditunjukkan melalui kode status HTTP 204 No Content
jika permintaan berhasil.
print=silent
didukung oleh permintaan GET
, PUT
, POST
, dan PATCH
.
Menulis Nilai Server
Nilai server dapat ditulis di sebuah lokasi menggunakan nilai placeholder, yang berupa objek dengan kunci ".sv"
tunggal. Nilai untuk kunci tersebut adalah jenis nilai server yang ingin kita tetapkan.
Misalnya, untuk menetapkan stempel waktu saat pengguna dibuat, kita bisa melakukan yang berikut ini:
curl -X PUT -d '{".sv": "timestamp"}' \ 'https://docs-examples.firebaseio.com/rest/saving-data/alanisawesome/createdAt.json'
"timestamp"
adalah satu-satunya nilai server yang didukung, dan merupakan waktu sejak masa UNIX dalam milidetik.
Meningkatkan Performa Tulis
Jika kita menulis sejumlah besar data ke database, kita bisa menggunakan parameter print=silent
untuk meningkatkan performa tulis dan mengurangi penggunaan bandwidth. Pada perilaku tulis normal, server merespons dengan data JSON yang telah ditulis.
Jika print=silent
ditentukan, server akan segera menutup koneksi begitu data diterima sehingga mengurangi penggunaan bandwidth.
Jika kita membuat banyak permintaan ke database, kita bisa menggunakan kembali koneksi HTTPS dengan mengirimkan permintaan Keep-Alive
pada header HTTP.
Condition Error
REST API akan menampilkan kode error dalam situasi berikut ini:
Kode Status HTTP | |
---|---|
400 Bad Request |
Salah satu kondisi error berikut:
|
401 Unauthorized |
Salah satu kondisi error berikut:
|
404 Not Found | Database Firebase yang ditentukan tidak ditemukan. |
500 Internal Server Error | Server menampilkan error. Lihat pesan error untuk keterangan lebih lanjut. |
503 Service Unavailable | Firebase Realtime Database yang ditentukan untuk sementara tidak tersedia yang berarti permintaan tidak dicoba. |
Mengamankan Data
Firebase memiliki bahasa keamanan yang memungkinkan kita menentukan pengguna yang memiliki akses baca dan tulis ke berbagai node data. Informasi selengkapnya dapat dibaca di Mengamankan Aplikasi Anda.
Setelah membahas penyimpanan data, berikutnya kita akan mempelajari cara mengambil data dari database Firebase melalui REST API.