Veri Kaydetme

Verileri Kaydetmenin Yolları

KOYMAK fireblog/users/user1/<data> gibi tanımlı bir yola veri yazın veya değiştirin
YAMA Tüm verileri değiştirmeden tanımlanmış bir yol için bazı anahtarları güncelleyin.
POSTALAMAK Firebase veritabanımızdaki bir veri listesine ekleyin . Her POST isteği gönderdiğimiz zaman, Firebase istemcisi, fireblog/users/<unique-id>/<data> gibi benzersiz bir anahtar oluşturur.
SİLMEK Belirtilen Firebase veritabanı referansından verileri kaldırın.

PUT ile Veri Yazmak

REST API aracılığıyla temel yazma işlemi PUT . Verilerin kaydedildiğini göstermek için gönderiler ve kullanıcılarla bir blog oluşturma uygulaması oluşturacağız. Uygulamamız için tüm veriler, "fireblog" yolu altında, Firebase veritabanı URL'si "https://docs-examples.firebaseio.com/fireblog" altında depolanacaktır.

Bazı kullanıcı verilerini Firebase veritabanımıza kaydederek başlayalım. Her kullanıcıyı benzersiz bir kullanıcı adı ile saklayacağız ve ayrıca tam adlarını ve doğum tarihlerini de saklayacağız. Her kullanıcının benzersiz bir kullanıcı adı olacağından, anahtara zaten sahip olduğumuz ve bir anahtar oluşturmamız gerekmediği için burada POST yerine PUT kullanmak mantıklıdır.

PUT kullanarak, Firebase veri tabanımıza bir dizi, sayı, boolean, dizi veya herhangi bir JSON nesnesi yazabiliriz. Bu durumda ona bir nesne ileteceğiz:

curl -X PUT -d '{
  "alanisawesome": {
    "name": "Alan Turing",
    "birthday": "June 23, 1912"
  }
}' 'https://docs-examples.firebaseio.com/fireblog/users.json'

Bir JSON nesnesi veritabanına kaydedildiğinde, nesne özellikleri alt konumlara otomatik olarak iç içe geçmiş bir şekilde eşlenir. Yeni oluşturulan düğüme gidersek, "Alan Turing" değerini göreceğiz. Verileri doğrudan bir alt konuma da kaydedebiliriz:

curl -X PUT -d '"Alan Turing"' \
  'https://docs-examples.firebaseio.com/fireblog/users/alanisawesome/name.json'
curl -X PUT -d '"June 23, 1912"' \
  'https://docs-examples.firebaseio.com/fireblog/users/alanisawesome/birthday.json'

Yukarıdaki iki örnek (değeri bir nesne olarak aynı anda yazmak ve bunları alt konumlara ayrı ayrı yazmak), aynı verilerin Firebase veritabanımıza kaydedilmesine neden olur:

{
  "users": {
    "alanisawesome": {
      "date_of_birth": "June 23, 1912",
      "full_name": "Alan Turing"
    }
  }
}

Başarılı bir istek, 200 OK HTTP durum kodu ile belirtilecek ve yanıt, veritabanına yazdığımız verileri içerecektir. İlk örnek, verileri izleyen istemcilerde yalnızca bir olayı tetiklerken, ikinci örnek iki olayı tetikleyecektir. Veriler kullanıcı yolunda zaten mevcutsa, ilk yaklaşımın bunun üzerine yazacağını, ancak ikinci yöntemin yalnızca her bir ayrı alt düğümün değerini değiştirirken diğer çocukları değiştirmeden bırakacağını not etmek önemlidir. PUT JavaScript SDK'mızdaki set() ile eşdeğerdir.

PATCH ile Verileri Güncelleme

Bir PATCH isteği kullanarak, mevcut verilerin üzerine yazmadan bir konumdaki belirli çocukları güncelleyebiliriz. Bir PATCH isteği ile Turing'in takma adını kullanıcı verilerine ekleyelim:

curl -X PATCH -d '{
  "nickname": "Alan The Machine"
}' \
  'https://docs-examples.firebaseio.com/fireblog/users/alanisawesome.json'

Yukarıdaki istek, alanisawesome nesnemize, name veya birthday çocuklarını silmeden nickname yazacaktır. Bunun yerine burada bir PUT isteği göndermiş olsaydık, isteğe dahil edilmediğinden name ve birthday silinmiş olacağını unutmayın. Firebase veritabanımızdaki veriler artık şöyle görünür:

{
  "users": {
    "alanisawesome": {
      "date_of_birth": "June 23, 1912",
      "full_name": "Alan Turing",
      "nickname": "Alan The Machine"
    }
  }
}

Başarılı bir istek, 200 OK HTTP durum kodu ile belirtilecek ve yanıt, veritabanına yazılan güncellenmiş verileri içerecektir.

Firebase ayrıca çok yollu güncellemeleri de destekler. Bu, PATCH artık Firebase veritabanınızdaki birden çok konumdaki değerleri aynı anda güncelleyebileceği anlamına gelir; bu, verilerinizi normalleştirmenize yardımcı olan güçlü bir özelliktir. Çok yollu güncellemeleri kullanarak hem Alan'a hem de Grace'e aynı anda takma adlar ekleyebiliriz:

curl -X PATCH -d '{
  "alanisawesome/nickname": "Alan The Machine",
  "gracehopper/nickname": "Amazing Grace"
}' \
  'https://docs-examples.firebaseio.com/fireblog/users.json'

Bu güncellemeden sonra hem Alan hem de Grace'in takma adları eklendi:

{
  "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"
    }
  }
}

Dahil edilen yollarla nesneleri yazarak nesneleri güncellemeye çalışmanın farklı davranışlarla sonuçlanacağını unutmayın. Bunun yerine Grace ve Alan'ı şu şekilde güncellemeye çalışırsak ne olacağına bir göz atalım:

curl -X PATCH -d '{
  "alanisawesome": {"nickname": "Alan The Machine"},
  "gracehopper": {"nickname": "Amazing Grace"}
}' \
  'https://docs-examples.firebaseio.com/fireblog/users.json'

Bu, farklı davranışlarla sonuçlanır, yani tüm /fireblog/users düğümünün üzerine yazılır:

{
  "users": {
    "alanisawesome": {
      "nickname": "Alan The Machine"
    },
    "gracehop": {
      "nickname": "Amazing Grace"
    }
  }
}

Koşullu İsteklerle Verileri Güncelleme

Verileri mevcut durumuna göre güncellemek için işlemlere eşdeğer REST olan koşullu istekleri kullanabilirsiniz. Örneğin, bir artı oy sayacını artırmak ve sayımın aynı anda birden fazla olumlu oyu doğru şekilde yansıttığından emin olmak istiyorsanız, yeni değeri sayaca yazmak için koşullu bir istek kullanın. Sayacı aynı sayıya çeviren iki yazma yerine, yazma isteklerinden biri başarısız olur ve ardından isteği yeni değerle yeniden deneyebilirsiniz.
  1. Bir konumda koşullu istek gerçekleştirmek için, o konumdaki mevcut veriler için benzersiz tanımlayıcıyı veya ETag'i alın. Veriler o konumda değişirse, ETag de değişir. PATCH dışında herhangi bir yöntemle bir ETag talep edebilirsiniz. Aşağıdaki örnek bir GET isteği kullanır.
    curl -i 'https://test.example.com/posts/12345/upvotes.json' -H 'X-Firebase-ETag: true'
    
    Başlıkta ETag'in özel olarak çağrılması, HTTP yanıtında belirtilen konumun ETag'ini döndürür.
    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. Döndürülen ETag'i, özellikle bu ETag değeriyle eşleşen verileri güncellemek için bir sonraki PUT veya DELETE isteğinize dahil edin. Örneğimizi izleyerek, sayacı 11'e veya ilk getirilen 10 değerinden daha büyük 1'e güncellemek ve değer artık eşleşmiyorsa talebi başarısız kılmak için aşağıdaki kodu kullanın:
    curl -iX PUT -d '11' 'https://[PROJECT_ID].firebaseio.com/posts/12345/upvotes.json' -H 'if-match:[ETAG_VALUE]'
    
    konum hala 10'dur, PUT isteğindeki ETag eşleşir ve istek başarılı olur ve veritabanına 11 yazılır.
    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
    
    Konum artık ETag ile eşleşmiyorsa, bu başka bir kullanıcı veritabanına yeni bir değer yazdığında meydana gelebilir, istek konuma yazılmadan başarısız olur. Dönüş yanıtı, yeni değeri ve ETag'i içerir.
    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. İsteği yeniden denemeye karar verirseniz yeni bilgileri kullanın. Gerçek Zamanlı Veritabanı, başarısız olan koşullu istekleri otomatik olarak yeniden denemez. Ancak, başarısız yanıtı tarafından döndürülen bilgilerle yeni bir koşullu istek oluşturmak için yeni değeri ve ETag'i kullanabilirsiniz.

REST tabanlı koşullu istekler, HTTP if-match standardını uygular. Bununla birlikte, standarttan aşağıdaki şekillerde farklılık gösterirler:

  • Her if-match isteği için birden çok değil, yalnızca bir ETag değeri sağlayabilirsiniz.
  • Standart, ETag'lerin tüm isteklerle birlikte döndürülmesini önerirken, Realtime Database yalnızca X-Firebase-ETag başlığını içeren isteklerle ETag'leri döndürür. Bu, standart istekler için faturalandırma maliyetlerini azaltır.

Koşullu istekler ayrıca tipik REST isteklerinden daha yavaş olabilir.

Veri Listelerini Kaydetme

Bir Firebase veritabanı referansına eklenen her çocuk için benzersiz, zaman damgası tabanlı bir anahtar oluşturmak için bir POST isteği gönderebiliriz. users yolumuz için, her kullanıcının benzersiz bir kullanıcı adı olduğundan, kendi anahtarlarımızı tanımlamamız mantıklıydı. Ancak kullanıcılar uygulamaya blog gönderileri eklediğinde, her blog gönderisi için otomatik olarak bir anahtar oluşturmak üzere bir POST isteği kullanırız:

curl -X POST -d '{
  "author": "alanisawesome",
  "title": "The Turing Machine"
}' 'https://docs-examples.firebaseio.com/fireblog/posts.json'

posts yolumuz artık aşağıdaki verilere sahip:

{
  "posts": {
    "-JSOpn9ZC54A4P4RoqVa": {
      "author": "alanisawesome",
      "title": "The Turing Machine"
    }
  }
}

Bir POST isteği kullandığımız için -JSOpn9ZC54A4P4RoqVa anahtarının bizim için otomatik olarak oluşturulduğuna dikkat edin. Başarılı bir istek, 200 OK HTTP durum koduyla belirtilir ve yanıt, eklenen yeni verilerin anahtarını içerir:

{"name":"-JSOpn9ZC54A4P4RoqVa"}

Verileri Kaldırma

Veri tabanından veri kaldırmak için, verileri silmek istediğimiz yolun URL'sini içeren bir DELETE isteği gönderebiliriz. Aşağıdakiler, Alan'ı users yolumuzdan siler:

curl -X DELETE \
  'https://docs-examples.firebaseio.com/fireblog/users/alanisawesome.json'

Başarılı bir DELETE isteği, JSON null içeren bir yanıtla birlikte 200 OK HTTP durum koduyla belirtilecektir.

URI Parametreleri

REST API, veritabanına veri yazarken aşağıdaki URI parametrelerini kabul eder:

yetki

auth request parametresi , Firebase Realtime Database Security Rules tarafından korunan verilere erişim sağlar ve tüm istek türleri tarafından desteklenir. Argüman, Firebase uygulama sırrımız veya kullanıcı yetkilendirme bölümünde ele alacağımız bir kimlik doğrulama belirteci olabilir. Aşağıdaki örnekte, auth parametresiyle bir POST isteği gönderiyoruz; burada CREDENTIAL , Firebase uygulama sırrımız veya bir kimlik doğrulama belirtecidir:

curl -X POST -d '{"Authenticated POST request"}' \
  'https://docs-examples.firebaseio.com/auth-example.json?auth=CREDENTIAL'

Yazdır

print parametresi, veritabanından yanıtımızın biçimini belirlememizi sağlar. İsteğimize print=pretty eklemek, verileri insan tarafından okunabilir bir biçimde döndürür. print=pretty GET , PUT , POST , PATCH ve DELETE istekleri tarafından desteklenir.

Veri yazarken sunucudan gelen çıktıyı bastırmak için isteğimize print=silent ekleyebiliriz. Ortaya çıkan yanıt boş olacak ve istek başarılı olursa 204 No Content HTTP durum koduyla belirtilecektir. print=silent GET , PUT , POST ve PATCH istekleri tarafından desteklenir.

Sunucu Değerlerini Yazma

Sunucu değerleri, tek bir ".sv" anahtarına sahip bir nesne olan yer tutucu değeri kullanılarak bir konuma yazılabilir. Bu anahtarın değeri, ayarlamak istediğimiz sunucu değeri türüdür. Örneğin, bir kullanıcı oluşturulduğunda bir zaman damgası ayarlamak için aşağıdakileri yapabiliriz:

curl -X PUT -d '{".sv": "timestamp"}' \
  'https://docs-examples.firebaseio.com/alanisawesome/createdAt.json'

"timestamp" desteklenen tek sunucu değeridir ve milisaniye cinsinden UNIX döneminden bu yana geçen süredir.

Yazma Performansını İyileştirme

Veritabanına büyük miktarda veri yazıyorsak, yazma performansımızı iyileştirmek ve bant genişliği kullanımını azaltmak için print=silent parametresini kullanabiliriz. Normal yazma davranışında sunucu, yazılan JSON verileriyle yanıt verir. print=silent belirtildiğinde, veri alınır alınmaz sunucu bağlantıyı hemen kapatarak bant genişliği kullanımını azaltır.

Veritabanına çok sayıda istek yaptığımız durumlarda, HTTP başlığında bir Keep-Alive isteği göndererek HTTPS bağlantısını yeniden kullanabiliriz.

Hata Koşulları

REST API, şu koşullar altında hata kodları döndürür:

HTTP Durum Kodları
400 Hatalı İstek

Aşağıdaki hata koşullarından biri:

  • PUT veya POST verileri ayrıştırılamıyor.
  • PUT veya POST verileri eksik.
  • İstek, çok büyük olan verileri PUT veya POST yapmaya çalışır.
  • REST API çağrısı, yolun parçası olarak geçersiz alt adlar içeriyor.
  • REST API çağrı yolu çok uzun.
  • İstek, tanınmayan bir sunucu değeri içeriyor.
  • Sorgunun dizini , Firebase Gerçek Zamanlı Veritabanı Güvenlik Kurallarınızda tanımlı değil.
  • İstek, belirtilen sorgu parametrelerinden birini desteklemiyor.
  • İstek, sorgu parametrelerini sığ bir GET isteğiyle karıştırır.
401 Yetkisiz

Aşağıdaki hata koşullarından biri:

404 Bulunamadı Belirtilen Firebase veritabanı bulunamadı.
500 Dahili Sunucu Hatası Sunucu bir hata döndürdü. Daha fazla ayrıntı için hata mesajına bakın.
503 Hizmet Kullanılamıyor Belirtilen Firebase Gerçek Zamanlı Veritabanı geçici olarak kullanılamıyor, bu da isteğin denenmediği anlamına gelir.

Veri Güvenliği

Firebase, hangi kullanıcıların verilerimizin farklı düğümlerine okuma ve yazma erişimi olduğunu tanımlamamıza izin veren bir güvenlik diline sahiptir. Gerçek Zamanlı Veritabanı Güvenlik Kuralları'nda bununla ilgili daha fazla bilgi edinebilirsiniz.

Artık veri kaydetme konusunu ele aldığımıza göre, bir sonraki bölümde REST API aracılığıyla verilerimizi Firebase veritabanından nasıl alacağımızı öğrenebiliriz.