Veri Alma

GET ile Veri Okuma

URL uç noktasına bir GET isteği göndererek Firebase veritabanımızdan veri 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, aldığımız verileri içerecektir.

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 Referansına bakın.

yetki

Yetkilendirme isteği parametresi, auth Gerçek Zamanlı Veritabanı Kuralları tarafından korunan verilere erişime izin verir ve tüm istek türleri tarafından desteklenir. Argüman, Firebase Projelerindeki Kullanıcılar bölümünde açıklandığı gibi, Firebase uygulamanızın gizli anahtarı 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 öğesinin belirtilmesi, başarı 204 No Content döndürür.

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

geri aramak

Etki alanları arasında bir web tarayıcısından REST çağrıları yapmak için yanıtı bir JavaScript geri çağırma işlevine sarmak için JSONP'yi kullanabilirsiniz. REST API'nin döndürülen verileri belirttiğiniz geri arama 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 boole) ise, değeri basitçe döndürülecektir. 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. 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ğiniz ve potansiyel olarak büyük bir alt ağaç almak için çok uzun süre beklemek istemediğiniz zaman kullanışlıdır. Gerçek okuma süresi, veri boyutuna ve önbelleğe almaya göre değişebilir.

Aşağıdaki biçimi kullanarak timeouts belirtin: 3ms , 3s veya 3min , bir sayı ve birimle. Belirtilmezse, maksimum 15min timeout uygulanacaktır. timeout pozitif değilse veya maksimumu aşarsa, istek bir HTTP 400 hatasıyla reddedilecektir. 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'de hepimiz dinozorların oldukça havalı olduğunu düşündüğümüzden, verileri nasıl filtreleyebileceğinizi göstermek için örnek bir dinozor gerçekleri veri tabanı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

Bu anahtarı orderBy parametresine ileterek düğümleri ortak bir alt anahtarla 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ıralanır. Verilerin nasıl sıralandığıyla ilgili ayrıntılar için bkz. Veriler Nasıl Sıralanır .

Firebase ayrıca, yalnızca bir düzey alt düzeydeki çocuklar yerine, derinlemesine yuvalanmış çocuklar tarafından sipariş edilen 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
    }
  }
}

Yüksekliği şimdi 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 parametresini birden çok kez kullanmak bir hata verir.

Anahtara göre filtreleme

Ayrıca orderBy="$key" parametresini kullanarak düğümleri anahtarlarına göre filtreleyebiliriz. Aşağıdaki örnek, a ile m arasındaki harfle başlayan bir ada 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

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 skorları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ı almak için aşağıdaki isteği 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, kendileri için 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 saklanan 100'den az mesajımız varsa, her çocuğu alacağız. Ancak, 100'den fazla mesajımız varsa, bu mesajlardan yalnızca 100'ü için veri alacağız. Bunlar limitToFirst kullanıyorsak ilk 100 sıralı mesaj veya limitToFirst kullanıyorsak son 100 sıralı mesaj limitToLast .

Dinozor gerçekleri veri tabanı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 limit sorguları da yapabiliriz. En yüksek puan alan üç dino spor yarışmacısı ile bir lider 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 kullanmak, sorgularımız için keyfi başlangıç ​​ve bitiş noktaları seçmemize olanak tanır. Örneğin, en az üç metre boyundaki tüm dinozorları bulmak orderBy ve startAt birleştirebiliriz:

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

endAt sözlükbilimsel olarak isimleri Pterodactyl'den önce gelen tüm dinozorları bulmak için kullanabiliriz:

curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="$key"&endAt="pterodactyl"&print=pretty'

Sorgumuzun her iki ucunu 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 yararlı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'a eşit veya daha kısa 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 adıyla orderBy kullanıldığında, belirtilen alt anahtarı içeren veriler aşağıdaki gibi sıralanır:

  1. Belirtilen alt anahtar için null değeri olan çocuklar önce gelir.
  2. Ardından, belirtilen alt anahtar için false değeri olan çocuklar gelir. Birden çok alt öğe false değerine sahipse, bunlar anahtara göre sözlükbilimsel olarak sıralanır.
  3. Daha sonra belirtilen alt anahtar için true değerine sahip çocuklar gelir. Birden çok alt öğe true değerine sahipse, bunlar anahtara göre sözlükbilimsel olarak sıralanır.
  4. 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.
  5. Dizeler sayılardan sonra gelir ve sözlükbilimsel 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ükbilimsel olarak sıralanır.
  6. Nesneler en sonda gelir ve artan düzende anahtara göre sözlükbilimsel olarak sıralanır.
Filtrelenen sonuçlar sırasız olarak döndürülür. Verilerinizin sırası önemliyse, uygulamanızdaki sonuçları Firebase'den döndürüldükten sonra sıralamanız gerekir.

orderBy="$key"

Verilerinizi sıralamak için orderBy="$key" parametresini kullanırken, veriler aşağıdaki gibi anahtar bazında artan sırada döndürülecektir. Anahtarların yalnızca dize olabileceğini unutmayın.

  1. 32-bit tamsayı olarak ayrıştırılabilen bir anahtarı olan çocuklar, artan düzende sıralanarak önce gelir.
  2. Anahtar olarak dize değerine sahip çocuklar, sözlükbilimsel 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çütü, belirtilen 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 kullanırken, çocukların sıralaması aşağıdaki gibi öncelik ve anahtarlarına göre 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 sayı olan çocuklar daha sonra gelir. Sayısal olarak önceliğe göre küçükten büyüğe sıralanırlar.
  3. Önceliği ip olan çocuklar en son gelir. Önceliğe göre sözlükbilimsel olarak sıralanırlar.
  4. İki çocuk aynı önceliğe sahip olduğunda (öncelik olmaması dahil), anahtara göre sıralanırlar. Sayısal tuşlar önce 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 / Sunucu Tarafından Gönderilen Olaylar protokolünü destekleyerek, değişiklikleri Firebase veritabanımızda tek bir konuma aktarmayı kolaylaştırır.

Akışa başlamak için aşağıdakileri yapmamız gerekecek:

  1. İstemcinin Kabul Et üstbilgisini text/event-stream olarak ayarlayın
  2. HTTP Yönlendirmelerine, özellikle HTTP durum kodu 307'ye saygı gösterin
  3. Firebase veritabanı konumu okuma izni gerektiriyorsa, auth sorgusu parametresini dahil edin

Buna karşılık, sunucu, istenen URL değişikliklerindeki verilerin durumu olarak 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:

koy JSON kodlu veriler iki anahtarlı bir nesne olacaktır: yol ve veri
Yol, istek URL'sine göre bir konumu işaret ediyor
İstemci, önbelleğindeki o konumdaki tüm verileri mesajda verilen verilerle değiştirmelidir.
yama JSON kodlu veriler iki anahtarlı bir nesne olacaktır: yol ve veri
Yol, istek URL'sine göre bir konumu işaret ediyor
Verideki 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ğin verileri boş, herhangi bir işlem yapılmasına gerek yok
iptal etmek Bu olay için veriler boş
Bu olay, Firebase Gerçek Zamanlı Veritabanı Kuralları, istenen konumda bir okumaya artık izin verilmemesine neden olursa gönderilecektir.
auth_revoked Bu olaya ilişkin veriler, 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 Streaming API'leri etrafında üçüncü taraf bir sarmalayıcı olan Firego'ya bakın.