Questo documento descrive alcune tecniche che puoi utilizzare per migliorare le prestazioni della tua applicazione. In alcuni casi, vengono utilizzati esempi di altre API o API generiche per illustrare le idee presentate. Tuttavia, gli stessi concetti sono validi per l'API della libreria di Google Foto.
Compressione mediante gzip
Un modo semplice e pratico per ridurre la larghezza di banda necessaria per ogni richiesta è abilitare la compressione gzip. Sebbene ciò richieda più tempo di CPU per decomprimere i risultati, il compromesso con i costi di rete lo rende molto utile.
Per ricevere una risposta con codifica gzip devi fare due cose: impostare un'intestazione Accept-Encoding
e modificare lo user agent in modo che contenga la stringa gzip
. Ecco un esempio di intestazioni HTTP formattate correttamente per attivare la compressione gzip:
Accept-Encoding: gzip User-Agent: my program (gzip)
Lavorare con risorse parziali
Un altro modo per migliorare le prestazioni delle chiamate API consiste nel richiedere solo la porzione di dati che ti interessa. Ciò consente all'applicazione di evitare di trasferire, analizzare e archiviare i campi non necessari, in modo da utilizzare risorse come rete, CPU e memoria in modo più efficiente.
Risposta parziale
Per impostazione predefinita, il server restituisce la rappresentazione completa di una risorsa dopo l'elaborazione delle richieste. Per ottenere prestazioni migliori, puoi chiedere al server di inviare solo i campi effettivamente necessari e ottenere invece una risposta parziale.
Per richiedere una risposta parziale, utilizza il parametro di richiesta fields
per specificare i campi che vuoi restituire. Puoi utilizzare questo parametro con qualsiasi richiesta che restituisce dati di risposta.
Esempio
L'esempio seguente mostra l'uso del parametro fields
con un'API "Demo" generica (immaginaria).
Richiesta semplice: questa richiesta GET
HTTP omette il parametro fields
e restituisce la risorsa completa.
https://www.googleapis.com/demo/v1
Risposta completa della risorsa: i dati completi della risorsa includono i campi seguenti, insieme a molti altri che sono stati omessi per brevità.
{ "kind": "demo", ... "items": [ { "title": "First title", "comment": "First comment.", "characteristics": { "length": "short", "accuracy": "high", "followers": ["Jo", "Will"], }, "status": "active", ... }, { "title": "Second title", "comment": "Second comment.", "characteristics": { "length": "long", "accuracy": "medium" "followers": [ ], }, "status": "pending", ... }, ... ] }
Richiesta di una risposta parziale: la seguente richiesta per questa stessa risorsa utilizza il parametro fields
per ridurre in modo significativo la quantità di dati restituiti.
https://www.googleapis.com/demo/v1?fields=kind,items(title,characteristics/length)
Risposta parziale: in risposta alla richiesta precedente, il server invia una risposta contenente solo le informazioni sul tipo e un array di elementi essenziali che include solo il titolo HTML e le informazioni sulle caratteristiche della lunghezza in ciascun elemento.
200 OK
{ "kind": "demo", "items": [{ "title": "First title", "characteristics": { "length": "short" } }, { "title": "Second title", "characteristics": { "length": "long" } }, ... ] }
Nota che la risposta è un oggetto JSON che include solo i campi selezionati e i relativi oggetti padre che contengono.
Di seguito vengono illustrati i dettagli su come formattare il parametro fields
, seguiti da ulteriori dettagli su cosa viene restituito esattamente nella risposta.
Riepilogo della sintassi dei parametri dei campi
Il formato del valore del parametro di richiesta fields
non si basa sulla sintassi XPath. La sintassi supportata è riassunta di seguito e ulteriori esempi sono forniti nella sezione seguente.
- Utilizza un elenco separato da virgole per selezionare più campi.
- Utilizza
a/b
per selezionare un campob
nidificato all'interno del campoa
; utilizzaa/b/c
per selezionare un campoc
nidificato all'interno dib
.
Eccezione: per le risposte dell'API che utilizzano wrapper "data", in cui la risposta è nidificata all'interno di un oggetto
data
simile adata: { ... }
, non includere "data
" nella specificafields
. L'inclusione dell'oggetto dati con una specifica dei campi comedata/a/b
causa un errore. Usa invece una specificafields
comea/b
. - Utilizza un sottoselettore per richiedere un insieme di sottocampi specifici di array o oggetti inserendo le espressioni tra parentesi "
( )
".Ad esempio:
fields=items(id,author/email)
restituisce solo l'ID articolo e l'email dell'autore per ciascun elemento nell'array items. Puoi anche specificare un singolo sottocampo, dovefields=items(id)
equivale afields=items/id
. - Se necessario, utilizza caratteri jolly nelle selezioni dei campi.
Ad esempio:
fields=items/pagemap/*
seleziona tutti gli oggetti in una mappa di pagina.
Altri esempi di utilizzo del parametro campi
Gli esempi riportati di seguito includono descrizioni di come il valore del parametro fields
influisce sulla risposta.
Nota: come per tutti i valori dei parametri di query, il valore del parametro fields
deve avere codifica URL. Per una migliore leggibilità, negli esempi in questo documento viene omessa la codifica.
- Identifica i campi che vuoi restituire oppure effettua selezioni di campi.
- Il valore parametro di richiesta
fields
è un elenco di campi separati da virgole e ogni campo viene specificato in relazione alla radice della risposta. Quindi, se esegui un'operazione list, la risposta è una raccolta e generalmente include un array di risorse. Se stai eseguendo un'operazione che restituisce una singola risorsa, i campi vengono specificati in relazione a quella risorsa. Se il campo selezionato è (o fa parte di) un array, il server restituisce la parte selezionata di tutti gli elementi dell'array.
Ecco alcuni esempi a livello di raccolta:
Esempi Effetto items
Restituisce tutti gli elementi nell'array di elementi, inclusi tutti i campi di ogni elemento, ma non gli altri. etag,items
Restituisce sia il campo etag
sia tutti gli elementi nell'array di elementi.items/title
Restituisce solo il campo title
per tutti gli elementi nell'array items.
Ogni volta che viene restituito un campo nidificato, la risposta include gli oggetti padre che contengono. I campi principali non includono altri campi secondari, a meno che non vengano selezionati esplicitamente.context/facets/label
Restituisce solo il campo label
per tutti i membri dell'arrayfacets
, che a sua volta è nidificato sotto l'oggettocontext
.items/pagemap/*/title
Per ogni elemento nell'array items, restituisce solo il campo title
(se presente) di tutti gli oggetti secondari dipagemap
.
Ecco alcuni esempi a livello di risorsa:
Esempi Effetto title
Restituisce il campo title
della risorsa richiesta.author/uri
Restituisce il sottocampo uri
dell'oggettoauthor
nella risorsa richiesta.links/*/href
Restituisce il campo href
di tutti gli oggetti secondari dilinks
. - Richiedi solo parti di campi specifici utilizzando le selezioni secondarie.
- Se la tua richiesta specifica campi specifici, il server restituisce per impostazione predefinita gli oggetti o gli elementi array nella loro interezza. Puoi specificare una risposta che include solo alcuni sottocampi. A tale scopo, utilizza la sintassi di selezione secondaria "
( )
", come nell'esempio riportato di seguito.Esempio Effetto items(title,author/uri)
Restituisce solo i valori di title
euri
dell'autore per ciascun elemento nell'array di elementi.
Gestione delle risposte parziali
Dopo che un server ha elaborato una richiesta valida che include il parametro di ricerca fields
, invia un codice di stato HTTP 200 OK
insieme ai dati richiesti. Se il parametro di query fields
contiene un errore o non è comunque valido, il server restituisce un codice di stato HTTP 400 Bad Request
e un messaggio di errore che indica all'utente l'errore che si è verificato nella selezione dei campi (ad esempio, "Invalid field selection a/b"
).
Ecco l'esempio di risposta parziale mostrato nella sezione introduttiva sopra riportata. La richiesta utilizza il parametro fields
per specificare quali campi restituire.
https://www.googleapis.com/demo/v1?fields=kind,items(title,characteristics/length)
La risposta parziale sarà simile alla seguente:
200 OK
{ "kind": "demo", "items": [{ "title": "First title", "characteristics": { "length": "short" } }, { "title": "Second title", "characteristics": { "length": "long" } }, ... ] }
Nota:per le API che supportano i parametri di query per l'impaginazione dei dati (ad esempio maxResults
e nextPageToken
), utilizzali per ridurre i risultati di ogni query a una dimensione gestibile. In caso contrario, i possibili miglioramenti delle prestazioni con una risposta parziale potrebbero non essere realizzati.