Veri Alma

GET ile Veri Okuma

Firebase veritabanımızdaki verileri, URL uç noktasına bir GET isteği göndererek okuyabiliriz. Önceki bölümdeki blog örneğimize devam edelim ve tüm blog yazısı verilerimizi okuyalım:

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

Başarılı bir istek, 200 OK HTTP durum koduyla gösterilecek ve yanıt, almakta olduğumuz verileri içerecektir.

URI Parametrelerini Ekleme

REST API, Firebase veritabanımızdan veri okurken çeşitli sorgu parametrelerini kabul eder. Aşağıda en sık kullanılan parametreler listelenmiştir. Tam liste için REST API Referansına bakın.

yetki

auth isteği parametresi, Firebase Gerçek Zamanlı Veritabanı Güvenlik Kuralları tarafından 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 sırrı 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 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

Bir web tarayıcısından etki alanları arasında 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ı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 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ğ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. Okuma isteği ayrılan süre içinde tamamlanmazsa HTTP 400 hatasıyla sonlandırılır. Bu, özellikle küçük bir veri aktarımı beklediğinizde ve potansiyel olarak büyük bir alt ağaç 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şebilir.

timeouts şu biçimi kullanarak belirtin: 3ms , 3s veya 3min , bir sayı ve birimle birlikte. Belirtilmediği takdirde maksimum 15min timeout uygulanacaktır. timeout pozitif değilse veya maksimum değeri aşarsa istek, HTTP 400 hatasıyla reddedilir. Aşağıdaki örnekte GET isteği 10 saniyelik bir timeout içermektedir.

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şlangıç ​​olarak, orderBy parametresini kullanarak verilerinizin nasıl filtrelenmesini istediğinizi belirtirsiniz. Daha sonra 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 dinozorlarla ilgili gerçekleri içeren ö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 bir veya daha fazlasıyla birleştirilmelidir: startAt , endAt , limitToFirst , limitToLast veya equalTo .

Belirtilen bir alt anahtara göre filtreleme

Düğümleri ortak bir alt anahtara göre, bu anahtarı orderBy parametresine ileterek 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ıralanacaktır. Verilerin nasıl sıralandığına ilişkin ayrıntılar için bkz. Veriler Nasıl Sıralanır ?

Firebase aynı zamanda yalnızca bir alt düzey alt öğeler yerine derinlemesine iç içe geçmiş alt öğeler tarafından sıralanan sorguları da destekler. Bunun gibi derinlemesine iç içe geçmiş verileriniz varsa bu 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. Aynı istekte orderBy parametresinin birden çok kez kullanılması hataya neden olur.

Anahtara göre filtreleme

Ayrıca orderBy="$key" ​​parametresini kullanarak düğümleri anahtarlarına göre filtreleyebiliriz. Aşağıdaki örnek, a m kadar harflerle başlayan adlara 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

Düğümleri orderBy="$value" parametresini kullanarak alt anahtarlarının değerine göre filtreleyebiliriz. Diyelim ki dinozorlar bir dino spor yarışması düzenliyor ve biz de onların skorlarını aşağıdaki formatta takip ediyoruz:

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

Puanı 50'nin üzerinde olan tüm dinozorları geri almak için aşağıdaki talepte bulunabiliriz:

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

orderBy="$value" kullanılırken null , boolean, string ve nesne değerlerinin nasıl sıralandığı hakkında 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 fazla 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. Eğer 100'lük bir sınır belirlersek, yalnızca 100'e kadar eşleşen çocuğu alacağız. Veritabanımızda kayıtlı 100'den az mesaj varsa her çocuğu alacağız. Ancak 100'den fazla mesajımız varsa, bu mesajların yalnızca 100'üne ilişkin verileri alacağız. Bunlar limitToFirst kullanıyorsak ilk 100 sıralı mesaj veya limitToLast kullanıyorsak son 100 sıralı 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, limitToFirst komutunu 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 sorgulamaları da yapabiliriz. En yüksek puanı alan ilk üç dino sporu yarışmacısından oluşan bir liderlik 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 rastgele başlangıç ​​ve bitiş noktaları seçmemize olanak tanır. Örneğin, en az üç metre boyundaki tüm dinozorları bulmak istiyorsak, orderBy ve startAt birleştirebiliriz:

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

Sözlüksel olarak adları 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 bu tekniklerin tümünü birleştirebiliriz. Örneğin, belki de en sevdiğimiz tür olan Stegosaurus'tan daha kısa veya ona eşit boydaki 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ümde, üç filtreleme parametresinden her birini kullanırken verilerinizin nasıl sıralandığı açıklanmaktadır.

tarafından sipariş

orderBy bir alt anahtarın adıyla kullanırken, belirtilen alt anahtarı içeren veriler şu şekilde sıralanacaktır:

  1. Belirtilen alt anahtar için null değeri olan çocuklar önce gelir.
  2. Daha sonra belirtilen alt anahtar için false değerine sahip çocuklar gelir. Birden fazla çocuğun false değeri varsa, bunlar sözlüksel olarak anahtara göre sıralanır.
  3. Daha sonra belirtilen alt anahtar için true değeri olan çocuklar gelir. Birden fazla çocuğun true değeri varsa, bunlar sözlüksel olarak anahtara göre sıralanır.
  4. Daha sonra sayısal değeri olan çocuklar artan düzende sıralanarak gelir. Birden fazla alt öğe, belirtilen alt düğüm için 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 sözlüksel olarak anahtara göre sıralanır.
  6. Nesneler en sonda gelir ve sözlükbilimsel olarak anahtara göre artan düzende 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 = "$anahtar"

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

  1. 32 bitlik bir tamsayı olarak ayrıştırılabilen bir anahtarı olan çocuklar, artan düzende sıralanarak önce gelir.
  2. Anahtarları dize değeri olan çocuklar daha sonra sözlükbilimsel olarak artan düzende sıralanır.

orderBy = "$değer"

Verilerinizi sıralamak için orderBy="$value" parametresini kullandığınızda, çocuklar değerlerine göre sıralanacaktır. Sıralama kriterleri, belirli 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 kullandığınızda ç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 çocuklar (varsayılan) önce gelir.
  2. Önceliği sayı olan çocuklar ikinci sırada gelir. Küçükten büyüğe, önceliğe göre sayısal olarak sıralanırlar.
  3. Önceliği ip olan çocuklar en sonda gelir. Sözlükbilimsel olarak öncelik sırasına göre sıralanırlar.
  4. İki çocuk aynı önceliğe sahip olduğunda (önceliğin olmaması dahil), anahtara göre sıralanırlar. Önce sayısal tuşlar gelir (sayısal olarak sıralanır), ardından kalan tuşlar gelir (sözlükbilimsel 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 / Sunucudan Gönderilen Olaylar protokolünü destekleyerek, değişikliklerin Firebase veritabanımızdaki tek bir konuma akışını kolaylaştırır.

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

  1. İstemcinin Accept başlığını text/event-stream olarak ayarlayın
  2. HTTP Yönlendirmelerine, özellikle de HTTP durum kodu 307'ye saygı gösterin
  3. Firebase veritabanı konumu okuma izni gerektiriyorsa auth sorgusu parametresini ekleyin

Buna karşılık sunucu, istenen URL'deki verilerin durumu değiştikçe adlandırılmış olayları gönderecektir. 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 anahtara sahip 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 anahtara sahip bir nesne olacaktır: yol ve veri
Yol, istek URL'sine göre bir konuma işaret ediyor
Verilerdeki 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ğe ait veriler boş, herhangi bir işlem yapılmasına gerek yok
iptal etmek Bu etkinliğe ilişkin veriler boş
Firebase Gerçek Zamanlı Veritabanı Güvenliği Kuralları, istenen konumda okumaya artık izin verilmemesine neden olursa bu etkinlik gönderilecektir.
auth_revoked Bu etkinliğe ilişkin veriler, kimlik bilgisinin süresinin dolduğunu belirten bir dizedir
Bu etkinlik, sağlanan kimlik doğrulama 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'lerini çevreleyen üçüncü taraf sarmalayıcı olan Firego'ya göz atın.