Daten werden abgerufen

Daten mit GET lesen

Wir können Daten aus unserer Firebase-Datenbank lesen, indem wir eine GET-Anfrage an den URL-Endpunkt senden. Fahren wir mit dem Blogbeispiel aus dem vorherigen Abschnitt fort und lesen alle Blogpostdaten:

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

Eine erfolgreiche Anfrage wird durch den HTTP-Statuscode 200 OK angezeigt und die Antwort enthält die abgerufenen Daten.

URI-Parameter hinzufügen

Die REST API akzeptiert mehrere Suchparameter, wenn Daten aus unserer Firebase-Datenbank gelesen werden. Im Folgenden finden Sie die am häufigsten verwendeten Parameter. Eine vollständige Liste finden Sie in der REST API-Referenz.

auth

Der Anfrageparameter auth ermöglicht den Zugriff auf Daten, die durch Firebase Realtime Database Security Rules geschützt sind, und wird von allen Anfragetypen unterstützt. Das Argument kann entweder der geheime Schlüssel Ihrer Firebase-App oder ein Authentifizierungstoken sein, wie unter Nutzer in Firebase-Projekten beschrieben. Im folgenden Beispiel senden wir eine GET-Anfrage mit einem auth-Parameter, wobei CREDENTIAL entweder der geheime Schlüssel Ihrer Firebase-App oder ein Authentifizierungstoken ist:

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

ausgeben

Wenn Sie print=pretty angeben, werden die Daten in einem menschenlesbaren Format zurückgegeben.

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

Wenn Sie print=silent angeben, wird bei Erfolg ein 204 No Content zurückgegeben.

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

callback

Wenn Sie REST-Aufrufe von einem Webbrowser über Domains hinweg ausführen möchten, können Sie JSONP verwenden, um die Antwort in eine JavaScript-Callback-Funktion zu verpacken. Fügen Sie callback= hinzu, damit die REST API die zurückgegebenen Daten in die von Ihnen angegebene Callback-Funktion einbindet. Beispiel:

<script>
  function gotData(data) {
    console.log(data);
  }
</script>
<script src="https://docs-examples.firebaseio.com/fireblog/posts.json?callback=gotData">

flach

Dies ist eine erweiterte Funktion, mit der Sie mit großen Datasets arbeiten können, ohne alles herunterladen zu müssen. Fügen Sie shallow=true als Parameter hinzu, um sie zu verwenden. Dadurch wird die Tiefe der zurückgegebenen Daten begrenzt. Wenn die Daten am Speicherort ein JSON-Primitiv (String, Zahl oder boolescher Wert) sind, wird einfach der Wert zurückgegeben. Wenn der Daten-Snapshot am Speicherort ein JSON-Objekt ist, werden die Werte für jeden Schlüssel auf true gekürzt. Beispiel:

{
  "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!"

Probieren Sie es mit dieser curl-Anfrage aus:

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

Zeitüberschreitung

Damit können Sie die Dauer des Lesevorgangs auf der Serverseite begrenzen. Wenn eine Leseanfrage nicht innerhalb der vorgegebenen Zeit abgeschlossen wird, wird sie mit einem HTTP-400-Fehler beendet. Das ist besonders nützlich, wenn Sie eine kleine Datenübertragung erwarten und nicht zu lange warten möchten, um einen potenziell riesigen Unterbaum abzurufen. Die tatsächliche Lesedauer kann je nach Datengröße und Caching variieren.

Geben Sie timeouts im folgenden Format an: 3ms, 3s oder 3min, mit einer Zahl und einer Einheit. Wenn nichts angegeben ist, wird der maximale timeout von 15min angewendet. Wenn der Wert für timeout nicht positiv ist oder das Maximum überschreitet, wird die Anfrage mit einem HTTP-400-Fehler abgelehnt. Im folgenden Beispiel enthält die GET-Anfrage ein timeout von 10 Sekunden.

curl 'https://docs-examples.firebaseio.com/rest/retrieving-data.json?timeout=10s'

Daten filtern

Wir können Abfragen erstellen, um Daten anhand verschiedener Faktoren zu filtern. Zuerst geben Sie mit dem Parameter orderBy an, wie Ihre Daten gefiltert werden sollen. Anschließend kombinieren Sie orderBy mit einem der anderen fünf Parameter: limitToFirst, limitToLast, startAt, endAt und equalTo.

Da wir alle bei Firebase Dinosaurier ziemlich cool finden, verwenden wir ein Snippet aus einer Beispieldatenbank mit Fakten über Dinosaurier, um zu zeigen, wie Sie Daten filtern können:

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

Daten können auf drei Arten gefiltert werden: nach untergeordnetem Schlüssel, nach Schlüssel oder nach Wert. Eine Abfrage beginnt mit einem dieser Parameter und muss dann mit einem oder mehreren der folgenden Parameter kombiniert werden: startAt, endAt, limitToFirst, limitToLast oder equalTo.

Nach einem angegebenen untergeordneten Schlüssel filtern

Wir können Knoten nach einem gemeinsamen untergeordneten Schlüssel filtern, indem wir diesen Schlüssel an den Parameter orderBy übergeben. Wenn Sie beispielsweise alle Dinosaurier mit einer Höhe von mehr als 3 abrufen möchten, können Sie Folgendes tun:

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

Alle Knoten, die nicht den untergeordneten Schlüssel haben, nach dem wir filtern, werden mit dem Wert null sortiert. Weitere Informationen zur Sortierung von Daten finden Sie unter Sortierung von Daten.

Firebase unterstützt auch Abfragen, die nach tief verschachtelten untergeordneten Elementen sortiert sind, und nicht nur nach untergeordneten Elementen, die sich eine Ebene weiter unten befinden. Das ist nützlich, wenn Sie tief verschachtelte Daten wie diese haben:

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

Wenn wir jetzt die Höhe abfragen möchten, verwenden wir den vollständigen Pfad zum Objekt anstelle eines einzelnen Schlüssels:

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

Abfragen können jeweils nur nach einem Schlüssel filtern. Wenn Sie den Parameter orderBy mehrmals in derselben Anfrage verwenden, wird ein Fehler ausgegeben.

Nach Schlüssel filtern

Wir können Knoten auch mit dem Parameter orderBy="$key" nach ihren Schlüsseln filtern. Im folgenden Beispiel werden alle Dinosaurier abgerufen, deren Name mit dem Buchstaben a bis m beginnt:

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

Nach Wert filtern

Mit dem Parameter orderBy="$value" können wir Knoten nach dem Wert ihrer untergeordneten Schlüssel filtern. Angenommen, die Dinosaurier veranstalten einen Sportwettbewerb und wir erfassen ihre Ergebnisse im folgenden Format:

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

Um alle Dinosaurier mit einer Punktzahl von mehr als 50 abzurufen, können wir die folgende Anfrage stellen:

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

Unter So werden Daten sortiert finden Sie eine Erklärung dazu, wie null-, boolesche, String- und Objektwerte bei Verwendung von orderBy="$value" sortiert werden.

Komplexe Filterung

Wir können mehrere Parameter kombinieren, um komplexere Abfragen zu erstellen.

Abfragen begrenzen

Mit den Parametern limitToFirst und limitToLast wird die maximale Anzahl von untergeordneten Elementen festgelegt, für die Daten empfangen werden sollen. Wenn wir ein Limit von 100 festlegen, erhalten wir nur bis zu 100 übereinstimmende untergeordnete Elemente. Wenn weniger als 100 Nachrichten in unserer Datenbank gespeichert sind, erhalten wir alle untergeordneten Elemente. Wenn wir jedoch mehr als 100 Nachrichten haben, erhalten wir nur Daten für 100 dieser Nachrichten. Dies sind die ersten 100 geordneten Nachrichten, wenn wir limitToFirst verwenden, oder die letzten 100 geordneten Nachrichten, wenn wir limitToLast verwenden.

Mithilfe unserer Datenbank mit Dinosaurierfakten und orderBy können wir die beiden schwersten Dinosaurier finden:

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

Auf ähnliche Weise können wir die beiden kleinsten Dinosaurier mit limitToFirst finden:

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

Wir können auch Limit-Abfragen mit orderBy="$value" durchführen. Wenn wir eine Bestenliste mit den drei besten Dino-Sportlern erstellen möchten, können wir so vorgehen:

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

Bereichsabfragen

Mit startAt, endAt und equalTo können wir beliebige Start- und Endpunkte für unsere Abfragen auswählen. Wenn wir beispielsweise alle Dinosaurier finden möchten, die mindestens drei Meter groß sind, können wir orderBy und startAt kombinieren:

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

Mit endAt können wir alle Dinosaurier finden, deren Namen lexikografisch vor Pterodactyl stehen:

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

Wir können startAt und endAt kombinieren, um beide Enden unserer Abfrage zu begrenzen. Im folgenden Beispiel werden alle Dinosaurier gefunden, deren Name mit dem Buchstaben „b“ beginnt:

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

Bereichsabfragen sind auch nützlich, wenn Sie Ihre Daten paginieren müssen.

Zusammenfassung

Wir können alle diese Techniken kombinieren, um komplexe Abfragen zu erstellen. Vielleicht möchten Sie beispielsweise die Namen aller Dinosaurier finden, die kleiner oder gleich groß wie unsere Lieblingsart, der Stegosaurus, sind:

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"

Wie Daten sortiert werden

In diesem Abschnitt wird erläutert, wie Ihre Daten bei Verwendung der drei Filterparameter sortiert werden.

orderBy

Wenn Sie orderBy mit dem Namen eines untergeordneten Schlüssels verwenden, werden Daten, die den angegebenen untergeordneten Schlüssel enthalten, so sortiert:

  1. Kinder mit dem Wert null für den angegebenen untergeordneten Schlüssel stehen an erster Stelle.
  2. Als Nächstes folgen untergeordnete Elemente mit dem Wert false für den angegebenen untergeordneten Schlüssel. Wenn mehrere untergeordnete Elemente den Wert false haben, werden sie lexikografisch nach Schlüssel sortiert.
  3. Als Nächstes folgen untergeordnete Elemente mit dem Wert true für den angegebenen untergeordneten Schlüssel. Wenn mehrere untergeordnete Elemente den Wert true haben, werden sie lexikografisch nach Schlüssel sortiert.
  4. Als Nächstes folgen untergeordnete Elemente mit einem numerischen Wert, sortiert in aufsteigender Reihenfolge. Wenn mehrere untergeordnete Elemente denselben numerischen Wert für den angegebenen untergeordneten Knoten haben, werden sie nach Schlüssel sortiert.
  5. Strings folgen auf Zahlen und werden lexikografisch in aufsteigender Reihenfolge sortiert. Wenn mehrere untergeordnete Elemente denselben Wert für den angegebenen untergeordneten Knoten haben, werden sie lexikografisch nach Schlüssel sortiert.
  6. Objekte kommen zuletzt und werden lexikografisch nach Schlüssel in aufsteigender Reihenfolge sortiert.
Die gefilterten Ergebnisse werden unsortiert zurückgegeben. Wenn die Reihenfolge Ihrer Daten wichtig ist, sollten Sie die Ergebnisse in Ihrer Anwendung sortieren, nachdem sie von Firebase zurückgegeben wurden.

orderBy="$key"

Wenn Sie den Parameter orderBy="$key" verwenden, um Ihre Daten zu sortieren, werden die Daten in aufsteigender Reihenfolge nach Schlüssel zurückgegeben. Beachten Sie, dass Schlüssel nur Strings sein können.

  1. Untergeordnete Elemente mit einem Schlüssel, der als 32-Bit-Ganzzahl geparst werden kann, werden zuerst in aufsteigender Reihenfolge sortiert.
  2. Als Nächstes folgen untergeordnete Elemente mit einem Stringwert als Schlüssel, die lexikografisch in aufsteigender Reihenfolge sortiert sind.

orderBy="$value"

Wenn Sie den Parameter orderBy="$value" zum Sortieren Ihrer Daten verwenden, werden untergeordnete Elemente nach ihrem Wert sortiert. Die Sortierkriterien sind dieselben wie bei Daten, die nach einem untergeordneten Schlüssel sortiert sind, mit dem Unterschied, dass der Wert des Knotens anstelle des Werts eines angegebenen untergeordneten Schlüssels verwendet wird.

orderBy="$priority"

Wenn Sie den Parameter orderBy="$priority" zum Sortieren Ihrer Daten verwenden, wird die Reihenfolge der untergeordneten Elemente durch ihre Priorität und ihren Schlüssel wie folgt bestimmt. Beachten Sie, dass Prioritätswerte nur Zahlen oder Strings sein können.

  1. Kinder ohne Priorität (Standardeinstellung) kommen zuerst.
  2. Als Nächstes folgen untergeordnete Elemente mit einer Zahl als Priorität. Sie werden numerisch nach Priorität sortiert, von klein nach groß.
  3. Untergeordnete Elemente mit einem String als Priorität kommen zuletzt. Sie werden lexikografisch nach Priorität sortiert.
  4. Wenn zwei untergeordnete Elemente dieselbe Priorität haben (einschließlich keiner Priorität), werden sie nach Schlüssel sortiert. Numerische Schlüssel stehen an erster Stelle (numerisch sortiert), gefolgt von den übrigen Schlüsseln (lexikografisch sortiert).

Weitere Informationen zu Prioritäten finden Sie in der API-Referenz.

Streaming über die REST API

Firebase-REST-Endpunkte unterstützen das Protokoll EventSource / Server-Sent Events. Dadurch können Änderungen ganz einfach an einen einzelnen Ort in der Firebase-Datenbank gestreamt werden.

Um mit dem Streaming zu beginnen, müssen wir Folgendes tun:

  1. Setzen Sie den Accept-Header des Clients auf text/event-stream.
  2. HTTP-Weiterleitungen beachten, insbesondere HTTP-Statuscode 307
  3. Fügen Sie den Abfrageparameter auth hinzu, wenn für den Speicherort der Firebase-Datenbank eine Leseberechtigung erforderlich ist.

Im Gegenzug sendet der Server benannte Ereignisse, wenn sich der Status der Daten unter der angeforderten URL ändert. Die Struktur dieser Nachrichten entspricht dem EventSource-Protokoll:

event: event name
data: JSON encoded data payload

Der Server kann die folgenden Ereignisse senden:

put Die JSON-codierten Daten sind ein Objekt mit zwei Schlüsseln: „path“ und „data“
Der Pfad verweist auf einen Ort relativ zur Anfrage-URL
Der Client sollte alle Daten an diesem Ort in seinem Cache durch die in der Nachricht angegebenen Daten ersetzen
patch Die JSON-codierten Daten sind ein Objekt mit zwei Schlüsseln: „path“ und „data“
Der Pfad verweist auf einen Ort relativ zur Anfrage-URL
Für jeden Schlüssel in den Daten sollte der Client den entsprechenden Schlüssel in seinem Cache durch die Daten für diesen Schlüssel in der Nachricht ersetzen
Keep-Alive Die Daten für dieses Ereignis sind null, es sind keine Maßnahmen erforderlich
Abbrechen Die Daten für dieses Ereignis sind null
Dieses Ereignis wird gesendet, wenn die Firebase Realtime Database Security Rules dazu führen, dass ein Lesevorgang am angeforderten Speicherort nicht mehr zulässig ist.
auth_revoked Die Daten für dieses Ereignis sind ein String, der angibt, dass die Anmeldedaten abgelaufen sind.
Dieses Ereignis wird gesendet, wenn der angegebene Authentifizierungsparameter nicht mehr gültig ist.

Hier ist ein Beispiel für eine Reihe von Ereignissen, die der Server senden kann:

// 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}}

Wenn Sie Go verwenden, sehen Sie sich Firego an, einen Drittanbieter-Wrapper für die Firebase REST und Streaming APIs.