Veri Kaydetme

Veri kaydetmenin yolları

KOYMAK fireblog/users/user1/<data> gibi tanımlanmış bir yola verileri 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 veri listesine ekleyin . Bir POST isteği her 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 yazmak

PUT API aracılığıyla temel yazma işlemi konur. Kaydetme verilerini göstermek için yayınlar ve kullanıcılarla bir blog uygulaması oluşturacağız. Uygulamamız için tüm veriler, firebase veritabanı url `https: // docs-examples.firebaseio.com/fireblog '' da` fireblog 'yolunda saklanacaktır.

Firebase veritabanımıza bazı kullanıcı verilerini kaydederek başlayalım. Her kullanıcıyı benzersiz bir kullanıcı adıyla 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ına sahip olacağından, zaten anahtarımız var ve bir tane oluşturmamız gerekmediğinden, POST yerine burada PUT mantıklıdır.

PUT kullanarak Firebase veritabanımıza bir dize, sayı, boolean, dizi veya herhangi bir JSON nesnesi yazabiliriz. Bu durumda buna bir nesne geçireceğ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 çocuk konumlarıyla iç içe geçmiş bir şekilde eşlenir. Yeni oluşturulan düğüme gidersek, "Alan Turing" değerini göreceğiz. Ayrıca verileri doğrudan bir çocuk konumuna 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 ile aynı zamanda yazmak ve bunları çocuk konumlarına ayrı ayrı yazmak - aynı verilerin Firbase veritabanımıza kaydedilmesine neden olacaktır:

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

Başarılı bir talep 200 OK HTTP durum kodu ile belirtilecek ve yanıt veritabanına yazdığımız verileri içerecektir. İlk örnek, verileri izleyen istemciler üzerinde yalnızca bir olayı tetiklerken, ikinci örnek ikisini tetikleyecektir. Kullanıcı yolunda zaten veriler varsa, ilk yaklaşımın üzerine yazacağını belirtmek önemlidir, ancak ikinci yöntemin yalnızca diğer çocukları değişmeden bırakırken her ayrı çocuk düğümünün değerini değiştireceğini belirtmektedir. PUT , JavaScript SDK'mızda set() e eşdeğerdir.

Verilerin yama ile güncellenmesi

Bir PATCH isteği kullanarak, mevcut verilerin üzerine yazmadan belirli çocukları bir yerde güncelleyebiliriz. Turing'in takma adını bir PATCH isteği ile 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 vermiş olsaydık, isteğe dahil olmadıkları için name ve birthday silineceğini unutmayın. Firebase veritabanımızdaki veriler şimdi şö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 talep 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 fazla konumda değerleri güncelleyebileceği anlamına gelir, bu da verilerinizi denormelerine yardımcı olan güçlü bir özellik. Çok yollu güncellemeleri kullanarak, Alan ve 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 takma adları ekledi:

{
  "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. Grace ve Alan'ı bu ş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"
    }
  }
}

Verilerin koşullu isteklerle güncellenmesi

Verileri mevcut durumuna göre güncellemek için işlemlere eşdeğer olan koşullu istekleri kullanabilirsiniz. Örneğin, bir upvote sayacını artırmak istiyorsanız ve sayının birden fazla, eşzamanlı upvotları doğru bir şekilde yansıttığından emin olmak istiyorsanız, yeni değeri sayaç yazmak için koşullu bir istek kullanın. Sayacı aynı sayıya dönüştüren 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 bir istek yapmak için, o konumdaki geçerli veriler veya ETAG için benzersiz tanımlayıcısı alın. Veri bu konumda değişirse, ETAG da değişir. PATCH dışında herhangi bir yöntem içeren bir ETAG isteyebilirsiniz. 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'
    
    Özellikle başlıktaki ETAG'yi çağırmak HTTP yanıtında belirtilen konumun ETAG'sini 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. ETAG değerine özel olarak eşleşen verileri güncellemek için döndürülen ETAG'ı bir sonraki PUT veya DELETE isteğinize ekleyin. Örneğimizden sonra, sayaç 11 veya ilk getirilen değerinden 1 daha büyük 1'e güncellemek için ve değer artık eşleşmezse, 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]'
    
    Belirtilen verilerin değeri ise, Konum hala 10'dur, PUT İstek eşleşmesindeki ETAG ve veritabanına 11 yazarak istek başarılı olur.
    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şmezse, başka bir kullanıcı veritabanına yeni bir değer yazdıysa, istek konuma yazmadan başarısız olur. Dönüş yanıtı yeni değer 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. RealTime 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ğer ve ETAG'ı kullanabilirsiniz.

Dinlenme tabanlı koşullu istekler HTTP IF-Match standardını uygular. Ancak, aşağıdaki yollarla standarttan farklıdırlar:

  • Her bir IF-eşleşme isteği için yalnızca bir ETAG değeri sağlayabilirsiniz, birden fazla değil.
  • Standart, ETAG'ların tüm isteklerle döndürülmesini önerirken, gerçek zamanlı veritabanı yalnızca X-Firebase-ETag üstbilgisi dahil olmak üzere ETAG'ları döndürür. Bu, standart istekler için faturalandırma maliyetlerini azaltır.

Koşullu talepler de tipik dinlenme isteklerinden daha yavaş olabilir.

Veri listelerini kaydetme

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 için, her kullanıcının benzersiz bir kullanıcı adı olduğu için kendi anahtarlarımızı tanımlamak mantıklı geldi. Ancak kullanıcılar uygulamaya blog yayınları eklediğinde, her blog yazısı için bir anahtarı otomatik olarak oluşturmak için bir POST isteği kullanacağız:

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

posts artık aşağıdaki verilere sahiptir:

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

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

{"name":"-JSOpn9ZC54A4P4RoqVa"}

Verileri Kaldırma

Veritabanından verileri kaldırmak için, verileri silmek istediğimiz yolun URL'siyle bir DELETE isteği gönderebiliriz. Aşağıdakiler Alan'ı users siler:

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

Başarılı bir DELETE talebi, JSON null içeren bir yanıtla 200 OK HTTP durum kodu ile belirtilecektir.

URI Parametreleri

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

yetki

auth Talep parametresi, Firebase RealTime Veritabanı Güvenlik Kuralları tarafından korunan verilere erişim sağlar ve tüm istek türleri tarafından desteklenir. Argüman, Firebase App Secret'ımız veya kullanıcı yetkilendirme bölümünde ele alacağımız bir kimlik doğrulama jetonu olabilir. Aşağıdaki örnekte, CREDENTIAL Firebase App Secret'ımız veya kimlik doğrulama jetonumuz olan bir auth parametresi ile bir POST isteği gönderiyoruz:

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 belirtmemizi sağlar. print=pretty ekleme talebimize verileri insan tarafından okunabilir bir formatta döndürür. print=pretty GET , PUT , POST , PATCH ve DELETE İstekleri ile 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 kodu ile gösterilecektir. print=silent GET , PUT , POST ve PATCH İstekleri tarafından desteklenir.

Sunucu Değerleri Yazma

Sunucu değerleri, tek bir ".sv" tuşuna sahip bir nesne olan bir yer tutucu değeri kullanılarak bir yerde 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 UNIX döneminden bu yana milisaniye cinsinden zamandır.

Yazma Performansını İyileştirme

Veritabanına büyük miktarda veri yazıyorsanız, 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 verileri ile yanıt verir. print=silent belirtildiğinde, veri alındıktan sonra sunucu hemen bağlantıyı kapatır ve bant genişliği kullanımını azaltır.

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

Hata Koşulları

Geri kalan 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:

  • Verileri PUT veya POST .
  • PUT POST eksik.
  • Talep, çok büyük veri PUT veya POST çalışır.
  • Geri kalan API çağrısı, yolun bir parçası olarak geçersiz çocuk adları içerir.
  • Geri kalan API çağrı yolu çok uzun.
  • İstek, tanınmayan bir sunucu değeri içerir.
  • Sorgu dizin , Firebase RealTime Veritabanı Güvenlik Kurallarınızda tanımlanmamıştır.
  • İstek, belirtilen sorgu parametrelerinden birini desteklemez.
  • İstek, sorgu parametrelerini sığ bir GET 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 bilgi için hata mesajına bakın.
503 Hizmet Kullanılamıyor Belirtilen Firebase RealTime veritabanı geçici olarak kullanılamıyor, bu da talebin denenmediği anlamına geliyor.

Verilerin Güvenliğini Sağlama

Firebase, hangi kullanıcıların verilerimizin farklı düğümlerine erişimi okuduğunu ve yazdıklarını tanımlamamızı sağlayan bir güvenlik dili vardır. Bunun hakkında daha fazla bilgi için gerçek zamanlı veritabanı güvenlik kurallarında okuyabilirsiniz.

Artık tasarruf verilerini kapsadığımıza göre, bir sonraki bölümdeki diğer API aracılığıyla verilerimizi Firebase veritabanından nasıl alacağımızı öğrenebiliriz.