Veri Tasarrufu Yöntemleri |
|
---|---|
PUT | fireblog/users/user1/<data> gibi tanımlanmış bir yola veri yazma veya verileri değiştirme |
PATCH | Tüm verileri değiştirmeden, tanımlanmış bir yolun anahtarlarından bazılarını güncelleyin. |
POST | 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İL | Belirtilen Firebase veritabanı referansından verileri kaldırın. |
PUT ile Veri Yazma
REST API üzerinden temel yazma işlemi PUT
'tür. Veri kaydetmeyi göstermek için yayın ve kullanıcı içeren bir blog uygulaması oluşturacağız. Uygulamamıza ait tüm veriler, Firebase veritabanı URL'si olan `https://docs-examples.firebaseio.com/fireblog` adresindeki "fireblog" yolunda depolanır.
Firebase veritabanımıza bazı kullanıcı verilerini kaydederek başlayalım. Her kullanıcıyı benzersiz bir kullanıcı adına göre depolarız. Ayrıca tam adlarını ve doğum tarihlerini de saklarız. Her kullanıcının benzersiz bir kullanıcı adı olacağından, anahtar zaten mevcut olduğundan ve oluşturmamız gerekmediğinden burada POST
yerine PUT
kullanmak mantıklıdır.
PUT
kullanarak Firebase veritabanımıza bir dize, sayı, doğru/yanlış, dizi veya herhangi bir JSON nesnesi yazabiliriz. Bu durumda, 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 iç içe yerleştirilmiş şekilde alt konumlarla eşlenir. Yeni oluşturulan düğüme gidersek "Alan Turing" değerini görürüz. 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 örnekte (değeri bir nesneyle aynı anda yazma ve alt konumlara ayrı ayrı yazma) aynı veriler Firebase veritabanımıza kaydedilir:
{ "users": { "alanisawesome": { "date_of_birth": "June 23, 1912", "full_name": "Alan Turing" } } }
Başarılı bir istek, 200 OK
HTTP durum koduyla gösterilir ve yanıt, veritabanına yazdığımız verileri içerir. İlk örnekte, verileri izleyen istemcilerde yalnızca bir etkinlik tetiklenir. İkinci örnekte ise iki etkinlik tetiklenir. Kullanıcı yolunda zaten veri varsa ilk yaklaşımın bu verilerin üzerine yazacağını, ancak ikinci yöntemin diğer alt öğeleri değiştirmeden yalnızca her ayrı alt öğenin değerini değiştireceğini unutmayın. PUT
, JavaScript SDK'mızdaki set()
ile aynıdır.
PATCH ile verileri güncelleme
PATCH
isteğiyle, mevcut verilerin üzerine yazmadan bir konumdaki belirli çocukları güncelleyebiliriz. Turing'in takma adını bir PATCH
istemesiyle kullanıcı verilerine ekleyelim:
curl -X PATCH -d '{ "nickname": "Alan The Machine" }' \ 'https://docs-examples.firebaseio.com/fireblog/users/alanisawesome.json'
Yukarıdaki istek, name
veya birthday
alt öğelerini silmeden nickname
öğesini alanisawesome
nesnesine yazar. Burada PUT
isteği gönderseydik name
ve birthday
'nin isteğe dahil edilmediği için silineceğini unutmayın. Firebase veritabanımızdaki veriler şu şekilde 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 belirtilir ve yanıt, veritabanına yazılan güncellenmiş verileri içerir.
Firebase, çok yollu güncellemeleri de destekler. Bu, PATCH
'ün artık Firebase veritabanınızdaki birden çok konumdaki değerleri aynı anda güncelleyebileceği anlamına gelir. Bu güçlü özellik, verilerinizi normalleştirmenize yardımcı olur. Çoklu yol güncellemelerini kullanarak hem Alan hem de Grace'e aynı anda takma ad 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" } } }
Yolları dahil ederek nesneleri yazarak güncellemeye çalışmanın farklı bir davranışa neden olacağını unutmayın. Bunun yerine Gülay ve Alişan'ı şu şekilde güncellemeye çalışırsak ne olacağını görelim:
curl -X PATCH -d '{ "alanisawesome": {"nickname": "Alan The Machine"}, "gracehopper": {"nickname": "Amazing Grace"} }' \ 'https://docs-examples.firebaseio.com/fireblog/users.json'
Bu durum, farklı bir davranışa (yani /fireblog/users
düğümünün tamamının üzerine yazılmasına) neden olur:
{ "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 olan koşullu istekleri kullanabilirsiniz. Örneğin, bir olumlu oy sayacını artırmak ve sayının birden fazla eşzamanlı olumlu oyu doğru şekilde yansıttığından emin olmak istiyorsanız yeni değeri sayaca yazmak için koşullu istek kullanın. Sayacı aynı sayıya değiştiren iki yazma yerine, yazma isteklerinden biri başarısız olur ve isteği yeni değerle yeniden deneyebilirsiniz.- Bir konumda koşullu istek gerçekleştirmek için söz konusu konumdaki mevcut verilerin benzersiz tanımlayıcısını veya ETag'ını alın. Bu konumdaki veriler değişirse ETag da değişir.
PATCH
dışındaki herhangi bir yöntemle ETag isteğinde bulunabilirsiniz. Aşağıdaki örnekteGET
isteği kullanılmaktadır. Başlıkta ETag'i özel olarak çağırmak, HTTP yanıtında belirtilen konumun ETag'ini döndürür.curl -i 'https://test.example.com/posts/12345/upvotes.json' -H 'X-Firebase-ETag: true'
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
- Belirli bir ETag değeriyle eşleşen verileri güncellemek için döndürülen ETag'ı sonraki
PUT
veyaDELETE
isteğinize ekleyin. Örneğimizi takip ederek sayacı 11'e (veya ilk getirilen 10 değerinden 1 daha büyük bir değere) güncellemek ve değer artık eşleşmezse isteği başarısız kılmak için aşağıdaki kodu kullanın: Belirtilen konumdaki verilerin değeri hâlâ 10 isecurl -iX PUT -d '11' 'https://[PROJECT_ID].firebaseio.com/posts/12345/upvotes.json' -H 'if-match:[ETAG_VALUE]'
PUT
isteğinde ETag eşleşir ve istek başarılı olur. Böylece veritabanına 11 yazılır. Konum artık ETag ile eşleşmiyorsa (başka bir kullanıcı veritabanına yeni bir değer yazdığında bu durum oluşabilir) istek, konuma yazmadan başarısız olur. Döndürülen yanıtta yeni değer ve ETag yer alı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
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
- İsteği yeniden denemeye karar verirseniz yeni bilgileri kullanın. Realtime Database Başarısız olan koşullu istekleri otomatik olarak yeniden denemez. Ancak, yeni değeri ve ETag'ı kullanarak, başarısız yanıt tarafından döndürülen bilgilerle yeni bir koşullu istek oluşturabilirsiniz.
REST tabanlı koşullu istekler, HTTP if-match standardını uygular. Ancak bu raporlar standart raporlardan aşağıdaki yönleriyle ayrılır:
- Her eşleşme varsa isteği için birden fazla değil, yalnızca bir ETag değeri sağlayabilirsiniz.
- Standart, ETags'in tüm isteklerle döndürülmesini önerir ancak Realtime Database yalnızca
X-Firebase-ETag
başlığını içeren isteklerle ETags döndürür. Bu, standart isteklerin faturalandırma maliyetlerini azaltır.
Koşullu istekler, normal REST isteklerinden de daha yavaş olabilir.
Veri Listelerini Kaydetme
Firebase veritabanı referansına eklenen her alt öğe için benzersiz, zaman damgasına dayalı bir anahtar oluşturmak amacıyla POST
isteği gönderebiliriz. users
yolumuz için her kullanıcının benzersiz bir kullanıcı adına sahip olması nedeniyle kendi anahtarlarımızı tanımlamak mantıklıydı. Ancak kullanıcılar uygulamaya blog yayınları eklediğinde her blog yayını 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 verileri içeriyor:
{ "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ğunu unutmayın. Başarılı bir istek, 200 OK
HTTP durum koduyla belirtilir ve yanıtta, eklenen yeni verilerin anahtarı bulunur:
{"name":"-JSOpn9ZC54A4P4RoqVa"}
Verileri kaldırma
Verileri veritabanından kaldırmak için, verilerin silinmesini istediğimiz yolun URL'sini içeren bir DELETE
isteği gönderebiliriz. Aşağıdaki komut, Alan'ı users
yolundan 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österilir.
URI Parametreleri
REST API, veritabanına veri yazarken aşağıdaki URI parametrelerini kabul eder:
auth
auth
istek parametresi, Firebase Realtime Database Security Rules ile korunan verilere erişmenize olanak tanır ve tüm istek türleri tarafından desteklenir. Bu bağımsız değişken, Firebase uygulama gizlimiz veya kullanıcı yetkilendirme bölümünde ele alacağımız bir kimlik doğrulama jetonu olabilir. Aşağıdaki örnekte, CREDENTIAL
'nin Firebase uygulama gizlimiz veya kimlik doğrulama jetonumuz olduğu bir auth
parametresi içeren 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 belirtmemize olanak tanır. İsteğimize print=pretty
ekleyerek verileri insan tarafından okunabilir bir biçimde döndürebiliriz. print=pretty
, GET
, PUT
, POST
, PATCH
ve DELETE
isteklerinde desteklenir.
Veri yazarken sunucudan gelen çıkışı engellemek için isteğimize print=silent
ekleyebiliriz. Sonuç olarak elde edilen yanıt boş olur ve istek başarılıysa 204 No Content
HTTP durum koduyla gösterilir.
print=silent
, GET
, PUT
, POST
ve PATCH
istekleriyle desteklenir.
Sunucu Değerlerini Yazma
Sunucu değerleri, tek bir ".sv"
anahtarına sahip bir nesne olan yer tutucu değer kullanılarak bir yere 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 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 epoch'undan itibaren milisaniye cinsinden süreyi gösterir.
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 sunucu, veriler alındıktan sonra bağlantıyı hemen kapatarak bant genişliği kullanımını azaltır.
Veritabanına çok sayıda istek gönderdiğimiz durumlarda, HTTP başlığında bir Keep-Alive
isteği göndererek HTTPS bağlantısını yeniden kullanabiliriz.
Hata Durumları
REST API, aşağıdaki durumlarda hata kodları döndürür:
HTTP Durum Kodları | |
---|---|
400 Hatalı İstek |
Aşağıdaki hata koşullarından biri:
|
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ürmüştür. Daha fazla ayrıntı için hata mesajına bakın. |
503 Hizmet Kullanılamıyor | Belirtilen Firebase Realtime Database geçici olarak kullanılamıyor. Bu, istek denemesi yapılmadığı anlamına gelir. |
Veri Güvenliği
Firebase'de, verilerinizin farklı düğümlerine hangi kullanıcıların okuma ve yazma erişimi olduğunu tanımlamamıza olanak tanıyan bir güvenlik dili vardır. Bu konu hakkında daha fazla bilgiye Realtime Database Security Rules bölümünden ulaşabilirsiniz.
Verileri kaydetme konusunu ele aldığımıza göre, sonraki bölümde REST API aracılığıyla verileri Firebase veritabanından nasıl alacağımızı öğrenebiliriz.