Pobieram dane

Odczytywanie danych za pomocą metody GET

Dane z naszej bazy danych Firebase możemy odczytać, wysyłając żądanie GET do jego punktu końcowego URL. Kontynuujmy nasz przykładowy blog z poprzedniej sekcji i przeczytajmy wszystkie dane postów na blogu:

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

Udane żądanie jest sygnalizowane kodem stanu HTTP 200 OK, a parametr będzie zawierać pobierane dane.

Dodawanie parametrów identyfikatora URI

Interfejs REST API akceptuje kilka parametrów zapytania podczas odczytu danych z naszej bazy danych Firebase. Poniżej znajdziesz listę najczęściej używanych parametrów. Pełną listę znajdziesz tutaj Dokumentacja interfejsu API REST.

uwierzytelnienie

Parametr żądania auth umożliwia dostęp do danych chronionych przez Firebase Realtime Database Security Rules i to obsługiwane przez wszystkie typy żądań. Argumentem może być tajny klucz aplikacji Firebase lub token uwierzytelniania zgodnie z opisem w artykule Użytkownicy w projektach Firebase. W poniższym przykładzie wysyłamy żądanie GET z elementem auth gdzie CREDENTIAL to tajny klucz aplikacji Firebase lub token uwierzytelniania:

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

drukuj

Jeśli określisz wartość print=pretty, dane będą wyświetlane w formacie zrozumiałym dla człowieka.

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

Jeśli określisz wartość print=silent, po pomyślnym zwróceniu wyników zobaczysz wartość 204 No Content.

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

wywołanie zwrotne

Aby wykonywać wywołania REST w przeglądarce między domenami, możesz użyć JSONP, aby zapakować odpowiedź w kodzie JavaScript. funkcji wywołania zwrotnego. Dodaj callback=, aby interfejs REST API owi zawinął zwracane dane w określonej przez Ciebie funkcji wywołania zwrotnego. Przykład:

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

płytka

To zaawansowana funkcja zaprojektowana do pracy z dużymi zbiorami danych pobierz wszystko. Aby go użyć, dodaj shallow=true jako parametr. Ograniczy to głębokości zwracanych danych. Jeśli dane w lokalizacji są obiektem podstawowym JSON (ciąg, liczba, lub boolean), jego wartość zostanie po prostu zwrócona. Jeśli zrzut danych w lokalizacji jest w formacie JSON , wartości każdego klucza zostaną obcięte do true. Na przykład użycie poniższe dane:

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

Wypróbuj w ramach tej prośby curl:

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

czas oczekiwania

Służy do ograniczenia długości odczytu po stronie serwera. Jeśli odczyt nie kończy się w wyznaczonym czasie i kończy się żądaniem HTTP Błąd 400. Jest to szczególnie przydatne, gdy spodziewasz się niewielkiego przeniesienia danych i nie chcemy zbyt długo czekać, aż zdobędziecie potencjalnie ogromne poddrzewo. Rzeczywisty czas odczytu może się różnić w zależności od rozmiaru danych i wykorzystywania pamięci podręcznej.

Podaj wartość timeouts w tym formacie: 3ms, 3s lub 3min z liczbą i jednostką. Jeśli nie, wartość maksymalna timeout z 15min wynosi zastosowano. Jeśli wartość timeout nie jest dodatnia lub przekracza wartość maksymalną, żądanie zostanie odrzucone z błędem HTTP 400. W poniższym przykładzie żądanie GET zawiera parametr timeout z 10 sekund.

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

Filtrowanie danych

Możemy tworzyć zapytania służące do filtrowania danych na podstawie różnych czynników. Na początek określ sposób filtrowania danych za pomocą atrybutu orderBy . Następnie możesz połączyć parametr orderBy z dowolnym z pozostałych 5 parametrów: limitToFirst, limitToLast, startAt, endAt i equalTo.

Ponieważ wszyscy w Firebase uważamy, że dinozaury są fajne, użyjemy fragment z przykładowej bazy danych faktów o dinozaurach, aby zademonstrować, możesz filtrować dane:

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

Dane można filtrować na 3 sposoby: według klucza podrzędnego, według klucza lub według wartość. Zapytanie zaczyna się od jednego z tych parametrów, a następnie musi zostać połączone z co najmniej jednym z tych parametrów: startAt, endAt, limitToFirst, limitToLast lub equalTo.

Filtrowanie według określonego klucza podrzędnego

Możemy filtrować węzły według wspólnego klucza podrzędnego, przekazując go do funkcji orderBy . Aby na przykład odzyskać wszystkie dinozaury o wysokości większej niż 3, możemy wykonać następujące czynności:

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

Każdy węzeł, który nie ma klucza podrzędnego, według którego filtrujemy, będzie posortowany według wartości null Szczegółowe informacje o tym, jak są sortowane dane, znajdziesz w artykule Sortowanie danych.

Firebase obsługuje też zapytania uporządkowane według głęboko zagnieżdżonych elementów podrzędnych, a nie tylko według elementów podrzędnych. Jest to przydatne, jeśli masz głęboko zagnieżdżone dane:

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

Aby teraz zapytać o wysokość, użyjemy pełnej ścieżki do obiektu zamiast pojedynczego klucza:

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

Zapytania mogą być filtrowane tylko według 1 klucza naraz. Używanie wielokrotności parametru orderBy dla tego samego żądania powoduje zgłoszenie błędu.

Filtrowanie według klucza

Możemy też filtrować węzły według ich kluczy, używając parametru orderBy="$key". poniższy przykład pobiera wszystkie dinozaury o nazwach zaczynających się od litery a do m:

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

Filtrowanie według wartości

Za pomocą funkcji orderBy="$value" możemy filtrować węzły według wartości ich kluczy podrzędnych . Załóżmy, że dinozaury urządzają zawody sportowe z dinozaurami, a my śledzić swoje wyniki w następującym formacie:

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

Aby odzyskać wszystkie dinozaury z wynikiem powyżej 50, możemy wysłać takie żądanie:

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

Wyjaśnienie znajdziesz w sekcji W jaki sposób porządkowane są dane jak są sortowane wartości null, wartości logiczne, ciągi znaków i obiekty podczas orderBy="$value"

Złożone filtrowanie

Możemy łączyć wiele parametrów, aby tworzyć bardziej złożone zapytania.

Ogranicz zapytania

Parametry limitToFirst i limitToLast służą do ustawiania maksymalną liczbę dzieci, dla których mają być wysyłane dane. Jeśli ustawimy limit na 100 wartości, otrzymamy maksymalnie 100 wartości podrzędnych. Jeśli w naszej pamięci przechowywanych jest mniej niż 100 wiadomości będziemy przesyłać dane każdego dziecka. Jeśli jednak będziemy mieć ponad 100 wiadomości, będzie odbierać dane dla 100 z tych wiadomości. Będzie to pierwsze 100 zamówionych wiadomości, jeśli przy użyciu funkcji limitToFirst lub listy 100 ostatnio zamówionych wiadomości, jeśli korzystamy z limitToLast

Korzystając z naszej bazy danych o dinozaurach i usługi orderBy, możemy znaleźć dwie najcięższe dinozaury:

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

Podobnie możemy znaleźć dwa najkrótsze dinozaury, używając funkcji limitToFirst:

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

Możemy również wykonywać zapytania dotyczące limitów za pomocą funkcji orderBy="$value". Jeśli chcemy utworzyć z 3 najlepszymi graczami w grze z dinozaurami, moglibyśmy :

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

Zapytania dotyczące zakresów

Wartości startAt, endAt i equalTo pozwalają nam wybrać dla dowolnych punktów początkowych i końcowych zapytań. Jeśli na przykład chcemy znaleźć wszystkie dinozaurów o wysokości co najmniej trzech metrów, możemy łączyć parametry orderBy startAt:

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

Możemy użyć pola endAt, aby znaleźć wszystkie dinozaury, których nazwy pochodzą z czasów poprzedzających pterodaktyl leksykograficznie:

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

Możemy łączyć startAt i endAt, by ograniczyć zakres danych zapytania. W tym przykładzie zostaną znalezione wszystkie dinozaury, których nazwa zaczyna się od litery „b”:

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

Zapytania dotyczące zakresów są też przydatne przy dzieleniu danych na strony.

Łączę wszystko w całość

Możemy łączyć wszystkie te techniki, aby tworzyć złożone zapytania. Jeśli na przykład chcesz, aby znaleźć nazwy wszystkich dinozaurów o wzroście krótszym lub równym naszym ulubionym życzliwy, stegozaur:

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"

W jaki sposób dane są porządkowane

W tej sekcji wyjaśniamy, jak są sortowane dane, gdy używasz każdego z 3 parametrów filtrowania.

zamówienieWedług

Gdy używasz funkcji orderBy z nazwą klucza podrzędnego, dane zawierające określony klucz podrzędny zostaną posortowane w ten sposób:

  1. Najpierw są wybierane elementy podrzędne, dla których wartość atrybutu podrzędnego to null.
  2. Następne są elementy podrzędne o wartości false określonego klucza podrzędnego. Jeśli wiele elementów podrzędnych ma wartość false, są posortowane leksykograficznie według klucza.
  3. Następne są elementy podrzędne o wartości true określonego klucza podrzędnego. Jeśli jeśli wiele elementów podrzędnych ma wartość true, są one sortowane leksykograficznie według .
  4. Następne są elementy podrzędne z wartością liczbową, posortowane w kolejności rosnącej. Jeśli więcej dzieci mają tę samą wartość liczbową dla określonego węzła podrzędnego, są one sortowane według klucza.
  5. Ciągi znaków występują po liczbach i są sortowane alfabetycznie w kolejności rosnącej. Jeśli kilka podrzędne mają tę samą wartość w określonym węźle podrzędnym, są uporządkowane leksykograficznie według tonacji.
  6. Obiekty są na końcu i posortowane leksykograficznie według klucza w kolejności rosnącej.
Odfiltrowane wyniki są zwracane w nieuporządkowanej kolejności. Jeśli kolejność danych jest ważna, należy posortować wyniki w aplikacji po ich zwróceniu z Firebase.

orderBy="$key"

Jeśli do sortowania danych użyjesz parametru orderBy="$key", zostaną one zwrócone w kolejności rosnącej według klucza. Pamiętaj, że klucze mogą być tylko ciągami znaków.

  1. Dzieci z kluczem, który można przeanalizować jako 32-bitową liczbę całkowitą, są na pierwszym miejscu, posortowane rosnąco zamówienie.
  2. Następny element podrzędny z wartością ciągu znaków jako klucz, posortowany leksykograficznie w kolejności rosnącej zamówienie.

orderBy="$value"

Jeśli do sortowania danych użyjesz parametru orderBy="$value", elementy podrzędne zostaną uporządkowane według wartości. Kryteria sortowania są takie same jak dane uporządkowane według klucza podrzędnego, z tym że zamiast wartości określonego klucza podrzędnego jest używana wartość węzła.

orderBy="$Priorytet"

Gdy do sortowania danych używasz parametru orderBy="$priority", kolejność dzieci jest określana przez ich priorytet i klucz w następujący sposób: Pamiętaj, że wartości priorytetu mogą być tylko liczbami lub ciągami znaków.

  1. Najpierw są wyświetlane dzieci bez priorytetu (domyślnie).
  2. Następne dzieci mają przypisany numer. Są one sortowane numerycznie według priorytetu, od małych do dużych.
  3. Elementy podrzędne z ciągiem znaków mają priorytet na końcu. Są one sortowane leksykograficznie według .
  4. Gdy 2 elementy podrzędne mają ten sam priorytet (w tym brak priorytetu), są sortowane według klucza. Najpierw podawane są klucze liczbowe (posortowane według wartości liczbowej), a potem pozostałe klucze (posortowane alfabetycznie).

Więcej informacji o priorytetach znajdziesz Dokumentacja API

Strumieniowe przesyłanie z interfejsu API REST

Punkty końcowe Firebase REST obsługują EventSource / protokołu zdarzeń wysyłanych przez serwer, co ułatwia strumieniowe przesyłanie zmian do pojedynczej lokalizacji w naszych w bazie danych Firebase.

Aby rozpocząć strumieniowe przesyłanie danych, wykonaj te czynności:

  1. Ustaw nagłówek Accept klienta na text/event-stream
  2. Przestrzegaj przekierowań HTTP, w szczególności kodu stanu HTTP 307
  3. Uwzględnij parametr zapytania auth, jeśli wymaga to lokalizacji bazy danych Firebase uprawnienia do odczytu

W zamian serwer będzie wysyłać nazwane zdarzenia, gdy stan danych pod podanym adresem URL będzie się zmieniać. Struktura tych komunikatów jest zgodna z protokołem EventSource:

event: event name
data: JSON encoded data payload

Serwer może wysyłać te zdarzenia:

Włącz Dane zakodowane w formacie JSON będą obiektem z 2 kluczami: ścieżką i danymi
Ścieżka wskazuje lokalizację względem adresu URL żądania
Klient powinien zastąpić wszystkie dane w tej lokalizacji w pamięci podręcznej danymi podanymi w komunikacie
patch Dane zakodowane w formacie JSON będą obiektem z 2 kluczami: ścieżką i danymi
Ścieżka wskazuje lokalizację względem adresu URL żądania
W przypadku każdego klucza w danych klient powinien zastąpić odpowiedni klucz w pamięci podręcznej danymi tego klucza w wiadomości.
utrzymywanie aktywności Dane tego zdarzenia mają wartość null, nie musisz nic robić
anuluj Dane tego zdarzenia mają wartość null
To zdarzenie zostanie wysłane, jeśli zdarzenie Firebase Realtime Database Security Rules sprawi, że odczyt w żądanej lokalizacji nie będzie już dozwolony
unieważnienie autoryzacji Dane tego zdarzenia to ciąg znaków wskazujący, że dane logowania wygasły
To zdarzenie zostanie wysłane, gdy podany parametr uwierzytelniania utraci ważność

Poniżej znajduje się przykładowy zestaw zdarzeń, które może wysyłać serwer:

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

Jeśli używasz Go, wypróbuj Firego, wokół interfejsu API Firebase typu REST i Streamingu.