Odczytywanie danych za pomocą metody GET
Możemy odczytywać dane z bazy danych Firebase, wysyłając żądanie GET do jej punktu końcowego URL. Wróćmy do przykładu bloga z poprzedniej sekcji i odczytajmy wszystkie dane postów na blogu:
curl 'https://docs-examples.firebaseio.com/fireblog/posts.json?print=pretty'
Żądanie zakończone powodzeniem będzie oznaczone kodem stanu HTTP 200 OK, a odpowiedź będzie zawierać pobierane dane.
Dodawanie parametrów URI
Interfejs REST API akceptuje kilka parametrów zapytania podczas odczytywania danych z bazy danych Firebase. Poniżej znajdziesz najczęściej używane parametry. Pełną listę znajdziesz w przewodniku po interfejsie API REST.
autoryzacja
Parametr żądania auth umożliwia dostęp do danych chronionych przez Firebase Realtime Database Security Rules i jest obsługiwany przez wszystkie typy żądań. Argumentem może być tajny klucz aplikacji Firebase lub token uwierzytelniania, zgodnie z opisem w sekcji Użytkownicy w projektach Firebase. W przykładzie poniżej wysyłamy żądanie GET z parametrem auth, gdzie CREDENTIAL to tajny klucz aplikacji Firebase lub token uwierzytelniania:
curl 'https://docs-examples.firebaseio.com/auth-example.json?auth=CREDENTIAL'
drukuj
Określenie print=pretty powoduje zwrócenie danych w formacie czytelnym dla człowieka.
curl 'https://docs-examples.firebaseio.com/fireblog/posts.json?print=pretty'
Określenie print=silent zwraca 204 No Content w przypadku powodzenia.
curl 'https://docs-examples.firebaseio.com/fireblog/posts.json?print=silent'
callback
Aby wykonywać wywołania REST z przeglądarki internetowej w różnych domenach, możesz użyć JSONP, aby opakować odpowiedź w funkcję wywołania zwrotnego JavaScript. Dodaj callback=, aby interfejs REST API opakował zwrócone 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łytkie
Jest to zaawansowana funkcja, która pomaga pracować z dużymi zbiorami danych bez konieczności pobierania wszystkich informacji. Aby go użyć, dodaj shallow=true jako parametr. Ograniczy to głębokość zwracanych danych. Jeśli dane w lokalizacji są typem prostym JSON (ciąg tekstowy, liczba lub wartość logiczna), zostanie zwrócona ich wartość. Jeśli migawka danych w lokalizacji jest obiektem JSON, wartości każdego klucza zostaną skrócone do true. Na przykład na podstawie tych danych:
{ "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 to, wysyłając to curlżądanie:
curl 'https://docs-examples.firebaseio.com/rest/retrieving-data.json?shallow=true&print=pretty'
czas oczekiwania
Użyj tego parametru, aby ograniczyć czas odczytu po stronie serwera. Jeśli żądanie odczytu nie zostanie ukończone w przydzielonym czasie, zostanie zakończone błędem HTTP 400. Jest to szczególnie przydatne, gdy spodziewasz się niewielkiego transferu danych i nie chcesz zbyt długo czekać na pobranie potencjalnie dużego poddrzewa. Rzeczywisty czas odczytu może się różnić w zależności od rozmiaru danych i buforowania.
Określ timeouts w tym formacie: 3ms,
3s lub 3min, podając liczbę i jednostkę. Jeśli nie określisz tu żadnej wartości, zostanie zastosowana maksymalna wartość timeout 15min. Jeśli wartość timeout nie jest dodatnia lub przekracza wartość maksymalną, żądanie zostanie odrzucone z błędem HTTP 400.
W tym przykładzie żądanie GET zawiera timeout o wartości 10 sekund.
curl 'https://docs-examples.firebaseio.com/rest/retrieving-data.json?timeout=10s'
Filtrowanie danych
Możemy tworzyć zapytania, aby filtrować dane na podstawie różnych czynników. Na początek określ, jak chcesz filtrować dane, za pomocą parametru orderBy. Następnie połącz orderBy z dowolnym z pozostałych 5 parametrów: limitToFirst, limitToLast, startAt, endAt i equalTo.
Wszyscy w Firebase uważamy, że dinozaury są fajne, więc użyjemy fragmentu przykładowej bazy danych z faktami o dinozaurach, aby pokazać, jak można filtrować dane:
{
"lambeosaurus": {
"height": 2.1,
"length": 12.5,
"weight": 5000
},
"stegosaurus": {
"height": 4,
"length": 9,
"weight": 2500
}
}
Dane możemy filtrować na 3 sposoby: według klucza podrzędnego, klucza lub wartości. Zapytanie zaczyna się od jednego z tych parametrów, a następnie musi być połączone z co najmniej jednym z tych parametrów: startAt, endAt, limitToFirst, limitToLast lub equalTo.
Filtrowanie według określonego klucza podrzędnego
Węzły możemy filtrować według wspólnego klucza podrzędnego, przekazując ten klucz do parametru orderBy. Aby na przykład pobrać wszystkie dinozaury o wysokości większej niż 3, możemy wykonać te 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, zostanie posortowany z wartością null. Więcej informacji o kolejności danych znajdziesz w artykule Jak są uporządkowane dane.
Firebase obsługuje też zapytania uporządkowane według głęboko zagnieżdżonych elementów podrzędnych, a nie tylko elementów podrzędnych na jednym poziomie. Jest to przydatne, jeśli masz głęboko zagnieżdżone dane, takie jak te:
{
"lambeosaurus": {
"dimensions": {
"height" : 2.1,
"length" : 12.5,
"weight": 5000
}
},
"stegosaurus": {
"dimensions": {
"height" : 4,
"length" : 9,
"weight" : 2500
}
}
}Aby teraz wysłać zapytanie o wysokość, używamy pełnej ścieżki do obiektu, a nie pojedynczego klucza:
curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="dimensions/height"&startAt=3&print=pretty'
Zapytania mogą filtrować tylko według jednego klucza naraz. Użycie parametru orderBy wiele razy w tym samym żądaniu powoduje błąd.
Filtrowanie według klucza
Możemy też filtrować węzły według kluczy za pomocą parametru orderBy="$key". W tym przykładzie pobierane są wszystkie dinozaury, których nazwy zaczynają 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
Węzły możemy filtrować według wartości ich kluczy podrzędnych za pomocą parametru orderBy="$value". Załóżmy, że dinozaury biorą udział w zawodach sportowych i śledzimy ich wyniki w tym formacie:
{
"scores": {
"bruhathkayosaurus": 55,
"lambeosaurus": 21,
"linhenykus": 80,
"pterodactyl": 93,
"stegosaurus": 5,
"triceratops": 22
}
}Aby pobrać wszystkie dinozaury z wynikiem powyżej 50, możemy wysłać to żądanie:
curl 'https://dinosaur-facts.firebaseio.com/scores.json?orderBy="$value"&startAt=50&print=pretty'
Więcej informacji o tym, jak sortowane są wartości null, logiczne, ciągi tekstowe i obiekty podczas korzystania z funkcji orderBy="$value", znajdziesz w sekcji Jak są porządkowane dane.
Filtrowanie złożone
Możemy łączyć ze sobą wiele parametrów, aby tworzyć bardziej złożone zapytania.
Ograniczanie zapytań
Parametry limitToFirst i limitToLast służą do ustawiania maksymalnej liczby dzieci, dla których mają być odbierane dane. Jeśli ustawimy limit 100, otrzymamy tylko maksymalnie 100 pasujących dzieci. Jeśli w naszej bazie danych jest mniej niż 100 wiadomości, otrzymamy wszystkie wiadomości od dziecka. Jeśli jednak mamy ponad 100 wiadomości, otrzymamy dane tylko dla 100 z nich. Będzie to pierwszych 100 uporządkowanych wiadomości, jeśli używamy limitToFirst, lub ostatnich 100 uporządkowanych wiadomości, jeśli używamy limitToLast.
Korzystając z naszej bazy danych o dinozaurach i orderBy, możemy znaleźć 2 najcięższe dinozaury:
curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="weight"&limitToLast=2&print=pretty'
Podobnie możemy znaleźć 2 najkrótsze dinozaury za pomocą funkcji limitToFirst:
curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="height"&limitToFirst=2&print=pretty'
Możemy też wykonywać zapytania o limit za pomocą orderBy="$value". Jeśli chcemy utworzyć ranking 3 najlepszych zawodników w dino sporcie, możemy to zrobić w ten sposób:
curl 'https://dinosaur-facts.firebaseio.com/scores.json?orderBy="$value"&limitToLast=3&print=pretty'
Zapytania dotyczące zakresu
Użycie funkcji startAt, endAt i equalTo pozwala nam wybrać dowolne punkty początkowe i końcowe zapytań. Jeśli na przykład chcemy znaleźć wszystkie dinozaury o wysokości co najmniej 3 metrów, możemy połączyć orderBy i startAt:
curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="height"&startAt=3&print=pretty'
Możemy użyć znaku endAt, aby znaleźć wszystkie dinozaury, których nazwy występują przed słowem Pterodactyl w porządku leksykograficznym:
curl 'https://dinosaur-facts.firebaseio.com/dinosaurs.json?orderBy="$key"&endAt="pterodactyl"&print=pretty'
Możemy połączyć startAt i endAt, aby ograniczyć oba końce zapytania.
Poniższy przykład znajduje 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 zakresowe są też przydatne, gdy musisz podzielić dane na strony.
Łączę wszystko w całość
Możemy łączyć wszystkie te techniki, aby tworzyć złożone zapytania. Możesz na przykład znaleźć nazwy wszystkich dinozaurów, które są niższe lub tak samo wysokie jak nasz ulubiony gatunek, czyli 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"
Sposób porządkowania danych
W tej sekcji wyjaśniamy, jak są uporządkowane dane w przypadku użycia każdego z 3 parametrów filtrowania.
orderBy
Gdy używasz funkcji orderBy z nazwą klucza podrzędnego, dane zawierające określony klucz podrzędny są uporządkowane w ten sposób:
-
Najpierw pojawiają się dzieci z wartością
nulldla określonego klucza dziecka. -
Następnie pojawią się elementy podrzędne z wartością
falsedla określonego klucza elementu podrzędnego. Jeśli wiele elementów podrzędnych ma wartośćfalse, są one sortowane leksykograficznie według klucza. -
Następnie pojawią się elementy podrzędne z wartością
truedla określonego klucza elementu podrzędnego. Jeśli kilka elementów podrzędnych ma wartośćtrue, są one sortowane leksykograficznie według klucza. - Następnie pojawiają się elementy podrzędne z wartością liczbową, posortowane w kolejności rosnącej. Jeśli kilka elementów podrzędnych ma tę samą wartość liczbową w przypadku określonego węzła podrzędnego, są one sortowane według klucza.
- Ciągi znaków występują po liczbach i są sortowane leksykograficznie w kolejności rosnącej. Jeśli kilka węzłów podrzędnych ma tę samą wartość w przypadku określonego węzła podrzędnego, są one porządkowane leksykograficznie według klucza.
- Obiekty są umieszczane na końcu i sortowane leksykograficznie według klucza w kolejności rosnącej.
orderBy="$key"
Jeśli do sortowania danych użyjesz parametru orderBy="$key", dane będą zwracane w kolejności rosnącej według klucza w ten sposób: Pamiętaj, że klucze mogą być tylko ciągami znaków.
- Najpierw pojawiają się dzieci z kluczem, który można przeanalizować jako 32-bitową liczbę całkowitą, posortowane w kolejności rosnącej.
- Następnie pojawiają się dzieci z wartością ciągu znaków jako kluczem, posortowane leksykograficznie w kolejności rosnącej.
orderBy="$value"
Jeśli do sortowania danych używasz parametru orderBy="$value", elementy podrzędne będą uporządkowane według ich wartości. Kryteria kolejności są takie same jak w przypadku danych uporządkowanych według klucza podrzędnego, z tym wyjątkiem, że zamiast wartości określonego klucza podrzędnego używana jest wartość węzła.
orderBy="$priority"
Jeśli do sortowania danych używasz parametru orderBy="$priority", kolejność elementów podrzędnych jest określana na podstawie ich priorytetu i klucza w ten sposób: Pamiętaj, że wartości priorytetu mogą być tylko liczbami lub ciągami znaków.
- Najpierw wyświetlane są elementy podrzędne bez priorytetu (domyślnego).
- Następnie wyświetlane są treści dla dzieci z numerem jako priorytetem. Są one posortowane numerycznie według priorytetu, od najmniejszego do największego.
- Dzieci z ciągiem znaków jako priorytetem są ostatnie. Są one sortowane leksykograficznie według priorytetu.
- Jeśli 2 węzły podrzędne mają ten sam priorytet (w tym brak priorytetu), są sortowane według klucza. Najpierw pojawiają się klucze numeryczne (posortowane numerycznie), a potem pozostałe klucze (posortowane leksykograficznie).
Więcej informacji o priorytetach znajdziesz w dokumentacji API.
Streaming z interfejsu REST API
Punkty końcowe REST Firebase obsługują protokół EventSource / Server-Sent Events, co ułatwia przesyłanie strumieniowe zmian do jednej lokalizacji w naszej bazie danych Firebase.
Aby rozpocząć strumieniowe przesyłanie danych, musimy wykonać te czynności:
-
Ustaw nagłówek Accept klienta na
text/event-stream - Przestrzeganie przekierowań HTTP, w szczególności kodu stanu HTTP 307
-
Dołącz parametr zapytania
auth, jeśli lokalizacja bazy danych Firebase wymaga uprawnień do odczytu.
W zamian serwer będzie wysyłać nazwane zdarzenia, gdy stan danych pod żądanym adresem URL ulegnie zmianie. Struktura tych wiadomości jest zgodna z protokołem EventSource:
event: event name data: JSON encoded data payload
Serwer może wysyłać te zdarzenia:
| put | Dane zakodowane w formacie JSON będą obiektem z 2 kluczami: path i data. Klucz path wskazuje lokalizację względem adresu URL żądania. Klient powinien zastąpić wszystkie dane w tej lokalizacji w pamięci podręcznej danymi podanymi w wiadomości. |
| patch | Dane zakodowane w formacie JSON będą obiektem z 2 kluczami: path i data. Ś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 dla 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 Firebase Realtime Database Security Rules spowoduje, że odczyt w żądanej lokalizacji nie będzie już dozwolony. |
| auth_revoked | Dane tego zdarzenia to ciąg znaków wskazujący, że dane logowania utraciły ważność. To zdarzenie zostanie wysłane, gdy podany parametr autoryzacji nie będzie już ważny. |
Poniżej znajdziesz przykład zestawu zdarzeń, które serwer może wysłać:
// 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, zapoznaj się z Firego, czyli zewnętrzną otoczką interfejsów API REST i Streaming Firebase.