Daten werden abgerufen

Daten mit GET lesen

Zum Lesen von Daten aus unserer Firebase-Datenbank senden wir eine GET-Anfrage an die entsprechende URL. Endpunkt. Fahren wir mit unserem Blog-Beispiel aus dem vorherigen Abschnitt fort und lesen Sie Blogpostdaten:

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

Eine erfolgreiche Anfrage wird durch den HTTP-Statuscode 200 OK angezeigt und der enthält die 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 Referenz zur REST API

auth

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

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

ausgeben

Wenn Sie print=pretty angeben, werden die Daten in einem visuell lesbaren 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

Für domainübergreifende REST-Aufrufe in einem Webbrowser können Sie Folgendes verwenden: JSONP zum Verpacken der Antwort in einem JavaScript-Code Callback-Funktion verwendet werden. Fügen Sie callback= hinzu, damit die REST API die zurückgegebenen Daten in die von Ihnen angegebene Callback-Funktion einbettet. 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. Fügen Sie shallow=true als Parameter hinzu, um ihn zu verwenden. Dadurch schränken Sie die Tiefe der zurückgegebenen Daten. Wenn die Daten am Speicherort eine JSON-Primitive sind (String, Zahl, oder boolesch), wird sein Wert einfach zurückgegeben. Wenn der Daten-Snapshot am Speicherort ein JSON-Format ist -Objekt enthält, werden die Werte für jeden Schlüssel auf true gekürzt. Wenn Sie beispielsweise 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'

Zeitüberschreitung

Hiermit können Sie die Dauer des Lesevorgangs auf Serverseite begrenzen. Wenn ein Lesevorgang -Anfrage nicht innerhalb der vorgesehenen Zeit abgeschlossen ist, endet mit einem HTTP- Fehler 400. Dies ist besonders nützlich, wenn Sie eine kleinere Datenübertragung und möchten nicht zu lange warten, um eine große Unterstruktur abzurufen. Tatsächlicher Wert 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. Falls nicht angegeben ist, wird die maximale timeout von 15min angewendet. Wenn timeout nicht positiv ist oder den Höchstwert überschreitet, wird die Anfrage mit dem HTTP-Fehler 400 abgelehnt. Im folgenden Beispiel enthält die GET-Anfrage Folgendes: 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. Geben Sie zuerst mit dem Parameter orderBy an, wie Ihre Daten gefiltert werden sollen. Kombinieren Sie dann orderBy mit einem der anderen fünf Parameter: limitToFirst, limitToLast, startAt, endAt und equalTo.

Da wir alle bei Firebase denken, dass Dinosaurier sehr cool sind, verwenden wir einen Ausschnitt aus einer Beispieldatenbank mit Fakten zu Dinosauriern, um zu zeigen, können Sie Daten filtern:

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

Sie können Daten auf 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.

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 orderBy . Um beispielsweise alle Dinosaurier abzurufen, deren Größe größer als 3 ist, können Sie 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 gefiltert wird, wird mit dem Wert von null Details dazu, wie Daten Weitere Informationen

Firebase unterstützt auch Abfragen, die nach tief verschachtelten untergeordneten Elementen sortiert sind, anstatt nur nach untergeordneten Elementen. Dies ist nützlich, wenn Sie tief verschachtelte Daten wie die folgende haben:

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

Um die Höhe jetzt abzufragen, 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 gefiltert werden. Wenn der Parameter orderBy mehrmals in derselben Anfrage verwendet wird, wird ein Fehler ausgegeben.

Nach Schlüssel filtern

Mit dem Parameter orderBy="$key" können wir Knoten auch nach ihren Schlüsseln filtern. Die Im folgenden Beispiel werden alle Dinosaurier mit einem Namen abgerufen, der 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 orderBy="$value" können wir Knoten nach dem Wert ihrer untergeordneten Schlüssel filtern. . Nehmen wir an, die Dinosaurier haben einen Dino-Sportwettbewerb und wir halten ihre Punktzahlen im folgenden Format anzeigen:

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

Um alle Dinosaurier mit einem Wert über 50 abzurufen, könnten wir die folgende Anfrage stellen:

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

Eine Erklärung hierzu finden Sie unter Wie werden Daten geordnet? wie null, boolesche Werte, Zeichenfolgen und Objektwerte bei Verwendung von orderBy="$value".

Komplexe Filterung

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

Abfragen begrenzen

Die Parameter limitToFirst und limitToLast werden verwendet, um eine Maximale Anzahl von Kindern, für die Daten empfangen werden. Wenn wir einen Grenzwert von 100 festlegen, bis zu 100 übereinstimmende Kinder erhalten. Wenn weniger als 100 Nachrichten in unserem erhalten wir jedes untergeordnete Element. Wenn wir jedoch mehr als 100 Nachrichten erhalten, erhalten wir nur Daten für 100 dieser Nachrichten. Das sind die ersten 100 sortierten Nachrichten bei Verwendung von limitToFirst oder die letzten 100 sortierten Nachrichten bei Verwendung von limitToLast.

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

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

Ähnlich können wir mit limitToFirst die beiden kürzesten Dinosaurier finden:

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

Mit orderBy="$value" können wir auch Abfragen mit Begrenzungen durchführen. Wenn wir eine Leaderboard mit den drei Dino-Sportkonkurrenten mit der höchsten Punktzahl an. Folgendes:

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

Bereichsabfragen

Bei Verwendung von startAt, endAt und equalTo können wir Folgendes auswählen: beliebige Start- und Endpunkte für unsere Abfragen. Wenn wir zum Beispiel alle Dinosaurier, die mindestens drei Meter groß sind, können wir orderBy und startAt:

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

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

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

Wir können startAt und endAt kombinieren, um beide Enden der 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 all diese Techniken kombinieren, um komplexe Abfragen zu erstellen. Angenommen, Sie möchten den Namen aller Dinosaurier ermitteln, die kürzer als oder gleich hoch wie unser Lieblingsdinosaurier, 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 geordnet 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 die angegebenen wird der untergeordnete Schlüssel wie folgt angeordnet:

  1. Untergeordnete Schlüssel mit einem null-Wert für den angegebenen untergeordneten Schlüssel haben Vorrang.
  2. Als Nächstes kommen untergeordnete Elemente mit dem Wert false für den angegebenen untergeordneten Schlüssel. Wenn mehrere untergeordnete Elemente den Wert false haben, sind sie sortiert lexikografisch nach Schlüssel.
  3. Als Nächstes kommen untergeordnete Elemente mit dem Wert true für den angegebenen untergeordneten Schlüssel. Wenn mehrere untergeordnete Elemente den Wert true haben, sind sie lexikografisch nach .
  4. Untergeordnete Elemente mit einem numerischen Wert kommen als Nächstes, in aufsteigender Reihenfolge sortiert. Wenn mehrere untergeordnete Elemente denselben numerischen Wert für den angegebenen untergeordneten Knoten haben, werden sie nach Schlüssel sortiert.
  5. Zeichenfolgen stehen nach Zahlen und werden lexikografisch in aufsteigender Reihenfolge sortiert. Falls mehrere Untergeordnete Elemente haben denselben Wert für den angegebenen untergeordneten Knoten, sie sind geordnet lexikografisch nach Schlüssel.
  6. Objekte kommen zuletzt und werden in aufsteigender Reihenfolge nach Schlüssel 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 sie in aufsteigender Reihenfolge nach Schlüssel zurückgegeben. Denken Sie daran, dass Schlüssel nur Strings sein können.

  1. Untergeordnete Elemente mit einem Schlüssel, der als 32-Bit-Ganzzahl geparst werden kann, kommen an erster Stelle, in aufsteigender Reihenfolge sortiert Reihenfolge.
  2. Kinder mit einem Stringwert als Schlüssel kommen als Nächstes, lexikografisch in aufsteigender Reihenfolge sortiert Reihenfolge.

orderBy="$value"

Wenn Sie die Daten mit dem Parameter orderBy="$value" sortieren, sind die untergeordneten Elemente sortiert nach ihrem Wert. Die Sortierkriterien entsprechen den Daten, die nach einem untergeordneten Schlüssel sortiert sind, außer dass der Wert des Knotens anstelle des Werts eines angegebenen untergeordneten Schlüssels verwendet wird.

orderBy="$Priority"

Wenn Sie Ihre Daten mit dem Parameter orderBy="$priority" sortieren, ist die Reihenfolge der Untergeordnete Elemente werden wie folgt durch ihre Priorität und ihren Schlüssel bestimmt. Denken Sie daran, dass Prioritätswerte dürfen nur Zahlen oder Strings sein.

  1. Untergeordnete Elemente ohne Priorität (Standardeinstellung) haben Vorrang.
  2. Als Nächstes kommen Kinder mit einer Zahl als Priorität. Sie sind numerisch nach Priorität sortiert, von klein nach groß.
  3. Kinder, bei denen eine Zeichenfolge als Priorität gilt, kommen an letzter Stelle. Sie sind lexikografisch sortiert nach Priorität haben.
  4. Wenn zwei untergeordnete Elemente die gleiche Priorität haben (aber keine Priorität), werden sie nach Schlüssel sortiert. Numerische Schlüssel stehen zuerst (numerisch sortiert), gefolgt von den verbleibenden (sortiert) lexikografisch dargestellt werden.

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

Streaming von der REST API

Firebase REST-Endpunkte unterstützen die Methode EventSource / Server-Sent Events-Protokoll, mit dem Änderungen an einem einzigen Speicherort in unserem Firebase-Datenbank

Vor dem Streaming sind folgende Schritte erforderlich:

  1. Annahme-Header des Clients auf text/event-stream festlegen
  2. HTTP-Weiterleitungen, insbesondere HTTP-Statuscode 307, berücksichtigen
  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 als Status der Daten unter der angeforderten URL. Änderungen. Die Struktur dieser Nachrichten entspricht dem EventSource-Protokoll:

event: event name
data: JSON encoded data payload

Der Server kann folgende Ereignisse senden:

put Die JSON-codierten Daten sind ein Objekt mit zwei Schlüsseln: Pfad und Daten
Der Pfad verweist auf einen Speicherort in Bezug auf die Anfrage-URL.
Der Client sollte alle Daten an diesem Speicherort 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 Speicherort 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 Firebase Realtime Database Security Rules dazu führt, dass ein Lesevorgang am angeforderten Speicherort nicht mehr zulässig ist
auth_revoked Bei den Daten für dieses Ereignis handelt es sich um einen String, der angibt, dass die Anmeldedaten abgelaufen sind
Dieses Ereignis wird gesendet, wenn der angegebene Auth-Parameter nicht mehr gültig ist

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