GET ile Veri Okuma
URL uç noktasına bir GET
isteği göndererek Firebase veritabanımızdaki verileri okuyabiliriz. Önceki bölümdeki blog örneğimizle devam edelim ve tüm blog gönderisi verilerimizi okuyalım:
curl 'https://docs-examples.firebaseio.com/fireblog/posts.json?print=pretty'
Başarılı bir istek, 200 OK
HTTP durum koduyla belirtilir ve yanıt, almakta olduğumuz verileri içerir.
URI Parametreleri Ekleme
REST API, Firebase veritabanımızdan veri okurken birkaç sorgu parametresini kabul eder. Aşağıda en sık kullanılan parametreler listelenmiştir. Tam liste için REST API Başvurusuna bakın.
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. Bağımsız değişken Firebase uygulamanızın gizli anahtarı veya Firebase Projelerindeki Kullanıcılar bölümünde açıklandığı gibi bir kimlik doğrulama belirteci olabilir. Aşağıdaki örnekte, bir auth
parametresiyle bir GET
isteği gönderiyoruz; burada CREDENTIAL
, Firebase uygulamanızın gizli anahtarı veya bir kimlik doğrulama belirtecidir:
curl 'https://docs-examples.firebaseio.com/auth-example.json?auth=CREDENTIAL'
Yazdır
print=pretty
belirtilmesi, verileri insan tarafından okunabilir bir biçimde döndürür.
curl 'https://docs-examples.firebaseio.com/fireblog/posts.json?print=pretty'
print=silent
belirtilmesi başarı durumunda 204 No Content
döndürür.
curl 'https://docs-examples.firebaseio.com/fireblog/posts.json?print=silent'
geri çağırmak
Etki alanları arasında bir web tarayıcısından REST çağrıları yapmak için, yanıtı bir JavaScript geri arama işlevine sarmak için JSONP'yi kullanabilirsiniz. REST API'nin, döndürülen verileri belirttiğiniz geri arama işlevinde sarması için callback=
ekleyin. Örneğin:
<script> function gotData(data) { console.log(data); } </script> <script src="https://docs-examples.firebaseio.com/fireblog/posts.json?callback=gotData">
sığ
Bu, her şeyi indirmenize gerek kalmadan büyük veri kümeleriyle çalışmanıza yardımcı olmak için tasarlanmış gelişmiş bir özelliktir. Bunu kullanmak için, parametre olarak shallow=true
ekleyin. Bu, döndürülen verilerin derinliğini sınırlayacaktır. Konumdaki veriler bir JSON ilkel (dize, sayı veya boolean) ise, değeri basitçe döndürülür. Konumdaki veri anlık görüntüsü bir JSON nesnesiyse, her anahtarın değerleri true olarak kısaltılır. Örneğin, aşağıdaki verileri kullanarak:
{ "message": { "user": { "name": "Chris" }, "body": "Hello!" } } // A request to /message.json?shallow=true // would return the following: { "user": true, "body": true } // A request to /message/body.json?shallow=true // would simply return: "Hello!"
Bu curl
isteği ile deneyin:
curl 'https://docs-examples.firebaseio.com/rest/retrieving-data.json?shallow=true&print=pretty'
zaman aşımı
Sunucu tarafında okumanın ne kadar süreceğini sınırlamak için bunu kullanın. Bir okuma isteği ayrılan süre içinde bitmezse HTTP 400 hatasıyla sona erer. Bu, özellikle küçük bir veri aktarımı beklediğinizde ve potansiyel olarak çok büyük bir alt ağacı getirmek için çok uzun süre beklemek istemediğinizde kullanışlıdır. Gerçek okuma süresi, veri boyutuna ve önbelleğe almaya bağlı olarak değişiklik gösterebilir.
Aşağıdaki biçimi kullanarak timeouts
belirtin: 3ms
, 3s
veya 3min
, bir sayı ve bir birim ile. Belirtilmemişse, maksimum 15min
timeout
uygulanacaktır. timeout
pozitif değilse veya maksimumu aşarsa, istek HTTP 400 hatasıyla reddedilir. Aşağıdaki örnekte, GET
isteği 10 saniyelik bir timeout
içerir.
curl 'https://docs-examples.firebaseio.com/rest/retrieving-data.json?timeout=10s'
Verileri Filtreleme
Verileri çeşitli faktörlere göre filtrelemek için sorgular oluşturabiliriz. Başlamak için, orderBy
parametresini kullanarak verilerinizin nasıl filtrelenmesini istediğinizi belirtirsiniz. Ardından orderBy
diğer beş parametreden herhangi biriyle birleştirirsiniz: limitToFirst
, limitToLast
, startAt
, endAt
ve equalTo
.
Firebase'deki hepimiz dinozorların oldukça havalı olduğunu düşündüğümüzden, verileri nasıl filtreleyebileceğinizi göstermek için dinozor gerçeklerinden oluşan örnek bir veritabanından bir pasaj kullanacağız:
{ "lambeosaurus": { "height": 2.1, "length": 12.5, "weight": 5000 }, "stegosaurus": { "height": 4, "length": 9, "weight": 2500 } }
Verileri üç yoldan biriyle filtreleyebiliriz: alt anahtara göre, anahtara göre veya değere göre. Bir sorgu bu parametrelerden biriyle başlar ve ardından şu parametrelerden biri veya daha fazlasıyla birleştirilmelidir: startAt
, endAt
, limitToFirst
, limitToLast
veya equalTo
.
Belirli bir alt anahtara göre filtreleme
Bu anahtarı orderBy
parametresine geçirerek ortak bir alt anahtara göre düğümleri filtreleyebiliriz. Örneğin, boyu 3'ten büyük olan tüm dinozorları almak için aşağıdakileri yapabiliriz:
curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="height"&startAt=3&print=pretty'
Filtrelediğimiz alt anahtara sahip olmayan tüm düğümler, null
değeriyle sıralanır. Verilerin nasıl sıralandığıyla ilgili ayrıntılar için bkz. Veriler Nasıl Sıralanır ?
Firebase, yalnızca bir alt düzeydeki çocuklar yerine, derinlemesine iç içe geçmiş çocuklar tarafından sıralanan sorguları da destekler. Bu, aşağıdaki gibi derinlemesine iç içe geçmiş verileriniz varsa kullanışlıdır:
{ "lambeosaurus": { "dimensions": { "height" : 2.1, "length" : 12.5, "weight": 5000 } }, "stegosaurus": { "dimensions": { "height" : 4, "length" : 9, "weight" : 2500 } } }
Şimdi yüksekliği sorgulamak için tek bir anahtar yerine nesnenin tam yolunu kullanıyoruz:
curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="dimensions/height"&startAt=3&print=pretty'
Sorgular aynı anda yalnızca bir anahtara göre filtre uygulayabilir. Aynı istekte orderBy
parametresinin birden çok kez kullanılması hata verir.
Anahtara göre filtreleme
Ayrıca orderBy="$key"
parametresini kullanarak düğümleri anahtarlarına göre filtreleyebiliriz. Aşağıdaki örnek, adı a
ile başlayan ve m
arasındaki tüm dinozorları alır:
curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="$key"&startAt="a"&endAt="m"&print=pretty'
Değere göre filtreleme
orderBy="$value"
parametresini kullanarak düğümleri alt anahtarlarının değerine göre filtreleyebiliriz. Diyelim ki dinozorlar bir dino sporları yarışması düzenliyorlar ve biz onların puanlarını aşağıdaki formatta takip ediyoruz:
{ "scores": { "bruhathkayosaurus": 55, "lambeosaurus": 21, "linhenykus": 80, "pterodactyl": 93, "stegosaurus": 5, "triceratops": 22 } }
Puanı 50'den yüksek olan tüm dinozorları geri almak için aşağıdaki talebi yapabiliriz:
curl 'https://dinosaur-facts.firebaseio.com/scores.json?orderBy="$value"&startAt=50&print=pretty'
orderBy="$value"
kullanılırken null
, boolean, string ve object değerlerinin nasıl sıralandığına ilişkin bir açıklama için Verilerin Nasıl Sıralandığına bakın.
Karmaşık Filtreleme
Daha karmaşık sorgular oluşturmak için birden çok parametreyi birleştirebiliriz.
Sorguları Sınırla
limitToFirst
ve limitToLast
parametreleri, veri alınacak maksimum çocuk sayısını ayarlamak için kullanılır. 100'lük bir sınır belirlersek, yalnızca 100'e kadar eşleşen çocuğu alırız. Veritabanımızda kayıtlı 100'den az mesajımız varsa, her çocuğu alacağız. Ancak, 100'den fazla mesajımız varsa, bu mesajların yalnızca 100'ü için veri alacağız. Bunlar, limitToFirst
kullanıyorsak sıralanan ilk 100 mesaj veya limitToLast
kullanıyorsak sıralanan son 100 mesaj olacaktır.
Dinozor gerçekleri veritabanımızı ve orderBy
kullanarak en ağır iki dinozoru bulabiliriz:
curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="weight"&limitToLast=2&print=pretty'
Benzer şekilde, en kısa iki dinozoru limitToFirst
kullanarak bulabiliriz:
curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="height"&limitToFirst=2&print=pretty'
orderBy="$value"
ile limit sorguları da yapabiliriz. En yüksek puan alan üç dinozor sporu yarışmacısının yer aldığı bir skor tablosu oluşturmak istiyorsak, aşağıdakileri yapabiliriz:
curl 'https://dinosaur-facts.firebaseio.com/scores.json?orderBy="$value"&limitToLast=3&print=pretty'
Aralık Sorguları
startAt
, endAt
ve equalTo
kullanmak, sorgularımız için rasgele başlangıç ve bitiş noktaları seçmemize olanak tanır. Örneğin, en az üç metre boyundaki tüm dinozorları bulmak istersek orderBy
ve startAt
birleştirebiliriz:
curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="height"&startAt=3&print=pretty'
Sözlüksel olarak isimleri Pterodactyl'den önce gelen tüm dinozorları bulmak için endAt
kullanabiliriz:
curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="$key"&endAt="pterodactyl"&print=pretty'
Sorgumuzun her iki ucunu da sınırlamak için startAt
ve endAt
birleştirebiliriz. Aşağıdaki örnek, adı "b" harfiyle başlayan tüm dinozorları bulur:
curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="$key"&startAt="b"&endAt="b\uf8ff"&print=pretty'
Aralık sorguları, verilerinizi sayfalandırmanız gerektiğinde de kullanışlıdır.
Hepsini bir araya koy
Karmaşık sorgular oluşturmak için tüm bu teknikleri birleştirebiliriz. Örneğin, en sevdiğimiz tür olan Stegosaurus'tan daha kısa veya ona eşit olan tüm dinozorların adını bulmak isteyebilirsiniz:
MY_FAV_DINO_HEIGHT=`curl "https://dinosaur-facts.firebaseio.com/dinosaurs/stegosaurus/height.json"` curl "https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy=\"height\"&endAt=${MY_FAV_DINO_HEIGHT}&print=pretty"
Veriler Nasıl Sıralanır?
Bu bölüm, üç filtreleme parametresinin her birini kullanırken verilerinizin nasıl sıralandığını açıklar.
tarafından sipariş
Bir alt anahtarın adıyla orderBy
kullanıldığında, belirtilen alt anahtarı içeren veriler aşağıdaki gibi sıralanır:
- Belirtilen alt anahtar için
null
değere sahip çocuklar önce gelir. - Ardından, belirtilen alt anahtar için
false
değerine sahip alt öğeler gelir. Birden fazla alt öğefalse
değerine sahipse, bunlar sözlüksel olarak anahtara göre sıralanır. - Ardından, belirtilen alt anahtar için
true
değerine sahip alt öğeler gelir. Birden fazla alt öğetrue
değerine sahipse, bunlar sözlüksel olarak anahtara göre sıralanır. - Sayısal değeri olan çocuklar, artan düzende sıralanır. Birden çok alt öğe, belirtilen alt düğüm için aynı sayısal değere sahipse, bunlar anahtara göre sıralanır.
- Dizeler sayılardan sonra gelir ve sözlüksel olarak artan düzende sıralanır. Birden çok alt öğe, belirtilen alt düğüm için aynı değere sahipse, anahtara göre sözlüksel olarak sıralanır.
- Nesneler en son gelir ve artan düzende anahtara göre sözlüksel olarak sıralanır.
orderBy="$anahtar"
Verilerinizi sıralamak için orderBy="$key"
parametresini kullanırken, veriler aşağıdaki gibi anahtara göre artan sırada döndürülecektir. Anahtarların yalnızca dize olabileceğini unutmayın.
- 32 bitlik bir tamsayı olarak ayrıştırılabilen bir anahtarı olan alt öğeler, artan düzende sıralanarak önce gelir.
- Sırada anahtarları dize değeri olan çocuklar gelir ve sözlüksel olarak artan düzende sıralanır.
orderBy="$değer"
Verilerinizi sıralamak için orderBy="$value"
parametresini kullanırken, çocuklar değerlerine göre sıralanır. Sıralama ölçütleri, belirtilen alt anahtarın değeri yerine düğümün değerinin kullanılması dışında, bir alt anahtar tarafından sıralanan verilerle aynıdır.
orderBy="$priority"
Verilerinizi sıralamak için orderBy="$priority"
parametresini kullanırken, çocukların sıralaması önceliklerine ve anahtarlarına göre aşağıdaki gibi belirlenir. Öncelik değerlerinin yalnızca sayı veya dize olabileceğini unutmayın.
- Önceliği olmayan (varsayılan) çocuklar önce gelir.
- Önceliği bir numara olan çocuklar daha sonra gelir. Küçükten büyüğe, önceliğe göre sayısal olarak sıralanırlar.
- Önceliği ip olan çocuklar en son gelir. Sözlüksel olarak önceliğe göre sıralanırlar.
- İki çocuk aynı önceliğe sahip olduğunda (öncelik olmaması dahil), bunlar anahtara göre sıralanır. Önce sayısal tuşlar gelir (sayısal olarak sıralanır), ardından kalan tuşlar gelir (sözlüksel olarak sıralanır).
Öncelikler hakkında daha fazla bilgi için API referansına bakın.
REST API'sinden akış
Firebase REST uç noktaları, EventSource / Server-Sent Events protokolünü destekleyerek değişikliklerin Firebase veritabanımızda tek bir konuma akışını kolaylaştırır.
Akışa başlamak için aşağıdakileri yapmamız gerekecek:
- İstemcinin Kabul Et başlığını
text/event-stream
olarak ayarlayın - HTTP Yönlendirmelerine, özellikle HTTP durum kodu 307'ye saygı gösterin
- Firebase veritabanı konumu okuma izni gerektiriyorsa
auth
sorgu parametresini dahil edin
Buna karşılık, sunucu, istenen URL'deki verilerin durumu değiştikçe adlandırılmış olayları gönderir. Bu mesajların yapısı EventSource protokolüne uygundur:
event: event name data: JSON encoded data payload
Sunucu aşağıdaki olayları gönderebilir:
koymak | JSON kodlu veriler, iki anahtarı olan bir nesne olacaktır: yol ve veri Yol, istek URL'sine göre bir konuma işaret ediyor İstemci, önbelleğindeki o konumdaki tüm verileri mesajda verilen verilerle değiştirmelidir. |
yama | JSON kodlu veriler, iki anahtarı olan bir nesne olacaktır: yol ve veri Yol, istek URL'sine göre bir konuma işaret ediyor Verilerdeki her anahtar için, müşteri, önbelleğindeki karşılık gelen anahtarı, mesajdaki o anahtarın verileriyle değiştirmelidir. |
hayatta kal | Bu etkinliğin verileri boş, herhangi bir işlem yapılması gerekmiyor |
iptal etmek | Bu etkinliğin verileri boş Bu olay, Firebase Gerçek Zamanlı Veritabanı Güvenlik Kuralları, istenen konumda okumaya artık izin verilmemesine neden olursa gönderilir. |
auth_revoked | Bu olayın verileri, bir kimlik bilgisinin süresinin dolduğunu gösteren bir dizedir. Bu olay, sağlanan auth parametresi artık geçerli olmadığında gönderilecek |
Aşağıda, sunucunun gönderebileceği bir dizi olay örneği verilmiştir:
// Set your entire cache to {"a": 1, "b": 2} event: put data: {"path": "/", "data": {"a": 1, "b": 2}} // Put the new data in your cache under the key 'c', so that the complete cache now looks like: // {"a": 1, "b": 2, "c": {"foo": true, "bar": false}} event: put data: {"path": "/c", "data": {"foo": true, "bar": false}} // For each key in the data, update (or add) the corresponding key in your cache at path /c, // for a final cache of: {"a": 1, "b": 2, "c": {"foo": 3, "bar": false, "baz": 4}} event: patch data: {"path": "/c", "data": {"foo": 3, "baz": 4}}
Go kullanıyorsanız, Firebase REST ve Akış API'lerini çevreleyen üçüncü taraf bir sarmalayıcı olan Firego'ya göz atın.