GET ile Veri Okuma
Firebase veritabanımızdaki verileri, URL uç noktasına bir GET
isteği göndererek okuyabiliriz. Önceki bölümdeki blog örneğimize devam edelim ve tüm blog yazısı verilerimizi okuyalım:
curl 'https://docs-examples.firebaseio.com/fireblog/posts.json?print=pretty'
Başarılı bir istek, 200 OK
HTTP durum koduyla gösterilecek ve yanıt, almakta olduğumuz verileri içerecektir.
URI Parametrelerini Ekleme
REST API, Firebase veritabanımızdan veri okurken çeşitli sorgu parametrelerini kabul eder. Aşağıda en sık kullanılan parametreler listelenmiştir. Tam liste için REST API Referansına bakın.
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 Projelerindeki Kullanıcılar bölümünde açıklandığı gibi, Firebase uygulamanızın sırrı veya bir kimlik doğrulama belirteci olabilir. Aşağıdaki örnekte, auth
parametresiyle bir GET
isteği gönderiyoruz; burada CREDENTIAL
, Firebase uygulamanızın sırrı 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
Bir web tarayıcısından etki alanları arasında REST çağrıları yapmak için, yanıtı bir JavaScript geri çağırma işlevine sarmak üzere JSONP'yi kullanabilirsiniz. REST API'nin döndürülen verileri belirttiğiniz geri çağırma işlevine sarmasını sağlamak 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ğiyle 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. Okuma isteği ayrılan süre içinde tamamlanmazsa HTTP 400 hatasıyla sonlandırılır. Bu, özellikle küçük bir veri aktarımı beklediğinizde ve potansiyel olarak büyük bir alt ağaç 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şebilir.
timeouts
şu biçimi kullanarak belirtin: 3ms
, 3s
veya 3min
, bir sayı ve birimle birlikte. Belirtilmediği takdirde maksimum 15min
timeout
uygulanacaktır. timeout
pozitif değilse veya maksimum değeri aşarsa istek, HTTP 400 hatasıyla reddedilir. Aşağıdaki örnekte GET
isteği 10 saniyelik bir timeout
içermektedir.
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şlangıç olarak, orderBy
parametresini kullanarak verilerinizin nasıl filtrelenmesini istediğinizi belirtirsiniz. Daha sonra orderBy
diğer beş parametreden herhangi biriyle birleştirirsiniz: limitToFirst
, limitToLast
, startAt
, endAt
ve equalTo
.
Firebase'de hepimiz dinozorların oldukça havalı olduğunu düşündüğümüzden, verileri nasıl filtreleyebileceğinizi göstermek için dinozorlarla ilgili gerçekleri içeren ö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 bir veya daha fazlasıyla birleştirilmelidir: startAt
, endAt
, limitToFirst
, limitToLast
veya equalTo
.
Belirtilen bir alt anahtara göre filtreleme
Düğümleri ortak bir alt anahtara göre, bu anahtarı orderBy
parametresine ileterek filtreleyebiliriz. Örneğin yüksekliği 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 herhangi bir düğüm, null
değeriyle sıralanacaktır. Verilerin nasıl sıralandığına ilişkin ayrıntılar için bkz. Veriler Nasıl Sıralanır ?
Firebase aynı zamanda yalnızca bir alt düzey alt öğeler yerine derinlemesine iç içe geçmiş alt öğeler tarafından sıralanan sorguları da destekler. Bunun gibi derinlemesine iç içe geçmiş verileriniz varsa bu kullanışlıdır:
{ "lambeosaurus": { "dimensions": { "height" : 2.1, "length" : 12.5, "weight": 5000 } }, "stegosaurus": { "dimensions": { "height" : 4, "length" : 9, "weight" : 2500 } } }
Artık 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 filtrelenebilir. Aynı istekte orderBy
parametresinin birden çok kez kullanılması hataya neden olur.
Anahtara göre filtreleme
Ayrıca orderBy="$key"
parametresini kullanarak düğümleri anahtarlarına göre filtreleyebiliriz. Aşağıdaki örnek, a
m
kadar harflerle başlayan adlara sahip 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
Düğümleri orderBy="$value"
parametresini kullanarak alt anahtarlarının değerine göre filtreleyebiliriz. Diyelim ki dinozorlar bir dino spor yarışması düzenliyor ve biz de onların skorlarını aşağıdaki formatta takip ediyoruz:
{ "scores": { "bruhathkayosaurus": 55, "lambeosaurus": 21, "linhenykus": 80, "pterodactyl": 93, "stegosaurus": 5, "triceratops": 22 } }
Puanı 50'nin üzerinde olan tüm dinozorları geri almak için aşağıdaki talepte bulunabiliriz:
curl 'https://dinosaur-facts.firebaseio.com/scores.json?orderBy="$value"&startAt=50&print=pretty'
orderBy="$value"
kullanılırken null
, boolean, string ve nesne değerlerinin nasıl sıralandığı hakkında 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 fazla 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. Eğer 100'lük bir sınır belirlersek, yalnızca 100'e kadar eşleşen çocuğu alacağız. Veritabanımızda kayıtlı 100'den az mesaj varsa her çocuğu alacağız. Ancak 100'den fazla mesajımız varsa, bu mesajların yalnızca 100'üne ilişkin verileri alacağız. Bunlar limitToFirst
kullanıyorsak ilk 100 sıralı mesaj veya limitToLast
kullanıyorsak son 100 sıralı 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, limitToFirst
komutunu kullanarak en kısa iki dinozoru bulabiliriz:
curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="height"&limitToFirst=2&print=pretty'
Ayrıca orderBy="$value"
ile limit sorgulamaları da yapabiliriz. En yüksek puanı alan ilk üç dino sporu yarışmacısından oluşan bir liderlik 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 rastgele başlangıç ve bitiş noktaları seçmemize olanak tanır. Örneğin, en az üç metre boyundaki tüm dinozorları bulmak istiyorsak, orderBy
ve startAt
birleştirebiliriz:
curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="height"&startAt=3&print=pretty'
Sözlüksel olarak adları 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 bu tekniklerin tümünü birleştirebiliriz. Örneğin, belki de en sevdiğimiz tür olan Stegosaurus'tan daha kısa veya ona eşit boydaki 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ümde, üç filtreleme parametresinden her birini kullanırken verilerinizin nasıl sıralandığı açıklanmaktadır.
tarafından sipariş
orderBy
bir alt anahtarın adıyla kullanırken, belirtilen alt anahtarı içeren veriler şu şekilde sıralanacaktır:
- Belirtilen alt anahtar için
null
değeri olan çocuklar önce gelir. - Daha sonra belirtilen alt anahtar için
false
değerine sahip çocuklar gelir. Birden fazla çocuğunfalse
değeri varsa, bunlar sözlüksel olarak anahtara göre sıralanır. - Daha sonra belirtilen alt anahtar için
true
değeri olan çocuklar gelir. Birden fazla çocuğuntrue
değeri varsa, bunlar sözlüksel olarak anahtara göre sıralanır. - Daha sonra sayısal değeri olan çocuklar artan düzende sıralanarak gelir. Birden fazla alt öğe, belirtilen alt düğüm için aynı sayısal değere sahipse anahtara göre sıralanır.
- Dizeler sayılardan sonra gelir ve sözlükbilimsel olarak artan düzende sıralanır. Belirtilen alt düğüm için birden fazla alt öğe aynı değere sahipse, bunlar sözlüksel olarak anahtara göre sıralanır.
- Nesneler en sonda gelir ve sözlükbilimsel olarak anahtara göre artan düzende sıralanır.
orderBy = "$anahtar"
Verilerinizi sıralamak için orderBy="$key"
parametresini kullandığınızda veriler aşağıdaki gibi anahtara göre artan sırada döndürülecektir. Anahtarların yalnızca dizeler olabileceğini unutmayın.
- 32 bitlik bir tamsayı olarak ayrıştırılabilen bir anahtarı olan çocuklar, artan düzende sıralanarak önce gelir.
- Anahtarları dize değeri olan çocuklar daha sonra sözlükbilimsel olarak artan düzende sıralanır.
orderBy = "$değer"
Verilerinizi sıralamak için orderBy="$value"
parametresini kullandığınızda, çocuklar değerlerine göre sıralanacaktır. Sıralama kriterleri, belirli bir 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="$öncelik"
Verilerinizi sıralamak için orderBy="$priority"
parametresini kullandığınızda ç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 çocuklar (varsayılan) önce gelir.
- Önceliği sayı olan çocuklar ikinci sırada gelir. Küçükten büyüğe, önceliğe göre sayısal olarak sıralanırlar.
- Önceliği ip olan çocuklar en sonda gelir. Sözlükbilimsel olarak öncelik sırasına göre sıralanırlar.
- İki çocuk aynı önceliğe sahip olduğunda (önceliğin olmaması dahil), anahtara göre sıralanırlar. Önce sayısal tuşlar gelir (sayısal olarak sıralanır), ardından kalan tuşlar gelir (sözlükbilimsel 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 / Sunucudan Gönderilen Olaylar protokolünü destekleyerek, değişikliklerin Firebase veritabanımızdaki tek bir konuma akışını kolaylaştırır.
Akışa başlamak için aşağıdakileri yapmamız gerekecek:
- İstemcinin Accept başlığını
text/event-stream
olarak ayarlayın - HTTP Yönlendirmelerine, özellikle de HTTP durum kodu 307'ye saygı gösterin
- Firebase veritabanı konumu okuma izni gerektiriyorsa
auth
sorgusu parametresini ekleyin
Buna karşılık sunucu, istenen URL'deki verilerin durumu değiştikçe adlandırılmış olayları gönderecektir. 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 anahtara sahip 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 anahtara sahip bir nesne olacaktır: yol ve veri Yol, istek URL'sine göre bir konuma işaret ediyor Verilerdeki her bir anahtar için istemci, önbelleğindeki karşılık gelen anahtarı, mesajdaki o anahtarın verileriyle değiştirmelidir. |
hayatta kal | Bu etkinliğe ait veriler boş, herhangi bir işlem yapılmasına gerek yok |
iptal etmek | Bu etkinliğe ilişkin veriler boş Firebase Gerçek Zamanlı Veritabanı Güvenliği Kuralları, istenen konumda okumaya artık izin verilmemesine neden olursa bu etkinlik gönderilecektir. |
auth_revoked | Bu etkinliğe ilişkin veriler, kimlik bilgisinin süresinin dolduğunu belirten bir dizedir Bu etkinlik, sağlanan kimlik doğrulama 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 Streaming API'lerini çevreleyen üçüncü taraf sarmalayıcı olan Firego'ya göz atın.