Abrufen von Daten

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 unserem Blog-Beispiel aus dem vorherigen Abschnitt fort und lesen Sie alle unsere Blog-Beitragsdaten:

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 von uns abgerufenen Daten.

URI-Parameter hinzufügen

Die REST-API akzeptiert beim Lesen von Daten aus unserer Firebase-Datenbank mehrere Abfrageparameter. Nachfolgend sind die am häufigsten verwendeten Parameter aufgeführt. Eine vollständige Liste finden Sie in der REST-API-Referenz .

Autor

Der auth ermöglicht den Zugriff auf Daten, die durch Firebase Realtime Database Security Rules geschützt sind, und wird von allen Anforderungstypen unterstützt. Das Argument kann entweder das Geheimnis Ihrer Firebase-App oder ein Authentifizierungstoken sein, wie im Abschnitt „Benutzer in Firebase-Projekten“ beschrieben. Im folgenden Beispiel senden wir eine GET Anfrage mit einem auth , wobei CREDENTIAL entweder das Geheimnis Ihrer Firebase-App oder ein Authentifizierungstoken ist:

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

drucken

Durch die Angabe von print=pretty werden die Daten in einem für Menschen lesbaren Format zurückgegeben.

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

Die Angabe von print=silent gibt bei Erfolg den Fehler 204 No Content zurück.

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

Ruf zurück

Um REST-Aufrufe von einem Webbrowser aus über Domänen hinweg durchzuführen, können Sie JSONP verwenden, um die Antwort in eine JavaScript-Rückruffunktion zu verpacken. Fügen Sie callback= hinzu, damit die REST-API die zurückgegebenen Daten in die von Ihnen angegebene Callback-Funktion einschließt. Zum Beispiel:

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

seicht

Hierbei handelt es sich um eine erweiterte Funktion, die Ihnen bei der Arbeit mit großen Datensätzen helfen soll, ohne alles herunterladen zu müssen. Um es zu verwenden, fügen Sie shallow=true als Parameter hinzu. Dadurch wird die Tiefe der zurückgegebenen Daten begrenzt. Wenn es sich bei den Daten am Speicherort um ein JSON-Grundelement (Zeichenfolge, Zahl oder boolescher Wert) handelt, wird sein Wert einfach zurückgegeben. Wenn der Daten-Snapshot am Standort ein JSON-Objekt ist, werden die Werte für jeden Schlüssel auf true gekürzt. Verwenden Sie zum Beispiel die folgenden Daten:

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

Auszeit

Verwenden Sie diese Option, um die Dauer des Lesevorgangs auf der Serverseite zu begrenzen. Wenn eine Leseanforderung nicht innerhalb der vorgegebenen Zeit abgeschlossen wird, wird sie mit einem HTTP-400-Fehler beendet. Dies ist besonders nützlich, wenn Sie eine kleine Datenübertragung erwarten und nicht zu lange warten möchten, um einen möglicherweise großen Teilbaum abzurufen. Die tatsächliche Lesezeit 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 nicht angegeben, wird das maximale timeout von 15min angewendet. Wenn das timeout nicht positiv ist oder das Maximum überschreitet, wird die Anfrage mit einem HTTP-400-Fehler abgelehnt. Im folgenden Beispiel umfasst 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 basierend auf verschiedenen Faktoren zu filtern. Zunächst 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 für ziemlich cool halten, verwenden wir einen Ausschnitt aus einer Beispieldatenbank mit Dinosaurier-Fakten, um zu demonstrieren, wie Sie Daten filtern können:

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

Wir können Daten auf eine von drei Arten filtern: 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 .

Filtern nach einem angegebenen untergeordneten Schlüssel

Wir können Knoten nach einem gemeinsamen untergeordneten Schlüssel filtern, indem wir diesen Schlüssel an den Parameter orderBy übergeben. Um beispielsweise alle Dinosaurier mit einer Körpergröße von mehr als 3 abzurufen, können wir Folgendes tun:

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

Jeder Knoten, der nicht über den untergeordneten Schlüssel verfügt, nach dem wir filtern, wird mit dem Wert null sortiert. Einzelheiten zur Reihenfolge der Daten finden Sie unter „Wie Daten geordnet werden“ .

Firebase unterstützt auch Abfragen, die nach tief verschachtelten untergeordneten Elementen geordnet sind, und nicht nur nach untergeordneten Elementen, die eine Ebene tiefer liegen. Dies 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
    }
  }
}

Um nun die Höhe abzufragen, verwenden wir den vollständigen Pfad zum Objekt und nicht einen einzelnen Schlüssel:

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. Die mehrmalige Verwendung des orderBy Parameters bei derselben Anfrage führt zu einem Fehler.

Filterung nach Schlüssel

Mit dem Parameter orderBy="$key" können wir Knoten auch nach ihren Schlüsseln filtern. Das folgende Beispiel ruft alle Dinosaurier ab, deren Namen mit den Buchstaben a bis m beginnen:

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

Filtern nach Wert

Mithilfe des Parameters orderBy="$value" können wir Knoten nach dem Wert ihrer untergeordneten Schlüssel filtern. Nehmen wir an, die Dinosaurier veranstalten einen Dino-Sportwettbewerb und wir verfolgen ihre Ergebnisse im folgenden Format:

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

Um alle Dinosaurier mit einer Punktzahl über 50 wiederzufinden, könnten wir die folgende Anfrage stellen:

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

Eine Erläuterung dazu, wie null , Boolesche-, Zeichenfolgen- und Objektwerte bei Verwendung orderBy="$value" sortiert werden, finden Sie unter So werden Daten sortiert .

Komplexe Filterung

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

Begrenzen Sie Abfragen

Die Parameter limitToFirst und limitToLast werden verwendet, um eine maximale Anzahl von Kindern festzulegen, für die Daten empfangen werden sollen. Wenn wir ein Limit von 100 festlegen, erhalten wir nur bis zu 100 passende Kinder. Wenn wir weniger als 100 Nachrichten in unserer Datenbank gespeichert haben, erhalten wir jedes Kind. Wenn wir jedoch über 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 Dinosaurier-Faktendatenbank und orderBy können wir die beiden schwersten Dinosaurier finden:

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

Ebenso können wir die beiden kürzesten Dinosaurier finden, indem wir limitToFirst verwenden:

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 Rangliste mit den drei besten Dino-Sportteilnehmern mit der höchsten Punktzahl erstellen möchten, könnten wir Folgendes tun:

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

Bereichsabfragen

Durch die Verwendung 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'

Wir können endAt verwenden, um alle Dinosaurier zu finden, deren Namen lexikographisch vor Pterodaktylus 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 einzuschränken. Das folgende Beispiel findet alle Dinosaurier, 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.

Alles zusammenfügen

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

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"

So werden Daten geordnet

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

Sortieren nach

Wenn orderBy mit dem Namen eines untergeordneten Schlüssels verwendet wird, werden Daten, die den angegebenen untergeordneten Schlüssel enthalten, wie folgt sortiert:

  1. Kinder mit einem null für den angegebenen Kinderschlüssel stehen an erster Stelle.
  2. Als nächstes folgen Kinder mit dem Wert false für den angegebenen Kinderschlüssel. Wenn mehrere untergeordnete Elemente den Wert false haben, werden sie lexikografisch nach Schlüssel sortiert.
  3. Als nächstes folgen Kinder mit dem Wert true für den angegebenen Kinderschlüssel. Wenn mehrere untergeordnete Elemente den Wert true haben, werden sie lexikografisch nach Schlüssel sortiert.
  4. Als nächstes folgen Kinder mit einem numerischen Wert, sortiert in aufsteigender Reihenfolge. Wenn mehrere untergeordnete Knoten denselben numerischen Wert für den angegebenen untergeordneten Knoten haben, werden sie nach Schlüssel sortiert.
  5. Zeichenfolgen folgen nach Zahlen und werden lexikografisch in aufsteigender Reihenfolge sortiert. Wenn mehrere untergeordnete Knoten denselben Wert für den angegebenen untergeordneten Knoten haben, werden sie lexikografisch nach Schlüssel sortiert.
  6. Die Objekte stehen an letzter Stelle und werden lexikografisch nach Schlüssel in aufsteigender Reihenfolge sortiert.
Die gefilterten Ergebnisse werden ungeordnet 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" zum Sortieren Ihrer Daten verwenden, werden die Daten wie folgt in aufsteigender Reihenfolge nach Schlüssel zurückgegeben. Beachten Sie, dass Schlüssel nur Zeichenfolgen sein können.

  1. Kinder mit einem Schlüssel, der als 32-Bit-Ganzzahl geparst werden kann, stehen an erster Stelle und werden in aufsteigender Reihenfolge sortiert.
  2. Als nächstes folgen Kinder mit einem Zeichenfolgenwert als Schlüssel, lexikografisch in aufsteigender Reihenfolge sortiert.

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 nach einem untergeordneten Schlüssel geordnete Daten, außer 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 wie folgt durch ihre Priorität und ihren Schlüssel bestimmt. Beachten Sie, dass Prioritätswerte nur Zahlen oder Zeichenfolgen sein können.

  1. Kinder ohne Priorität (Standardeinstellung) stehen an erster Stelle.
  2. Als nächstes kommen Kinder mit einer Nummer als Priorität. Sie sind numerisch nach Priorität von klein nach groß sortiert.
  3. Kinder mit einer Schnur als Priorität kommen an letzter Stelle. Sie sind lexikografisch nach Priorität sortiert.
  4. Immer wenn zwei Kinder die gleiche 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 von der REST-API

Firebase-REST-Endpunkte unterstützen das EventSource-/Server-Sent-Events- Protokoll, wodurch es einfach ist, Änderungen an einem einzigen Ort in unserer Firebase-Datenbank zu streamen.

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

  1. Setzen Sie den Accept-Header des Clients auf text/event-stream
  2. Respektieren Sie HTTP-Weiterleitungen, insbesondere den HTTP-Statuscode 307
  3. Schließen Sie den auth Abfrageparameter ein, wenn für den Firebase-Datenbankspeicherort eine Leseberechtigung erforderlich ist

Im Gegenzug sendet der Server benannte Ereignisse, wenn sich der Status der Daten an 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:

setzen Die JSON-codierten Daten sind ein Objekt mit zwei Schlüsseln: Pfad und Daten
Der Pfad zeigt auf einen Speicherort relativ zur Anforderungs-URL
Der Client sollte alle Daten an dieser Stelle in seinem Cache durch die in der Nachricht angegebenen Daten ersetzen
Patch Die JSON-codierten Daten sind ein Objekt mit zwei Schlüsseln: Pfad und Daten
Der Pfad zeigt auf einen Speicherort relativ zur Anforderungs-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
bleib am Leben Die Daten für dieses Ereignis sind null, es ist keine Aktion erforderlich
stornieren Die Daten für dieses Ereignis sind null
Dieses Ereignis wird gesendet, wenn die Sicherheitsregeln der Firebase-Echtzeitdatenbank dazu führen, dass ein Lesevorgang am angeforderten Speicherort nicht mehr zulässig ist
auth_revoked Die Daten für dieses Ereignis sind eine Zeichenfolge, die angibt, dass die Anmeldeinformationen abgelaufen sind
Dieses Ereignis wird gesendet, wenn der angegebene Authentifizierungsparameter nicht mehr gültig ist

Nachfolgend finden Sie 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, schauen Sie sich Firego an, einen Drittanbieter-Wrapper für die Firebase-REST- und Streaming-APIs.