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.- 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 birGET
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
- Döndürülen ETag'i, özellikle bu ETag değeriyle eşleşen verileri güncellemek için bir sonraki
PUT
veyaDELETE
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
- İ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:
|
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.