Veri Alma

GET ile Veri Okuma

URL uç noktasına bir GET isteği göndererek Firebase veritabanımızdaki verileri 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, almakta olduğumuz verileri içerir.

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 Başvurusuna bakın.

yetki

auth request parametresi , Firebase Realtime Database Security Rules tarafından korunan verilere erişim sağlar ve tüm istek türleri tarafından desteklenir. Bağımsız değişken Firebase uygulamanızın gizli anahtarı veya Firebase Projelerindeki Kullanıcılar bölümünde açıklandığı gibi bir kimlik doğrulama belirteci olabilir. Aşağıdaki örnekte, bir auth parametresiyle bir GET isteği gönderiyoruz; burada CREDENTIAL , Firebase uygulamanızın gizli anahtarı 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

Etki alanları arasında bir web tarayıcısından REST çağrıları yapmak için, yanıtı bir JavaScript geri arama işlevine sarmak için JSONP'yi kullanabilirsiniz. REST API'nin, döndürülen verileri belirttiğiniz geri arama işlevinde 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, 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ği ile 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ğinizde ve potansiyel olarak çok büyük bir alt ağacı 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şiklik gösterebilir.

Aşağıdaki biçimi kullanarak timeouts belirtin: 3ms , 3s veya 3min , bir sayı ve bir birim ile. Belirtilmemişse, maksimum 15min timeout uygulanacaktır. timeout pozitif değilse veya maksimumu aşarsa, istek HTTP 400 hatasıyla reddedilir. 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'deki hepimiz dinozorların oldukça havalı olduğunu düşündüğümüzden, verileri nasıl filtreleyebileceğinizi göstermek için dinozor gerçeklerinden oluşan ö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 biri veya daha fazlasıyla birleştirilmelidir: startAt , endAt , limitToFirst , limitToLast veya equalTo .

Belirli bir alt anahtara göre filtreleme

Bu anahtarı orderBy parametresine geçirerek ortak bir alt anahtara göre düğümleri filtreleyebiliriz. Örneğin, boyu 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 tüm düğümler, 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, yalnızca bir alt düzeydeki çocuklar yerine, derinlemesine iç içe geçmiş çocuklar tarafından sıralanan 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
    }
  }
}

Şimdi 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 filtre uygulayabilir. Aynı istekte orderBy parametresinin birden çok kez kullanılması hata verir.

Anahtara göre filtreleme

Ayrıca orderBy="$key" parametresini kullanarak düğümleri anahtarlarına göre filtreleyebiliriz. Aşağıdaki örnek, adı a ile başlayan ve m arasındaki 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 biz onların puanları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ı geri almak için aşağıdaki talebi 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, 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 kayıtlı 100'den az mesajımız varsa, her çocuğu alacağız. Ancak, 100'den fazla mesajımız varsa, bu mesajların yalnızca 100'ü için veri alacağız. Bunlar, limitToFirst kullanıyorsak sıralanan ilk 100 mesaj veya limitToLast kullanıyorsak sıralanan son 100 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, en kısa iki dinozoru limitToFirst kullanarak bulabiliriz:

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

orderBy="$value" ile limit sorguları da yapabiliriz. En yüksek puan alan üç dinozor sporu yarışmacısının yer aldığı bir skor 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 rasgele başlangıç ​​ve bitiş noktaları seçmemize olanak tanır. Örneğin, en az üç metre boyundaki tüm dinozorları bulmak istersek orderBy ve startAt birleştirebiliriz:

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

Sözlüksel olarak isimleri 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 tüm bu teknikleri birleştirebiliriz. Örneğin, en sevdiğimiz tür olan Stegosaurus'tan daha kısa veya ona eşit 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ın 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ğere sahip çocuklar önce gelir.
  2. Ardından, belirtilen alt anahtar için false değerine sahip alt öğeler gelir. Birden fazla alt öğe false değerine sahipse, bunlar sözlüksel olarak anahtara göre sıralanır.
  3. Ardından, belirtilen alt anahtar için true değerine sahip alt öğeler gelir. Birden fazla alt öğe true değerine sahipse, bunlar sözlüksel olarak anahtara göre 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üksel 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üksel olarak sıralanır.
  6. Nesneler en son gelir ve artan düzende anahtara göre sözlüksel olarak 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ükten sonra uygulamanızda sıralamanız gerekir.

orderBy="$anahtar"

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

  1. 32 bitlik bir tamsayı olarak ayrıştırılabilen bir anahtarı olan alt öğeler, artan düzende sıralanarak önce gelir.
  2. Sırada anahtarları dize değeri olan çocuklar gelir ve sözlüksel 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çütleri, belirtilen 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="$priority"

Verilerinizi sıralamak için orderBy="$priority" parametresini kullanırken, ç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.

  1. Önceliği olmayan (varsayılan) çocuklar önce gelir.
  2. Önceliği bir numara olan çocuklar daha sonra gelir. Küçükten büyüğe, önceliğe göre sayısal olarak sıralanırlar.
  3. Önceliği ip olan çocuklar en son gelir. Sözlüksel olarak önceliğe göre sıralanırlar.
  4. İki çocuk aynı önceliğe sahip olduğunda (öncelik olmaması dahil), bunlar anahtara göre sıralanır. Önce sayısal tuşlar 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 / Server-Sent Events protokolünü destekleyerek değişikliklerin Firebase veritabanımızda tek bir konuma akışını kolaylaştırır.

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

  1. İstemcinin Kabul Et başlığını 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 sorgu parametresini dahil edin

Buna karşılık, sunucu, istenen URL'deki verilerin durumu değiştikçe 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:

koymak JSON kodlu veriler, iki anahtarı olan 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 anahtarı olan bir nesne olacaktır: yol ve veri
Yol, istek URL'sine göre bir konuma işaret ediyor
Verilerdeki her anahtar için, müşteri, ö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ı gerekmiyor
iptal etmek Bu etkinliğin verileri boş
Bu olay, Firebase Gerçek Zamanlı Veritabanı Güvenlik Kuralları, istenen konumda okumaya artık izin verilmemesine neden olursa gönderilir.
auth_revoked Bu olayın verileri, bir 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 Akış API'lerini çevreleyen üçüncü taraf bir sarmalayıcı olan Firego'ya göz atın.