GET ile Veri Okuma
URL uç noktasına GET
isteği göndererek Firebase veritabanımızdaki verileri okuyabiliriz. Önceki bölümde verdiğimiz blog örneğine devam edelim ve tüm blog yayını 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, aldığımız verileri içerir.
URI parametreleri ekleme
REST API, Firebase veritabanımızdan veri okurken çeşitli sorgu parametrelerini kabul eder. En sık kullanılan parametreler aşağıda listelenmiştir. Tam liste için REST API Referansı'na bakın.
auth
auth
istek parametresi, Firebase Realtime Database Security Rules ile 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 gizli anahtarı veya bir kimlik doğrulama jetonu olabilir. Aşağıdaki örnekte, GET
isteğini auth
parametresiyle gönderiyoruz. Burada CREDENTIAL
, Firebase uygulamanızın gizli anahtarı veya bir kimlik doğrulama jetonudur:
curl 'https://docs-examples.firebaseio.com/auth-example.json?auth=CREDENTIAL'
yazdır
print=pretty
belirtildiğinde veriler, insanlar tarafından okunabilecek bir biçimde döndürülür.
curl 'https://docs-examples.firebaseio.com/fireblog/posts.json?print=pretty'
print=silent
belirtildiğinde başarı durumunda 204 No Content
döndürülür.
curl 'https://docs-examples.firebaseio.com/fireblog/posts.json?print=silent'
callback
Alanlar arası bir web tarayıcısından 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ı 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 gelişmiş özellik, her şeyi indirmenize gerek kalmadan büyük veri kümeleriyle çalışmanıza yardımcı olmak için tasarlanmıştır. Bu işlevi kullanmak için shallow=true
parametresini ekleyin. Bu, döndürülen verilerin derinliğini sınırlar. Konumdaki veriler bir JSON ilkeliyse (dize, sayı veya boole) değeri olduğu gibi 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!"
Şu curl
isteğiyle deneyin:
curl 'https://docs-examples.firebaseio.com/rest/retrieving-data.json?shallow=true&print=pretty'
zaman aşımı
Bu parametre, sunucu tarafında okuma işleminin ne kadar süreceğini sınırlamak için kullanılır. Okuma isteği ayrılan süre içinde tamamlanmazsa HTTP 400 hatasıyla sonlandırılır. Bu özellik, özellikle küçük bir veri aktarımı beklediğiniz ve potansiyel olarak büyük bir alt ağacı getirmek için çok uzun süre beklemek istemediğiniz durumlarda yararlıdır. Gerçek okuma süresi, veri boyutuna ve önbelleğe alma işlemine bağlı olarak değişebilir.
timeouts
değerini şu biçimde belirtin: 3ms
,
3s
veya 3min
, bir sayı ve birimle. Belirtilmezse 15min
için maksimum timeout
değeri uygulanır. timeout
değeri pozitif değilse veya maksimum değeri aşıyorsa istek, HTTP 400 hatasıyla reddedilir.
Aşağıdaki örnekte, GET
isteği 10 saniyelik bir timeout
içeriyor.
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
ile diğer beş parametreden herhangi birini birleştirirsiniz:
limitToFirst
, limitToLast
, startAt
, endAt
ve equalTo
.
Firebase'deki herkes dinozorların çok havalı olduğunu düşündüğünden, verileri nasıl filtreleyebileceğinizi göstermek için dinozorlarla ilgili bilgilerin yer aldığı örnek bir veritabanından bir snippet kullanacağız:
{ "lambeosaurus": { "height": 2.1, "length": 12.5, "weight": 5000 }, "stegosaurus": { "height": 4, "length": 9, "weight": 2500 } }
Verileri üç şekilde filtreleyebiliriz: Alt anahtara, anahtara 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
.
Belirtilen bir alt anahtara göre filtreleme
Bu anahtarı orderBy
parametresine ileterek düğümleri ortak bir alt anahtara göre filtreleyebiliriz. Örneğin, yüksekliği 3'ten fazla 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 Veriler Nasıl Sıralanır? başlıklı makaleyi inceleyin.
Firebase, yalnızca bir düzey aşağıda olan alt öğeler yerine, derinlemesine iç içe yerleştirilmiş alt öğelere göre sıralanmış sorguları da destekler. Bu, aşağıdaki gibi derin iç içe yerleştirilmiş verileriniz varsa kullanışlıdır:
{ "lambeosaurus": { "dimensions": { "height" : 2.1, "length" : 12.5, "weight": 5000 } }, "stegosaurus": { "dimensions": { "height" : 4, "length" : 9, "weight" : 2500 } } }
Yüksekliği hemen sorgulamak için tek bir anahtar yerine nesnenin tam yolunu kullanırız:
curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="dimensions/height"&startAt=3&print=pretty'
Sorgular aynı anda yalnızca bir anahtara göre filtreleyebilir. Aynı istekte orderBy
parametresini birden fazla kez kullanmak hataya neden olur.
Anahtara göre filtreleme
orderBy="$key"
parametresini kullanarak düğümleri anahtarlarına göre de filtreleyebiliriz. Aşağıdaki örnek, adı a
ile m
harfleri arasında başlayan 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. Dinozorların dino spor yarışması yaptığını ve skorlarını aşağıdaki biçimde takip ettiğimizi varsayalım:
{ "scores": { "bruhathkayosaurus": 55, "lambeosaurus": 21, "linhenykus": 80, "pterodactyl": 93, "stegosaurus": 5, "triceratops": 22 } }
50'den yüksek puana sahip tüm dinozorları almak için aşağıdaki isteği gönderebiliriz:
curl 'https://dinosaur-facts.firebaseio.com/scores.json?orderBy="$value"&startAt=50&print=pretty'
null
, boole, dize ve nesne değerlerinin orderBy="$value"
kullanılırken nasıl sıralandığıyla ilgili açıklama için Veriler Nasıl Sıralanır? başlıklı makaleyi inceleyin.
Karmaşık Filtreleme
Daha karmaşık sorgular oluşturmak için birden fazla parametreyi birleştirebiliriz.
Sorguları Sınırlama
limitToFirst
ve limitToLast
parametreleri, veri alınacak maksimum alt öğe sayısını ayarlamak için kullanılır. 100 sınırı belirlersek yalnızca 100 eşleşen çocuk alırız. Veritabanımızda 100'den az mesaj varsa her alt öğeyi alırız. Ancak 100'den fazla mesajımız varsa bu mesajların yalnızca 100 tanesiyle ilgili verileri alırız. limitToFirst
kullanıyorsak bu iletiler, sıralı ilk 100 ileti, limitToLast
kullanıyorsak sıralı son 100 ileti olur.
Dinozorlarla ilgili gerçekler 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
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 sınırlama sorguları da yapabiliriz. En yüksek puanı alan ilk üç dino sporcusunun yer aldığı bir skor tablosu oluşturmak istiyorsak şunları yapabiliriz:
curl 'https://dinosaur-facts.firebaseio.com/scores.json?orderBy="$value"&limitToLast=3&print=pretty'
Aralık Sorguları
startAt
, endAt
ve equalTo
özelliklerini kullanarak sorgularımız için rastgele başlangıç ve bitiş noktaları seçebiliriz. Örneğin, en az üç metre boyunda olan tüm dinozorları bulmak istiyorsak orderBy
ve startAt
öğelerini birleştirebiliriz:
curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="height"&startAt=3&print=pretty'
Adı Pterodactyl'den önce gelen tüm dinozorları sözlük sırasına göre 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
öğelerini birleştirebiliriz.
Aşağıdaki örnekte, adı "b" harfiyle başlayan tüm dinozorlar bulunur:
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 yararlıdır.
Tüm unsurların birleşimi
Karmaşık sorgular oluşturmak için bu tekniklerin tümünü birleştirebiliriz. Örneğin, en sevdiğimiz tür olan Stegosaurus ile aynı boyda veya daha kısa olan tüm dinozorların adını bulmak istiyor olabilirsiniz:
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 parametresinin her biri kullanılırken verilerinizin nasıl sıralandığı açıklanmaktadır.
orderBy
orderBy
işaretiyle alt anahtar adı kullanıldığında, belirtilen alt anahtarı içeren veriler aşağıdaki gibi sıralanır:
-
Belirtilen çocuk anahtarı için
null
değeri olan çocuklar önce gelir. -
Belirtilen alt anahtar için
false
değerine sahip alt öğeler bir sonraki sırada yer alır. Birden fazla alt öğefalse
değerine sahipse anahtara göre sözlük sırasına göre sıralanır. -
Belirtilen alt anahtar için
true
değerine sahip alt öğeler bir sonraki sırada yer alır. Birden fazla alt öğenin değeritrue
ise bunlar anahtara göre sözlük sırasına göre sıralanır. - Sayısal değere sahip çocuklar, artan düzende sıralanarak gösterilir. Belirtilen alt düğüm için birden fazla alt öğe 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 anahtara göre sözlük sırasına göre sıralanır.
- Nesneler en sona gelir ve anahtara göre sözlük sıralamasıyla artan düzende sıralanır.
orderBy="$key"
Verilerinizi sıralamak için orderBy="$key"
parametresini kullandığınızda veriler, anahtara göre artan düzende aşağıdaki gibi döndürülür. Anahtarların yalnızca dizeler olabileceğini unutmayın.
- 32 bitlik bir tam sayı olarak ayrıştırılabilen anahtara sahip çocuklar, artan sırada olacak şekilde önce gelir.
- Anahtarı dize değeri olan çocuklar, sözlük sıralamasına göre artan sırada yer alır.
orderBy="$value"
Verilerinizi sıralamak için orderBy="$value"
parametresini kullandığınızda alt öğeler değerlerine göre sıralanır. Sıralama ölçütleri, belirtilen bir alt anahtarın değeri yerine düğümün değeri kullanılması dışında, alt anahtara göre sıralanan verilerle aynıdır.
orderBy="$priority"
Verilerinizi sıralamak için orderBy="$priority"
parametresini kullanırken alt öğelerin sıralaması, önceliklerine ve anahtarlarına göre aşağıdaki şekilde belirlenir. Öncelik değerlerinin yalnızca sayı veya dize olabileceğini unutmayın.
- Önceliği olmayan çocuklar (varsayılan) ilk sıradadır.
- Öncelik olarak sayı belirten çocuklar bir sonraki sırada yer alır. Bunlar önceliğe göre küçükten büyüğe doğru sayısal olarak sıralanır.
- Önceliği dize olan çocuklar en son gelir. Bunlar önceliğe göre sözlük sırasına göre sıralanır.
- İki alt öğe aynı önceliğe sahip olduğunda (öncelik olmaması da dahil) anahtara göre sıralanır. Önce sayısal anahtarlar (sayısal olarak sıralanır), ardından kalan anahtarlar (sözlük sırasına göre sıralanır) gelir.
Öncelikler hakkında daha fazla bilgi için API referansı'na bakın.
REST API'den yayın yapma
Firebase REST uç noktaları, EventSource / Server-Sent Events protokolünü destekler. Bu sayede, Firebase veritabanımızdaki tek bir konumda yapılan değişiklikleri kolayca yayınlayabilirsiniz.
Yayın yapmaya başlamak için aşağıdakileri yapmamız gerekir:
-
İstemcinin Accept üstbilgisini
text/event-stream
olarak ayarlayın. - HTTP yönlendirmelerine (özellikle HTTP durum kodu 307) uyun.
-
Firebase veritabanı konumunun okunması için izin gerekiyorsa
auth
sorgu parametresini ekleyin.
Buna karşılık sunucu, istenen URL'deki verilerin durumu değiştiğinde adlandırılmış etkinlikleri gönderir. Bu mesajların yapısı, EventSource protokolüne uygundur:
event: event name data: JSON encoded data payload
Sunucu aşağıdaki etkinlikleri gönderebilir:
koy | JSON kodlu veriler, iki anahtarı olan bir nesne olur: path ve data path, istek URL'sine göre bir konumu gösterir İstemci, önbelleğindeki bu konumdaki tüm verileri iletide verilen verilerle değiştirmelidir. |
patch | JSON kodlu veriler, iki anahtarı olan bir nesne olacaktır: yol ve veri Yol, istek URL'sine göre bir konumu gösterir Verilerdeki her anahtar için istemci, önbelleğindeki ilgili anahtarı iletideki anahtarın verileriyle değiştirmelidir. |
keep-alive | Bu etkinliğin verileri boş olduğundan herhangi bir işlem yapmanız gerekmez. |
iptal etmek | Bu etkinliğin verileri boş Bu etkinlik, Firebase Realtime Database Security Rules istenen konumda okuma işlemine artık izin verilmemesine neden olursa gönderilir. |
auth_revoked | Bu etkinliğin verileri, kimlik bilgilerinin süresinin dolduğunu belirten bir dizedir. Bu etkinlik, sağlanan auth parametresi artık geçerli olmadığında gönderilir. |
Aşağıda, sunucunun gönderebileceği bir etkinlik grubu ö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'leri için üçüncü taraf sarmalayıcı olan Firego'ya göz atın.