Recupero dei dati in corso...

Lettura dei dati con GET

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

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

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

Aggiunta di 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 Riferimento API REST.

auth

Il parametro di richiesta auth consente di accedere ai dati protetti da Firebase Realtime Database Security Rules, ed è supportati da tutti i tipi di richiesta. L'argomento può essere il segreto della tua app Firebase o un token di autenticazione, come descritto nella sezione Utenti nei progetti Firebase. Nell'esempio seguente inviamo una richiesta GET con un parametro auth, dove CREDENTIAL è il secret della tua 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 viene specificato print=silent, viene restituito un 204 No Content in caso di esito positivo.

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

callback

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

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

poco profondo

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. Ciò limiterà la profondità dei dati restituiti. Se i dati nella posizione sono di tipo JSON primitivo (stringa, numero, o booleano), il suo valore verrà semplicemente restituito. Se lo snapshot dei dati nella località è un file JSON i valori per ogni chiave verranno troncati a true. Ad esempio, utilizzando i dati seguenti:

{
  "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 di curl:

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

timeout

Utilizzalo per limitare il tempo necessario per la lettura sul lato server. Se una lettura non termina entro il tempo previsto, termina con una richiesta HTTP errore 400. Ciò è particolarmente utile quando prevedi un trasferimento di dati ridotto e non vuoi aspettare troppo a lungo per recuperare un sottoalbero potenzialmente enorme. Il tempo di lettura effettivo può 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à. In caso contrario specificato, il valore massimo di timeout di 15min sarà applicati. Se il valore di timeout non è positivo o supera il limite massimo, la richiesta verrà rifiutata con un errore HTTP 400. Nell'esempio seguente, la richiesta GET include un timeout di 10 secondi.

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

Applicazione di filtri ai dati

Possiamo costruire query per filtrare i dati in base a vari fattori. Per iniziare, specifica in che modo vuoi che i dati vengano filtrati utilizzando l'orderBy . Successivamente, puoi combinare orderBy con uno qualsiasi degli altri cinque parametri: limitToFirst, limitToLast, startAt e endAt e equalTo.

Poiché tutti noi di Firebase pensiamo che i dinosauri siano fantastici, utilizzeremo uno snippet da 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 poi deve essere combinata con uno o più dei seguenti parametri: startAt, endAt, limitToFirst, limitToLast o equalTo.

Filtro in base a una chiave figlio specificata

Possiamo filtrare i nodi in base a una chiave figlio comune passando questa chiave all'elemento orderBy . Ad esempio, per recuperare tutti i dinosauri con un'altezza superiore a 3, possiamo procedere nel seguente modo:

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

I nodi privi della chiave figlio applicata verranno ordinati con il valore null. Per maggiori dettagli su come vengono consulta la sezione Come vengono ordinati i dati.

Firebase supporta anche le query ordinate in base a elementi secondari con un alto grado di nidificazione, anziché solo quelli di un livello inferiore. È utile se i dati sono molto nidificati in questo modo:

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

Per eseguire una 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. Utilizzo del parametro orderBy volte nella stessa richiesta genera un errore.

Filtro per chiave

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

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

Filtri per valore

Possiamo filtrare i nodi in base al valore delle chiavi figlio usando l'orderBy="$value" . Supponiamo che i dinosauri partecipino a una gara di dinosauro e di mantenere dei 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 Come vengono ordinati i dati per una spiegazione su come vengono ordinati i valori di null, booleani, stringhe e oggetti quando utilizzi orderBy="$value".

Filtraggio complesso

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

Limita query

I parametri limitToFirst e limitToLast vengono utilizzati per impostare numero massimo di publisher secondari per cui ricevere dati. Se impostiamo un limite di 100, ricevere fino a 100 account secondari corrispondenti. Se abbiamo meno di 100 messaggi archiviati nei nostri riceveremo ogni figlio. Tuttavia, se abbiamo più di 100 messaggi, riceveranno dati per 100 di questi messaggi. Questi saranno i primi 100 messaggi ordinati utilizzando limitToFirst o gli ultimi 100 messaggi ordinati se utilizziamo limitToLast.

Utilizzando il nostro database dei dati 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ù brevi utilizzando limitToFirst:

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

Possiamo anche effettuare query relative alle limitazioni con orderBy="$value". Se vogliamo creare una classifica con i tre concorrenti di Dino Sports con il punteggio più alto, possiamo procedere nel seguente modo:

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

Query intervallo

L'utilizzo di startAt, endAt e equalTo ci consente di scegliere punti di partenza e di arrivo arbitrari per le nostre query. Ad esempio, per trovare tutti 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 il cui nome viene prima di Pterodattilo lessicograficamente:

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

Possiamo combinare startAt e endAt per limitare entrambe le estremità della query. L'esempio seguente 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 sugli intervalli sono utili anche quando devi impaginare i dati.

Riepilogo

Possiamo combinare tutte queste tecniche per creare query complesse. Ad esempio, potresti voler per trovare il nome di tutti i dinosauri di altezza uguale o inferiore a quella che abbiamo gentile, 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.

ordine

Quando utilizzi orderBy con il nome di una chiave secondaria, i dati che contengono il la chiave secondaria verrà ordinata nel seguente modo:

  1. Gli elementi secondari con un valore null per la chiave secondaria specificata vengono visualizzati per primi.
  2. Seguono gli elementi secondari con un valore di false per la chiave secondaria specificata. Se più elementi secondari hanno un valore false, vengono ordinati lessicografica per chiave.
  3. Gli elementi secondari con un valore pari a true per la chiave secondaria specificata vengono visualizzati dopo. Se più elementi secondari hanno un valore true, sono ordinati lessicograficamente per chiave.
  4. Gli elementi secondari con un valore numerico vengono visualizzati dopo, in ordine crescente. Se più elementi figli hanno lo stesso valore numerico per il nodo figlio specificato, vengono ordinati in base alla chiave.
  5. Le stringhe vengono visualizzate dopo i numeri e sono ordinate in ordine crescente in base al codice. Se più i nodi figlio hanno lo stesso valore per il nodo figlio specificato, sono ordinati meno graficamente per chiave.
  6. Gli oggetti sono gli ultimi e sono ordinati lessicograficamente per chiave in ordine crescente.
I risultati filtrati vengono restituiti senza ordine. 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, vengono restituiti i dati in ordine crescente per chiave, come segue. Tieni presente che le chiavi possono essere solo stringhe.

  1. Gli elementi secondari con una chiave analizzabile come numero intero a 32 bit vengono inseriti per primi, ordinati in ordine crescente. ordine.
  2. Figli con un valore stringa come chiave successivo, ordinati in ordine decrescente in ordine crescente ordine.

orderBy="$value"

Quando utilizzi il parametro orderBy="$value" per ordinare i dati, i bambini: sono ordinati in base al valore. I criteri di ordinamento sono gli stessi dei dati ordinati in base a una chiave figlio, a parte il valore del nodo, invece del valore di una chiave figlio specificata.

orderBy="$Priority"

Quando utilizzi il parametro orderBy="$priority" per ordinare i dati, l'ordine delle sono determinati in base alla loro priorità e chiave come segue. Ricorda che i valori di priorità possono essere solo numeri o stringhe.

  1. I bambini senza priorità (valore predefinito) vengono visualizzati per primi.
  2. I bambini la cui priorità è un numero. Sono ordinati numericamente per priorità, da piccolo a grande.
  3. I publisher secondari con una stringa come priorità vengono definiti per ultimi. Sono ordinate in ordine lessicografico in base alla priorità.
  4. Ogni volta che due elementi secondari hanno la stessa priorità (inclusa nessuna priorità), vengono ordinati per chiave. Le chiavi numeriche vengono visualizzate per prime (ordinate numericamente), seguite dalle chiavi rimanenti (ordinate lessicograficamente).

Per ulteriori informazioni sulle priorità, consulta Riferimento API.

Streaming dall'API REST

Gli endpoint REST Firebase supportano il protocollo EventSource / protocollo degli eventi inviati dal server, che semplifica lo streaming delle modifiche apportate a una singola sede delle nostre il database Firebase.

Per iniziare a usare i flussi di dati, dobbiamo fare quanto segue:

  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 autorizzazione alla lettura

In cambio, il server invierà eventi denominati man mano che cambia lo stato dei dati nell'URL richiesto. La struttura di questi messaggi è conforme al protocollo EventSource:

event: event name
data: JSON encoded data payload

Il server potrebbe inviare i seguenti eventi:

put I dati con codifica JSON saranno un oggetto con due chiavi: percorso e dati
Il percorso punta a una posizione relativa all'URL della richiesta
Il client deve sostituire tutti i dati in quella posizione nella cache con quelli contenuti nel messaggio.
patch I dati con codifica JSON saranno un oggetto con due chiavi: percorso e dati
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 di 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 il Firebase Realtime Database Security Rules causa la mancata autorizzazione di una lettura nella posizione richiesta
autorizzazione_revocata I dati relativi a questo evento sono una stringa che indica che la credenziale è scaduta
Questo evento verrà inviato quando il parametro di autenticazione fornito non sarà più valido

Di seguito è riportato un esempio di un insieme di eventi che il server potrebbe 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 Firebase REST e Streaming.