Buka konsol

Menyimpan Data

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.
  1. 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 permintaan GET.
    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
    
  2. Sertakan ETag yang ditampilkan dalam permintaan PUT atau DELETE 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 permintaan PUT 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
    
  3. 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'

print

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:

  • Tidak dapat mengurai data PUT atau POST.
  • Data PUT atau POST tidak ada.
  • Percobaan permintaan PUT atau POST data yang terlalu besar.
  • Panggilan REST API berisi nama turunan yang tidak valid sebagai bagian dari lokasi.
  • Lokasi pemanggilan REST API terlalu panjang.
  • Permintaan berisi nilai server yang tidak dikenal.
  • Indeks untuk kueri tidak ditetapkan dalam Aturan Firebase Realtime Database Anda.
  • Permintaan tidak mendukung salah satu parameter kueri yang ditentukan.
  • Permintaan mencampur parameter kueri dengan permintaan GET yang dangkal.
401 Unauthorized

Salah satu kondisi error berikut:

  • Masa berlaku token auth telah berakhir.
  • Token auth yang digunakan dalam permintaan tidak valid.
  • Gagal mengautentikasi dengan access_token.
  • Permintaan ini melanggar Aturan Firebase Realtime Database Anda.
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.