Veri Alma

GET ile Verileri Okuma

URL uç noktasına GET isteği göndererek Firebase veritabanımızdaki verileri okuyabiliriz. Önceki bölümdeki blog örneğimize devam edelim ve tüm blog yayını verilerini 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şmenize olanak tanır ve tüm istek türleri tarafından desteklenir. Bağımsız değişken, Firebase Projelerindeki Kullanıcılar başlıklı makalede açıklandığı gibi Firebase uygulamanızın gizli anahtarı veya bir kimlik doğrulama jetonu olabilir. Aşağıdaki örnekte, CREDENTIAL'nin Firebase uygulamanızın gizlisi veya kimlik doğrulama jetonu olduğu bir auth parametresi içeren bir GET isteği gönderiyoruz:

curl 'https://docs-examples.firebaseio.com/auth-example.json?auth=CREDENTIAL'

yazdır

print=pretty değerinin belirtilmesi, verileri kullanıcılar tarafından okunabilen bir biçimde döndürür.

curl 'https://docs-examples.firebaseio.com/fireblog/posts.json?print=pretty'

print=silent belirtildiğinde başarılı bir 204 No Content döndürülür.

curl 'https://docs-examples.firebaseio.com/fireblog/posts.json?print=silent'

geri çağırma

Web tarayıcısında farklı alan adları arasında REST çağrıları yapmak için yanıtı bir JavaScript geri çağırma işlevine sarmalamak üzere JSONP'yi kullanabilirsiniz. REST API'nin döndürülen verileri belirttiğiniz geri çağırma işlevinde sarmalaması için callback= değerini 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. Bu özelliği kullanmak için parametre olarak shallow=true ekleyin. Bu durumda döndürülen verilerin derinliği sınırlanır. Konumdaki veriler bir JSON temel öğesiyse (dize, sayı veya boole) değerin değeri 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 deneyebilirsiniz:

curl 'https://docs-examples.firebaseio.com/rest/retrieving-data.json?shallow=true&print=pretty'

zaman aşımı

Sunucu tarafında okuma işleminin ne kadar süreceğini sınırlamak için bunu kullanın. Bir okuma isteği, ayrılan süre içinde tamamlanmazsa HTTP 400 hatasıyla sonlandırılır. Bu seçenek, özellikle küçük bir veri aktarımı beklediğinizde ve büyük olabilecek bir alt ağacı almak için çok uzun süre beklemek istemediğinizde yararlıdır. Gerçek okuma süresi, veri boyutuna ve önbelleğe alma işlemine göre değişiklik gösterebilir.

timeouts değerini şu biçimi kullanarak belirtin: 3ms, 3s veya 3min, sayı ve birim içerecek şekilde. Belirtilmezse maksimum timeout (15min) uygulanır. timeout 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'ü 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üşünürüz. Bu nedenle, verileri nasıl filtreleyebileceğinizi göstermek için dinozorlarla ilgili örnek bir veritabanından alınan bir snippet'i kullanacağız:

{
  "lambeosaurus": {
    "height": 2.1,
    "length": 12.5,
    "weight": 5000
  },
  "stegosaurus": {
    "height": 4,
    "length": 9,
    "weight": 2500
  }
}

Verileri şu üç yöntemden biriyle filtreleyebiliriz: alt anahtara, anahtara veya değer'e göre. Sorgu bu parametrelerden biriyle başlar ve ardından aşağıdaki parametrelerden biriyle veya daha fazlasıyla birleştirilmelidir: startAt, endAt, limitToFirst, limitToLast veya equalTo.

Belirtilen bir alt öğe anahtarına göre filtreleme

Ortak bir alt anahtarı orderBy parametresine ileterek düğümleri filtreleyebiliriz. Örneğin, yüksekliği 3'ten büyük olan tüm dinozorları almak için şunları yapabiliriz:

curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="height"&startAt=3&print=pretty'

Filtre uyguladığımız alt anahtara sahip olmayan tüm düğümler, null değerine göre sıralanır. Verilerin nasıl sıralandığıyla ilgili ayrıntılı bilgi için Verilerin Sıralama Yöntemi başlıklı makaleyi inceleyin.

Firebase, yalnızca bir düzey aşağıda olan alt öğeler yerine derin iç içe yerleştirilmiş alt öğelere göre sıralanan 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
    }
  }
}

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. orderBy parametresinin aynı istekte birden çok kez kullanılması hataya neden olur.

Anahtara göre filtreleme

orderBy="$key" parametresini kullanarak düğümleri anahtarlarına göre de filtreleyebiliriz. Aşağıdaki örnekte, adları a ile m arasında bir harfle başlayan tüm dinozorlar alını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 bir dino spor yarışması yaptığını ve puanlarını aşağıdaki biçimde takip ettiğimizi varsayalım:

{
  "scores": {
    "bruhathkayosaurus": 55,
    "lambeosaurus": 21,
    "linhenykus": 80,
    "pterodactyl": 93,
    "stegosaurus": 5,
    "triceratops": 22
  }
}

Puanı 50'den yüksek olan tüm dinozorları almak için aşağıdaki talebi gönderebiliriz:

curl 'https://dinosaur-facts.firebaseio.com/scores.json?orderBy="$value"&startAt=50&print=pretty'

orderBy="$value" kullanılırken null, boole, dize ve nesne değerlerinin nasıl sıralandığıyla ilgili açıklama için Verilerin Sıralama Şekli başlıklı makaleyi inceleyin.

Karmaşık Filtreleme

Daha karmaşık sorgular oluşturmak için birden fazla parametreyi birleştirebiliriz.

Sınır Sorguları

limitToFirst ve limitToLast parametreleri, veri alınacak maksimum alt öğe sayısını belirlemek için kullanılır. 100 olarak bir sınır belirlersek yalnızca 100 eşleşen alt öğe alırız. Veritabanında 100'den az mesaj varsa her çocuğu alırız. Ancak 100'den fazla mesajımız varsa bu mesajların yalnızca 100'ü için veri alırız. Bunlar, limitToFirst kullanıyorsak sıralanmış ilk 100 mesaj veya limitToLast kullanıyorsak sıralanmış son 100 mesaj olacaktır.

Dinozorlarla ilgili bilgiler 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 da bulabiliyoruz:

curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="height"&limitToFirst=2&print=pretty'

Ayrıca orderBy="$value" ile sınır sorgusu gerçekleştirebiliriz. En çok puan alan ilk üç dino spor yarışmacısını içeren bir skor tablosu oluşturmak istersek 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'yi kullanmak, sorgularımız için keyfi başlangıç ve bitiş noktaları seçmemize olanak tanır. Örneğin, en az üç metre boyunda olan tüm dinozorları bulmak isteseydik orderBy ve startAt özelliklerini birleştirebiliriz:

curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="height"&startAt=3&print=pretty'

Adları alfabetik olarak Pterodactyl'ten ö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 örnekte, adı "b" harfi ile 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 sayfalara ayı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, yüksekliği en sevdiğimiz tür olan Stegosaurus'a eşit veya bundan kısa olan tüm dinozorların adları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 parametresinin her biri kullanıldığında verilerinizin nasıl sıralandığı açıklanmaktadır.

orderBy

orderBy, bir alt anahtar adıyla kullanıldığında, belirtilen alt anahtarı içeren veriler aşağıdaki gibi sıralanır:

  1. Belirtilen alt anahtarda null değerine sahip olan alt öğeler önce gelir.
  2. Belirtilen alt anahtar için false değerine sahip olan alt öğeler ardından gelir. Birden fazla çocuğun değeri false ise anahtara göre alfabetik olarak sıralanır.
  3. Ardından, belirtilen alt anahtar için true değerine sahip alt öğeler gelir. Birden fazla alt öğenin değeri true ise bu öğeler anahtara göre alfabetik olarak sıralanır.
  4. Ardından, sayısal değere sahip alt öğeler artan düzende sıralanır. Birden fazla alt öğe, belirtilen alt öğe düğümü için aynı sayısal değere sahipse anahtara göre sıralanır.
  5. Dizelerin sıralaması, sayılardan sonra alfabetik olarak artan düzendedir. Belirtilen alt düğüm için birden fazla alt öğenin değeri aynıysa bu öğeler anahtara göre alfabetik olarak sıralanır.
  6. Nesneler en sona gelir ve anahtara göre artan düzende alfabetik olarak sıralanır.
Filtrelenen sonuçlar sırasız olarak döndürülür. Verilerinizin sırası önemliyse Firebase'den döndürüldükten sonra uygulamanızdaki sonuçları sıralamanız gerekir.

orderBy="$key"

Verilerinizi sıralamak için orderBy="$key" parametresi kullanıldığında veriler, aşağıdaki gibi anahtara göre artan düzende döndürülür. Anahtarların yalnızca dize olabileceğini unutmayın.

  1. 32 bitlik tam sayı olarak ayrıştırılabilen bir anahtara sahip alt öğeler önce gelir ve artan düzende sıralanır.
  2. Anahtarı dize değeri olan alt öğeler, artan sözlük sırasına göre dizilir.

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 alt anahtarın değeri yerine düğümün değeri kullanıldığı dışında bir alt anahtara göre sıralanan verilerle aynıdır.

OrderBy="$öncelik"

Verilerinizi sıralamak için orderBy="$priority" parametresini kullandığınızda, 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) önce gelir.
  2. Önceliği telefon numarası olan çocuklar gelir. Öncelik sırasına göre küçükten büyüğe doğru sayısal olarak sıralanır.
  3. Önceliği dize olan çocuklar en son gelir. Öncelik sırasına göre alfabetik olarak sıralanır.
  4. İki alt öğe aynı önceliğe sahip olduğunda (öncelik yok dahil) anahtara göre sıralanır. Önce sayısal anahtarlar (sayısal olarak sıralanır), ardından kalan anahtarlar (alfabetik olarak sıralanır) gelir.

Öncelikler hakkında daha fazla bilgi için API referansı bölümüne bakın.

REST API'den akış

Firebase REST uç noktaları, EventSource / Server-Sent Events (Etkinlik Kaynağı / Sunucu Tarafından Gönderilen Etkinlikler) protokolünü desteklediğinden, değişikliklerin Firebase veritabanımızdaki tek bir konuma uygulanmasını kolaylaştırır.

Akış özelliğini kullanmaya başlamak için aşağıdakileri yapmamız gerekir:

  1. Müşterinin Kabul et başlığını text/event-stream olarak ayarlayın
  2. Özellikle HTTP durum kodu 307 olmak üzere HTTP yönlendirmelerine uyma
  3. Firebase veritabanı konumu için okuma izni gerekiyorsa auth sorgu parametresini ekleyin

Sunucu, istenen URL'deki verilerin durumu değiştikçe adlandırılmış etkinlikler 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 olarak kodlanmış veriler iki anahtara sahip bir nesne olacaktır: yol ve veri
Yol, istek URL'sine göre bir konumu işaret eder
İstemci, önbelleğindeki bu konumdaki tüm verileri mesajda verilen verilerle değiştirmelidir
patch JSON kodlu veriler iki anahtara sahip bir nesne olacaktır: yol ve veri
Yol, istek URL'sine göre bir konumu işaret eder
Verilerdeki her anahtar için istemci, önbelleğindeki ilgili anahtarı mesajdaki ilgili anahtarın verileriyle değiştirmelidir
keep-alive Bu etkinlikle ilgili veriler geçersiz. Herhangi bir işlem yapmanız gerekmez.
iptal etmek Bu etkinliğin verileri null
Firebase Realtime Database Security Rules, istenen konumda okuma işlemine artık izin verilmemesine neden olursa bu etkinlik gönderilir
kimlik doğrulama iptal edildi Bu etkinliğin verileri, kimlik bilgisinin süresinin dolduğunu belirten bir dizedir
Bu etkinlik, sağlanan kimlik doğrulama 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 kapsayan üçüncü taraf sarmalayıcı Firego'yu inceleyin.