Questo documento illustra 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 applicabili all'API Cloud Resource Manager.
Compressione con gzip
Un modo semplice e pratico per ridurre la larghezza di banda necessaria per ogni richiesta è attivare la compressione gzip. Sebbene questa richieda tempo di CPU aggiuntivo per decomprimere i risultati, il vantaggio a livello di costi di rete di solito la rende molto utile.
Per ricevere una risposta con codifica gzip, devi eseguire due operazioni: impostare un'intestazione Accept-Encoding e modificare il tuo 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)
Utilizzo di risorse parziali
Un altro modo per migliorare le prestazioni delle chiamate API è richiedere solo la parte di dati che ti interessa. In questo modo, l'applicazione evita di trasferire, analizzare e archiviare i campi non necessari, con una maggiore efficienza nell'utilizzo delle risorse, tra cui rete, CPU e memoria.
Risposta parziale
Per impostazione predefinita, il server restituisce la rappresentazione completa di una risorsa dopo aver elaborato le richieste. Per migliorare le prestazioni, puoi chiedere al server di inviare solo i campi di cui hai effettivamente bisogno e ricevere quindi una risposta parziale.
Per richiedere una risposta parziale, utilizza il parametro di richiesta fields per specificare i campi che vuoi che vengano restituiti. Puoi utilizzare questo parametro con qualsiasi richiesta che restituisce dati di risposta.
Esempio
L'esempio seguente mostra l'utilizzo del parametro fields con un'API "Demo" generica (fittizia).
Richiesta semplice: questa richiesta HTTP GET 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 seguenti campi, oltre 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 risposta parziale: la seguente richiesta per la 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, oltre a un array "items" ridotto, che include solo il titolo HTML e informazioni sulla caratteristica "length" in ogni elemento.
200 OK
{
"kind": "demo",
"items": [{
"title": "First title",
"characteristics": {
"length": "short"
}
}, {
"title": "Second title",
"characteristics": {
"length": "long"
}
},
...
]
}Tieni presente che la risposta è un oggetto JSON che include solo i campi selezionati e gli oggetti principali che li contengono.
Di seguito sono riportati i dettagli su come formattare il parametro fields, seguiti da ulteriori dettagli su cosa viene restituito esattamente nella risposta.
Riepilogo della sintassi del parametro fields
Il formato del valore del parametro di richiesta fields si basa liberamente sulla sintassi XPath. La sintassi supportata è riassunta di seguito e altri esempi sono forniti nella sezione seguente.
- Utilizza un elenco separato da virgole per selezionare più campi.
- Utilizza
a/bper selezionare un campobnidificato all'interno del campoa; utilizzaa/b/cper selezionare un campocnidificato all'interno dib.
Eccezione: per le risposte dell'API che utilizzano wrapper "data", in cui la risposta è nidificata all'interno di un oggetto
datasimile adata: { ... }, non includere "data" nella specifica difields. L'inclusione dell'oggetto "data" con una specifica di fields comedata/a/bcausa un errore. Utilizza invece una specifica difieldscomea/b. - Utilizza un selettore secondario 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 elemento e l'email dell'autore per ogni elemento nell'array "items". Puoi anche specificare un singolo sottocampo, dovefields=items(id)è equivalente afields=items/id. - Utilizza i caratteri jolly nelle selezioni dei campi, se necessario.
Ad esempio,
fields=items/pagemap/*seleziona tutti gli oggetti in una pagemap.
Altri esempi di utilizzo del parametro fields
Gli esempi riportati di seguito includono descrizioni dell'impatto del valore del parametro fields sulla risposta.
Nota: come per tutti i valori dei parametri di query, il valore del parametro fields deve essere codificato nell'URL. Per una maggiore leggibilità, gli esempi in questo documento omettono la codifica.
- Identifica i campi che vuoi che vengano restituiti o effettua selezioni di campi.
- Il valore del parametro di richiesta
fieldsè un elenco di campi separati da virgole e ogni campo è specificato rispetto alla radice della risposta. Pertanto, se esegui un'operazione list, la risposta è una raccolta e in genere include un array di risorse. Se stai eseguendo un'operazione che restituisce una singola risorsa, i campi vengono specificati rispetto 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 itemsRestituisce tutti gli elementi nell'array "items", inclusi tutti i campi di ogni elemento, ma nessun altro campo. etag,itemsRestituisce sia il campo etagsia tutti gli elementi nell'array "items".items/titleRestituisce solo il campo titleper tutti gli elementi dell'array "items".
Ogni volta che viene restituito un campo nidificato, la risposta include gli oggetti principali che lo contengono. I campi principali non includono altri campi secondari, a meno che non siano selezionati a loro volta in modo esplicito.context/facets/labelRestituisce solo il campo labelper tutti i membri dell'arrayfacets, che è a sua volta nidificato nell'oggettocontext.items/pagemap/*/titlePer ogni elemento dell'array "items", restituisce solo il campo title(se presente) di tutti gli oggetti secondari dipagemap.
Ecco alcuni esempi a livello di risorsa:
Esempi Effetto titleRestituisce il campo titledella risorsa richiesta.author/uriRestituisce il sottocampo uridell'oggettoauthornella risorsa richiesta.links/*/hrefRestituisce il campo hrefdi tutti gli oggetti secondari dilinks. - Richiedi solo parti di campi specifici utilizzando le sottoselezioni.
- Per impostazione predefinita, se nella richiesta sono specificati particolari campi, il server restituisce gli oggetti o gli elementi dell'array nella loro interezza. Puoi specificare una risposta che includa solo determinati sottocampi. Per farlo, utilizza la sintassi di sottoselezione "
( )", come nell'esempio seguente.Esempio Effetto items(title,author/uri)Restituisce solo i valori di titleeuridell'autore per ogni elemento dell'array "items".
Gestione delle risposte parziali
Dopo che un server ha elaborato una richiesta valida che include il parametro di query fields, restituisce un codice di stato HTTP 200 OK insieme ai dati richiesti. Se il parametro di query fields presenta un errore o non è valido, il server restituisce un codice di stato HTTP 400 Bad Request, insieme a un messaggio di errore che indica all'utente il problema relativo alla selezione dei campi (ad esempio, "Invalid field selection a/b").
Ecco l'esempio di risposta parziale mostrato nella sezione introduttiva sopra. La richiesta utilizza il parametro fields per specificare i campi da restituire.
https://www.googleapis.com/demo/v1?fields=kind,items(title,characteristics/length)
La risposta parziale è la 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 es. maxResults e nextPageToken), utilizza questi parametri per ridurre i risultati di ogni query a dimensioni gestibili. In caso contrario, potresti non ottenere i miglioramenti delle prestazioni offerti dalla risposta parziale.