Veri Kaydetme

Verileri Kaydetmenin Yolları

KOY fireblog/users/user1/<data> gibi tanımlanmış bir yola veri yazın veya değiştirin
YAMA Tüm verileri değiştirmeden tanımlı bir yol için bazı anahtarları güncelleyin.
İLETİ Firebase veritabanımızdaki bir veri listesine ekleyin . Her POST isteği gönderdiğimizde, 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 Yazma

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

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

PUT kullanarak Firebase veritabanımıza bir dize, 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 otomatik olarak alt konumlara 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'
tutucu2 l10n-yer
curl -X PUT -d '"June 23, 1912"' \
  'https://docs-examples.firebaseio.com/fireblog/users/alanisawesome/birthday.json'

Yukarıdaki iki örnek (değerin bir nesne olarak aynı anda yazılması ve bunları alt konumlara ayrı ayrı yazılması) aynı verilerin Firebase veritabanımıza kaydedilmesine neden olacaktır:

{
  "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. Kullanıcı yolunda veri zaten mevcutsa, ilk yaklaşımın bunun üzerine yazacağını, ancak ikinci yöntemin diğer çocukları değiştirmeden bırakırken yalnızca her bir ayrı alt düğümün değerini değiştireceğini belirtmek önemlidir. PUT , JavaScript SDK'mızdaki set() ile eşdeğerdir.

PATCH ile Veri Güncelleme

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

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

Yukarıdaki istek alanisawesome name veya birthday çocukları silmeden nickname yazacaktır. Bunun yerine burada bir PUT isteği yayınlamış olsaydık, istekte yer almadıkları için name ve birthday silineceğini unutmayın. Firebase veritabanımızdaki veriler şimdi şö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, bir 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 Alan ve 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 nesneler 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, tüm /fireblog/users düğümünün üzerine yazmak gibi farklı davranışlarla sonuçlanı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 istiyorsanız ve sayının birden fazla, eşzamanlı olumlu oyu doğru bir şekilde yansıttığından emin olmak istiyorsanız, sayaca yeni değeri 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 isteği yeni değerle yeniden deneyebilirsiniz.
  1. Bir konumda koşullu bir istek gerçekleştirmek için, o konumdaki mevcut veriler için benzersiz tanımlayıcıyı veya ETag'ı alın. Bu konumdaki veriler değişirse, ETag de değişir. PATCH dışında herhangi bir yöntemle bir ETag talep edebilirsiniz. Aşağıdaki örnekte bir GET isteği kullanılmaktadır.
    curl -i 'https://test.example.com/posts/12345/upvotes.json' -H 'X-Firebase-ETag: true'
    
    özellikle çağırmak, HTTP yanıtında belirtilen konumun ETag'ını 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. Bu ETag değeriyle özel olarak eşleşen verileri güncellemek için bir sonraki PUT veya DELETE isteğinize döndürülen ETag'ı ekleyin. Örneğimizi izleyerek, sayacı 11'e veya ilk alınan 10 değerinden daha büyük 1'e güncellemek ve değer artık eşleşmiyorsa istekte başarısız olmak 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]'
    
    Verinin değeri belirtilen değerdeyse konum hala 10, PUT isteğindeki ETag eşleşiyor ve istek başarılı oluyor ve veritabanına 11 yazıyor.
    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, başka bir kullanıcının veritabanına yeni bir değer yazması durumunda ortaya çıkabilecek olan ETag ile artık eşleşmiyorsa, istek konuma yazılmadan başarısız olur. Dönüş yanıtı, yeni değeri ve ETag'ı 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, fail yanıtı tarafından döndürülen bilgilerle yeni bir koşullu istek oluşturmak için yeni değeri ve ETag'ı kullanabilirsiniz.

REST tabanlı koşullu istekler, HTTP if-match standardını uygular. Bununla birlikte, aşağıdaki şekillerde standarttan farklıdırlar:

  • Her if-match isteği için birden fazla 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 üstbilgisini içeren isteklere sahip 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. Her kullanıcının benzersiz bir kullanıcı adı olduğundan, users yolumuz için 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

Veritabanından verileri 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 belirtilir.

URI Parametreleri

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

yetki

Yetkilendirme isteği parametresi, auth Gerçek Zamanlı Veritabanı Kuralları tarafından korunan verilere erişime izin verir 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 jetonumuz olabilir. Aşağıdaki örnekte, auth parametresiyle bir POST isteği gönderiyoruz; burada CREDENTIAL , bizim Firebase uygulama sırrımız veya bir kimlik doğrulama belirtecimizdir:

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 çı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 bir 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 şunları yapabiliriz:

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

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

Yazma Performansını Geliş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ındığında sunucu bağlantıyı hemen kapatarak bant genişliği kullanımını azaltır.

Veritabanına çok sayıda istekte bulunduğumuz durumlarda, HTTP başlığında Keep-Alive isteği göndererek HTTPS bağlantısını yeniden kullanabiliriz.

Hata Koşulları

REST API, bu koşullar altında hata kodlarını 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 PUT veya POST verilerini dener.
  • REST API çağrısı, yolun bir 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ı 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 geliyor.

Verilerin Güvenliğini Sağlama

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. Bununla ilgili daha fazla bilgiyi Realtime Database Rules bölümünde okuyabilirsiniz.

Artık verileri kaydetmeyi 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.