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