Veri Alma

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:

  1. Belirtilen çocuk anahtarı için null değeri olan çocuklar önce gelir.
  2. Belirtilen alt anahtar için false değerine sahip alt öğeler bir sonraki sırada yer alır. Birden fazla alt öğe false değerine sahipse anahtara göre sözlük sırasına göre sıralanır.
  3. Belirtilen alt anahtar için true değerine sahip alt öğeler bir sonraki sırada yer alır. Birden fazla alt öğenin değeri true ise bunlar anahtara göre sözlük sırasına göre sıralanır.
  4. 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.
  5. 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.
  6. Nesneler en sona gelir ve anahtara göre sözlük sıralamasıyla artan düzende sıralanır.
Filtrelenen sonuçlar sırasız olarak döndürülür. Verilerinizin sırası önemliyse sonuçları Firebase'den döndürüldükten sonra uygulamanızda sıralamanız gerekir.

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.

  1. 32 bitlik bir tam sayı olarak ayrıştırılabilen anahtara sahip çocuklar, artan sırada olacak şekilde önce gelir.
  2. 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.

  1. Önceliği olmayan çocuklar (varsayılan) ilk sıradadır.
  2. Ö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.
  3. Önceliği dize olan çocuklar en son gelir. Bunlar önceliğe göre sözlük sırasına göre sıralanır.
  4. İ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:

  1. İstemcinin Accept üstbilgisini text/event-stream olarak ayarlayın.
  2. HTTP yönlendirmelerine (özellikle HTTP durum kodu 307) uyun.
  3. 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.