Veri Kaydetme

Veri Kaydetmenin Yolları

KOYMAK fireblog/users/user1/<data> gibi tanımlanmış 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 verilerin 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 . Verileri kaydetmeyi göstermek için gönderiler ve kullanıcılarla bir blog uygulaması oluşturacağız. Uygulamamıza ait tüm veriler, Firebase veritabanı URL'si "https://docs-examples.firebaseio.com/fireblog"da, "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, anahtar zaten elimizde olduğundan ve bir anahtar oluşturmamıza gerek olmadığından 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 aktaracağız:

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 konumlarla iç içe bir biçimde 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ğerin bir nesneyle aynı anda yazılması ve bunların alt konumlara ayrı ayrı yazılması), aynı verilerin Firebase veritabanımıza kaydedilmesiyle sonuçlanacaktır:

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

Başarılı bir istek, 200 OK HTTP durum koduyla gösterilecek 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 veriler zaten mevcutsa, ilk yaklaşımın onun üzerine yazacağını, ancak ikinci yöntemin yalnızca her bir alt düğümün değerini değiştirip diğer çocukları değiştirmeden bırakacağını unutmamak önemlidir. PUT JavaScript SDK'mızdaki set() işlevine eşdeğerdir.

PATCH ile Verileri Güncelleme

Bir PATCH isteği kullanarak, bir konumdaki belirli alt öğeleri mevcut verilerin üzerine yazmadan güncelleyebiliriz. 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ş olurdu. Firebase veritabanımızdaki veriler artık şöyle görünüyor:

{
  "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 koduyla gösterilecek 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 fazla 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"
    }
  }
}

Nesneleri, yolları dahil ederek yazarak 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 bakalı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ışlara, yani tüm /fireblog/users düğümünün üzerine yazılmasına neden olur:

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

Verileri Koşullu İsteklerle Güncelleme

Verileri mevcut durumuna göre güncellemek için işlemlere REST eşdeğeri olan koşullu istekleri kullanabilirsiniz. Örneğin, bir olumlu oy sayacını artırmak istiyorsanız ve sayımın birden fazla eşzamanlı olumlu oyu doğru bir ş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 değiştiren iki yazma yerine, yazma isteklerinden biri başarısız olur ve daha sonra isteği yeni değerle yeniden deneyebilirsiniz.
  1. Bir konumda koşullu istek gerçekleştirmek için o konumdaki mevcut verilere ilişkin benzersiz tanımlayıcıyı veya ETag'i alın. Veriler bu konumda değişirse ETag da değişir. ETag'i PATCH dışında herhangi bir yöntemle 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 başlıkta ETag'ın çağrılması, 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, döndürülen ETag'i bir sonraki PUT veya DELETE isteğinize ekleyin. Örneğimizi takip ederek, sayacı 11'e veya başlangıçta getirilen 10 değerinden 1 daha büyük bir değere güncellemek ve değer artık eşleşmiyorsa isteği 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]'
    
    Verinin değeri belirtilen konumdaysa 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
    
    Başka bir kullanıcının veritabanına yeni bir değer yazması nedeniyle oluşabilecek konum artık ETag ile 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 başarısız yanıtın döndürdüğü 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. Ancak standartlardan aşağıdaki yönlerden farklılık gösterirler:

  • 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 önerse de, Realtime Database yalnızca X-Firebase-ETag başlığını içeren isteklerle ETag'leri döndürür. Bu, standart istekler için fatura maliyetlerini azaltır.

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

Veri Listelerini Kaydetme

Firebase veritabanı referansına eklenen her alt öğe için benzersiz, zaman damgası tabanlı bir anahtar oluşturmak amacıyla bir POST isteği gönderebiliriz. users yollarımız için, her kullanıcının benzersiz bir kullanıcı adı olduğundan kendi anahtarlarımızı tanımlamak 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 amacıyla 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 sahiptir:

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

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

{"name":"-JSOpn9ZC54A4P4RoqVa"}

Verileri Kaldırma

Veritabanından veri kaldırmak için, veriyi 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 gösterilecektir.

URI Parametreleri

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

yetki

auth isteği parametresi , Firebase Gerçek Zamanlı Veritabanı Güvenlik Kuralları tarafından korunan verilere erişime izin verir ve tüm istek türleri tarafından desteklenir. Bağımsız değişken, Firebase uygulama sırrımız veya kullanıcı yetkilendirme bölümünde ele alacağımız bir kimlik doğrulama jetonu olabilir. Aşağıdaki örnekte, auth parametresi ile bir POST isteği gönderiyoruz; burada CREDENTIAL , Firebase uygulama sırrımız veya bir kimlik doğrulama jetonumuzdur:

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

Yazdır

print parametresi veritabanından aldığımız yanıtın formatını belirtmemizi sağlar. İsteğimize print=pretty eklemek, verileri insan tarafından okunabilir bir formatta döndürecektir. 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. Sonuçta elde edilen 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ğerinin türüdür. Örneğin, bir kullanıcı oluşturulduğunda zaman damgasını 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 UNIX döneminden bu yana milisaniye cinsinden geçen süredir.

Yazma Performansını İyileştirme

Veritabanına büyük miktarda veri yazıyorsak yazma performansımızı artırmak 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, sunucu veri alındığında bağlantıyı hemen kapatarak bant genişliği kullanımını azaltır.

Veritabanına çok fazla istekte bulunduğumuz durumlarda, HTTP başlığına 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ı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 denemeye çalışıyor.
  • 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üvenliği 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, isteğin denenmediği anlamına gelir.

Verilerin Güvenliğini Sağlama

Firebase, hangi kullanıcıların verilerimizin farklı düğümlerine okuma ve yazma erişimine sahip olduğunu tanımlamamıza olanak tanıyan bir güvenlik diline sahiptir. Bu konuda daha fazla bilgiyi Gerçek Zamanlı Veritabanı Güvenliği Kurallarında okuyabilirsiniz.

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