Recupero dei dati in corso...

Lettura dei dati con GET

Possiamo leggere i dati dal nostro database Firebase inviando una richiesta GET al relativo endpoint URL. Continuiamo con l'esempio del blog della sezione precedente e leggiamo tutti i dati dei post del blog:

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

Una richiesta riuscita sarà indicata da un codice di stato HTTP 200 OK e la risposta conterrà i dati che stiamo recuperando.

Aggiungere parametri URI

L'API REST accetta diversi parametri di query durante la lettura dei dati dal nostro database Firebase. Di seguito sono elencati i parametri più utilizzati. Per un elenco completo, consulta i riferimenti per l'API REST.

auth

Il parametro di richiesta auth consente l'accesso ai dati protetti da Firebase Realtime Database Security Rules ed è supportato da tutti i tipi di richiesta. L'argomento può essere il segreto della tua app Firebase o un token di autenticazione, come descritto in Utenti nei progetti Firebase. Nell'esempio seguente inviamo una richiesta GET con un parametro auth, dove CREDENTIAL è il secret dell'app Firebase o un token di autenticazione:

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

stampa

Se specifichi print=pretty, i dati vengono restituiti in un formato leggibile.

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

Se specifichi print=silent, in caso di esito positivo viene restituito 204 No Content.

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

callback

Per effettuare chiamate REST da un browser web tra domini, puoi utilizzare JSONP per racchiudere la risposta in una funzione di callback JavaScript. Aggiungi callback= per fare in modo che l'API REST racchiuda i dati restituiti nella funzione di callback che specifichi. Ad esempio:

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

shallow

Si tratta di una funzionalità avanzata, progettata per aiutarti a lavorare con set di dati di grandi dimensioni senza dover scaricare tutto. Per utilizzarlo, aggiungi shallow=true come parametro. In questo modo, la profondità dei dati restituiti verrà limitata. Se i dati nella posizione sono una primitiva JSON (stringa, numero o valore booleano), verrà restituito semplicemente il valore. Se lo snapshot dei dati nella posizione è un oggetto JSON, i valori di ogni chiave verranno troncati a true. Ad esempio, utilizzando i dati riportati di seguito:

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

Prova con questa richiesta curl:

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

timeout

Utilizza questa opzione per limitare la durata della lettura lato server. Se una richiesta di lettura non viene completata entro il tempo assegnato, termina con un errore HTTP 400. Ciò è particolarmente utile quando prevedi un piccolo trasferimento di dati e non vuoi aspettare troppo a lungo per recuperare un sottoalbero potenzialmente enorme. Il tempo di lettura effettivo potrebbe variare in base alle dimensioni dei dati e alla memorizzazione nella cache.

Specifica timeouts utilizzando il seguente formato: 3ms, 3s o 3min, con un numero e un'unità. Se non specificato, verrà applicato il valore massimo timeout di 15min. Se timeout non è positivo o supera il valore massimo, la richiesta verrà rifiutata con un errore HTTP 400. Nel seguente esempio, la richiesta GET include un timeout di 10 secondi.

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

Filtrare i dati

Possiamo creare query per filtrare i dati in base a vari fattori. Per iniziare, specifica come vuoi filtrare i dati utilizzando il parametro orderBy. Poi, combini orderBy con uno degli altri cinque parametri: limitToFirst, limitToLast, startAt, endAt e equalTo.

Poiché tutti noi di Firebase pensiamo che i dinosauri siano piuttosto interessanti, utilizzeremo un snippet di un database di esempio di fatti sui dinosauri per dimostrare come puoi filtrare i dati:

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

Possiamo filtrare i dati in tre modi: per chiave secondaria, per chiave o per valore. Una query inizia con uno di questi parametri e deve essere combinata con uno o più dei seguenti parametri: startAt, endAt, limitToFirst, limitToLast o equalTo.

Filtro in base a una chiave secondaria specificata

Possiamo filtrare i nodi in base a una chiave secondaria comune passando questa chiave al parametro orderBy. Ad esempio, per recuperare tutti i dinosauri con un'altezza superiore a 3, possiamo fare quanto segue:

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

Qualsiasi nodo che non ha la chiave figlio su cui stiamo filtrando verrà ordinato con un valore di null. Per informazioni dettagliate su come vengono ordinati i dati, vedi Come vengono ordinati i dati.

Firebase supporta anche le query ordinate in base ai nodi secondari nidificati in profondità, anziché solo ai nodi secondari di un livello inferiore. Questo è utile se hai dati nidificati in profondità come questi:

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

Per eseguire query sull'altezza ora, utilizziamo il percorso completo dell'oggetto anziché una singola chiave:

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

Le query possono filtrare solo in base a una chiave alla volta. L'utilizzo del parametro orderBy più volte nella stessa richiesta genera un errore.

Filtro per chiave

Possiamo anche filtrare i nodi in base alle chiavi utilizzando il parametro orderBy="$key". L'esempio seguente recupera tutti i dinosauri con un nome che inizia con la lettera a fino alla lettera m:

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

Filtro per valore

Possiamo filtrare i nodi in base al valore delle relative chiavi secondarie utilizzando il parametro orderBy="$value". Supponiamo che i dinosauri stiano organizzando una competizione sportiva e che noi stiamo tenendo traccia dei loro punteggi nel seguente formato:

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

Per recuperare tutti i dinosauri con un punteggio superiore a 50, potremmo effettuare la seguente richiesta:

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

Consulta la sezione Come vengono ordinati i dati per una spiegazione di come vengono ordinati i valori null, booleani, stringa e oggetto quando si utilizza orderBy="$value".

Filtro complesso

Possiamo combinare più parametri per creare query più complesse.

Limitare le query

I parametri limitToFirst e limitToLast vengono utilizzati per impostare un numero massimo di figli per i quali ricevere i dati. Se impostiamo un limite di 100, riceveremo solo fino a 100 figli corrispondenti. Se nel nostro database sono memorizzati meno di 100 messaggi, riceveremo tutti i figli. Tuttavia, se abbiamo più di 100 messaggi, riceveremo i dati solo per 100 di questi messaggi. Questi saranno i primi 100 messaggi ordinati se utilizziamo limitToFirst o gli ultimi 100 messaggi ordinati se utilizziamo limitToLast.

Utilizzando il nostro database sui dinosauri e orderBy, possiamo trovare i due dinosauri più pesanti:

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

Allo stesso modo, possiamo trovare i due dinosauri più bassi utilizzando limitToFirst:

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

Possiamo anche eseguire query sui limiti con orderBy="$value". Se vogliamo creare una classifica con i primi tre concorrenti di sport con dinosauri con il punteggio più alto, possiamo fare quanto segue:

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

Query sull'intervallo

L'utilizzo di startAt, endAt e equalTo ci consente di scegliere punti di inizio e fine arbitrari per le nostre query. Ad esempio, se volessimo trovare tutti i dinosauri alti almeno tre metri, possiamo combinare orderBy e startAt:

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

Possiamo utilizzare endAt per trovare tutti i dinosauri i cui nomi precedono Pterodactyl in ordine lessicografico:

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

Possiamo combinare startAt e endAt per limitare entrambi gli estremi della query. Il seguente esempio trova tutti i dinosauri il cui nome inizia con la lettera "b":

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

Le query di intervallo sono utili anche quando devi paginare i dati.

In sintesi

Possiamo combinare tutte queste tecniche per creare query complesse. Ad esempio, potresti voler trovare il nome di tutti i dinosauri di altezza inferiore o uguale a quella del nostro tipo preferito, lo Stegosauro:

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"

Come vengono ordinati i dati

Questa sezione spiega come vengono ordinati i dati quando utilizzi ciascuno dei tre parametri di filtro.

orderBy

Quando utilizzi orderBy con il nome di una chiave secondaria, i dati che contengono la chiave secondaria specificata verranno ordinati nel seguente modo:

  1. I bambini con un valore null per la chiave bambino specificata vengono visualizzati per primi.
  2. Seguono i figli con un valore di false per la chiave secondaria specificata. Se più elementi secondari hanno un valore di false, vengono ordinati lessicograficamente per chiave.
  3. Seguono i figli con un valore di true per la chiave secondaria specificata. Se più elementi secondari hanno un valore di true, vengono ordinati in ordine lessicografico in base alla chiave.
  4. Seguono i bambini con un valore numerico, ordinati in ordine crescente. Se più figli hanno lo stesso valore numerico per il nodo figlio specificato, vengono ordinati per chiave.
  5. Le stringhe vengono dopo i numeri e sono ordinate lessicograficamente in ordine crescente. Se più elementi secondari hanno lo stesso valore per il nodo secondario specificato, vengono ordinati in ordine lessicografico per chiave.
  6. Gli oggetti vengono per ultimi e sono ordinati lessicograficamente per chiave in ordine crescente.
I risultati filtrati vengono restituiti senza un ordine specifico. Se l'ordine dei dati è importante, devi ordinare i risultati nell'applicazione dopo che sono stati restituiti da Firebase.

orderBy="$key"

Quando utilizzi il parametro orderBy="$key" per ordinare i dati, questi vengono restituiti in ordine crescente per chiave come segue. Tieni presente che le chiavi possono essere solo stringhe.

  1. I bambini con una chiave che può essere analizzata come un numero intero a 32 bit vengono visualizzati per primi, in ordine crescente.
  2. I bambini con un valore stringa come chiave vengono dopo, ordinati in ordine lessicografico crescente.

orderBy="$value"

Quando utilizzi il parametro orderBy="$value" per ordinare i dati, gli elementi secondari vengono ordinati in base al loro valore. I criteri di ordinamento sono gli stessi dei dati ordinati in base a una chiave secondaria, tranne che viene utilizzato il valore del nodo anziché il valore di una chiave secondaria specificata.

orderBy="$priority"

Quando utilizzi il parametro orderBy="$priority" per ordinare i dati, l'ordine dei figli è determinato dalla priorità e dalla chiave nel seguente modo. Tieni presente che i valori di priorità possono essere solo numeri o stringhe.

  1. I bambini senza priorità (impostazione predefinita) vengono visualizzati per primi.
  2. Seguono i bambini con un numero come priorità. Sono ordinate numericamente per priorità, dal valore più basso a quello più alto.
  3. I bambini con una stringa come priorità vengono visualizzati per ultimi. Sono ordinati lessicograficamente in base alla priorità.
  4. Quando due nodi secondari hanno la stessa priorità (inclusa l'assenza di priorità), vengono ordinati per chiave. Vengono visualizzati prima i tasti numerici (ordinati numericamente), seguiti dai tasti rimanenti (ordinati lessicograficamente).

Per ulteriori informazioni sulle priorità, consulta il riferimento API.

Streaming dall'API REST

Gli endpoint REST di Firebase supportano il protocollo EventSource/Server-Sent Events, semplificando lo streaming delle modifiche a una singola posizione nel nostro database Firebase.

Per iniziare lo streaming, dobbiamo:

  1. Imposta l'intestazione Accept del client su text/event-stream
  2. Rispetta i reindirizzamenti HTTP, in particolare il codice di stato HTTP 307
  3. Includi il parametro di query auth se la posizione del database Firebase richiede l'autorizzazione di lettura

In cambio, il server invierà gli eventi denominati come stato dei dati all'URL richiesto cambia. La struttura di questi messaggi è conforme al protocollo EventSource:

event: event name
data: JSON encoded data payload

Il server può inviare i seguenti eventi:

put I dati codificati in formato JSON saranno un oggetto con due chiavi: path e data
Il percorso punta a una posizione relativa all'URL della richiesta
Il client deve sostituire tutti i dati in quella posizione nella cache con i dati forniti nel messaggio
patch I dati codificati in formato JSON saranno un oggetto con due chiavi: path e data
Il percorso punta a una posizione relativa all'URL della richiesta
Per ogni chiave nei dati, il client deve sostituire la chiave corrispondente nella cache con i dati per quella chiave nel messaggio
keep-alive I dati per questo evento sono nulli, non è richiesta alcuna azione
annulla I dati per questo evento sono nulli
Questo evento verrà inviato se Firebase Realtime Database Security Rules fa sì che la lettura nella posizione richiesta non sia più consentita
auth_revoked I dati per questo evento sono una stringa che indica che le credenziali sono scadute
Questo evento verrà inviato quando il parametro di autenticazione fornito non è più valido

Di seguito è riportato un esempio di un insieme di eventi che il server può inviare:

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

Se utilizzi Go, dai un'occhiata a Firego, un wrapper di terze parti per le API REST e di streaming di Firebase.