Utilizzare la libreria client JavaScript (v2.0)

Avviso: questa pagina riguarda le API di Google più vecchie, le API di dati di Google; è pertinente solo per le API elencate nella directory delle API di dati di Google, molte delle quali sono state sostituite con API più recenti. Per informazioni su una nuova API specifica, consulta la documentazione della nuova API. Per informazioni sulle autorizzazioni per le richieste con un'API più recente, vedi Autenticazione e autorizzazione degli Account Google.

Questo documento descrive come utilizzare la libreria client JavaScript per inviare query dell'API di dati Google e interpretare le risposte restituite.

Google offre una serie di librerie client, in vari linguaggi di programmazione, per interagire con i servizi che hanno API di dati. Utilizzando queste librerie, puoi creare richieste API, inviarle a un servizio e ricevere risposte.

Questo documento fornisce alcune informazioni generali sull'uso della libreria client JavaScript, insieme ad alcuni esempi di usi comuni.

Pubblico

Questo documento è destinato ai programmatori JavaScript che intendono scrivere applicazioni client che possono interagire con i servizi di dati di Google.

Questo documento presuppone che tu abbia un'idea generale del protocollo delle API di dati di Google, Presuppone inoltre che tu sappia programmare in JavaScript.

Per informazioni sulle classi e sui metodi forniti dalla libreria client, consulta la sezione Riferimento API della libreria client JavaScript (in formato JSdoc).

Questo documento è progettato per essere letto in ordine; ogni esempio si basa su esempi precedenti.

Termini e condizioni d'uso

L'utente accetta di rispettare i Termini e condizioni d'uso della libreria client JavaScript di Google quando utilizza la libreria client JavaScript.

Panoramica del modello dei dati e del flusso di controllo

La libreria client JavaScript utilizza un insieme di classi per rappresentare gli elementi utilizzati dalle API di dati di Google.

Nota: la rappresentazione di base dei dati è JSON, ma la libreria client fornisce un livello di astrazione, per cui non devi lavorare direttamente con i dati JSON. Se vuoi lavorare direttamente con JSON, senza la libreria client, consulta la sezione Utilizzo di JSON con le API di dati di Google.

La libreria fornisce metodi che ti consentono di inviare e ricevere dati in modo asincrono da un servizio con un'API di dati. Ad esempio, il metodo google.gdata.calendar.CalendarService.getEventsFeed() invia una richiesta di feed a Google Calendar. Uno dei parametri trasmessi è una funzione di continuazione, nota anche come callback; il servizio restituisce il feed in formato JSON chiamando la funzione di continuazione. Il client può quindi chiamare vari metodi get per utilizzare i dati sotto forma di oggetti JavaScript.

Per aggiungere una nuova voce, creala utilizzando i corsi e i metodi della libreria client, quindi chiama il metodo feed.insertEntry() per inviare la nuova voce al servizio. Fornisci nuovamente una funzione di continuazione, che il servizio chiama quando la voce è stata aggiunta correttamente.

Se non hai esperienza con JavaScript, la procedura di controllo potrebbe creare un po' di confusione. Dopo aver chiamato un metodo come getEventsFeed() o insertEntry(), nella maggior parte dei casi lo script termina. L'esecuzione riprende nella funzione di continuazione quando il servizio restituisce i dati richiesti. Pertanto, qualsiasi operazione che il client esegue sui dati restituiti deve essere eseguita nella funzione di continuazione o chiamata da tale funzione. Potrebbe essere necessario rendere alcune variabili globali per utilizzarle in più funzioni.

Per ulteriori informazioni su questo stile di programmazione, consulta la sezione "Stile di trasmissione continua" in Wikipedia.

Informazioni sugli ambienti supportati

Attualmente supportiamo solo applicazioni client JavaScript che vengono eseguite in una pagina web da un browser. I browser attualmente supportati sono:

  • Firefox 2.x e 3.x
  • Internet Explorer 6, 7 e 8
  • Safari 3 e 4
  • Google Chrome (tutte le versioni)

La libreria client JavaScript gestisce tutte le comunicazioni con il server del servizio. Se sei uno sviluppatore JS esperto, potresti pensare: "E per quanto riguarda la stessa norma di origine?" La libreria client JavaScript consente al client di inviare richieste di dati di Google da qualsiasi dominio mantenendo la conformità con il modello di sicurezza del browser.

Per una panoramica sull'autenticazione con le API di dati di Google, consulta la Panoramica sull'autenticazione delle API di dati di Google. Il resto del documento presuppone che tu abbia acquisito familiarità con le nozioni di base sul funzionamento del sistema.

Esempi di applicazioni client

Per vedere la libreria client JavaScript in azione, visita la nostra pagina di esempio.

Tutorial ed esempi

I seguenti esempi mostrano come inviare varie richieste API di dati utilizzando la libreria client JavaScript.

Per renderli più concreti, questi esempi mostrano come interagire con un servizio specifico: Google Calendar. Indicheremo i luoghi in cui Calendar è diverso da altri servizi Google per aiutarti ad adattare questi esempi per l'utilizzo con altri servizi. Per ulteriori informazioni su Calendar, vedi il documento Google Calendar Data API.

Caricamento della raccolta in corso...

Prima che il client possa utilizzare la libreria client, deve richiedere il codice libreria al server.

Inizia utilizzando un tag <script> nella sezione <head> del documento HTML per recuperare il caricatore dell'API Google AJAX:

<script type="text/javascript" src="https://www.google.com/jsapi"></script>

Puoi ridurre al minimo i roundtrip ai server di Google e ridurre la latenza precaricando la libreria. Per precaricare alcuni pacchetti direttamente dal caricatore dell'API Google AJAX (senza google.load(), vedi di seguito), utilizza quanto segue:

<script type="text/javascript"
      src="https://www.google.com/jsapi?autoload=%7Bmodules%3A%5B%7Bname%3Agdata%2Cversion%3A2.x%2Cpackages%3A%5Bblogger%2Ccontacts%5D%7D%5D%7D"></script>

Nota: l'URL src dello script deve essere completamente codificato nell'URL. Ad esempio,
<script type="text/javascript" src="https://www.google.com/jsapi?autoload={modules:[{name:gdata,version:2.x,packages:[blogger,contacts]}]}"></script>.

Se non stai caricando automaticamente i moduli, puoi caricare la libreria client di dati Google utilizzando l'esempio successivo nel codice di configurazione JavaScript, dopo aver recuperato il caricatore comune. Questa chiamata deve essere effettuata dalla sezione <head> del documento HTML (o da un file JavaScript incluso utilizzando un tag <script> nella sezione <head> del documento HTML):

google.load("gdata", "2");

In alternativa, puoi richiedere servizi specifici invece dell'intera libreria. Questo esempio scarica solo i pacchetti per Blogger e Contatti:

google.load("gdata", "2.x", {packages: ["blogger", "contacts"]});

Il secondo parametro per google.load() è il numero di versione richiesto della libreria client JavaScript.Il nostro schema di numerazione delle versioni viene modellato su quello utilizzato dall'API di Google Maps. Ecco i possibili numeri di versione e il loro significato:

"1"
L'ultima revisione dell'ultima versione principale.
"1.x"
L'ultima revisione della versione 1 principale.
"1.s"
L'ultima revisione stabile della versione 1 principale. Dichiariamo occasionalmente una determinata versione della libreria client come "stabile", in base al feedback che riceviamo dagli sviluppatori. Tuttavia, questa versione potrebbe non avere le funzionalità più recenti.
"1.0", "1.1" e così via
Una versione specifica della libreria, con un numero di revisione principale e secondario specificato.

Dopo aver chiamato google.load(), devi comunicare al caricatore di attendere il completamento del caricamento della pagina e poi chiamare il tuo codice:

google.setOnLoadCallback(getMyFeed);

Dove getMyFeed() è una funzione definita nella sezione successiva di questo documento. Utilizza questo approccio anziché collegare un gestore onload all'elemento <body>.

Richiedere un feed non autenticato

Per richiedere un feed non autenticato, aggiungi il seguente codice al file JavaScript o a un tag <script> nel file HTML.

Nel codice seguente, getMyFeed() è richiamato per primo (dal caricatore dell'API AJAX, come descritto nella sezione precedente).

Chiama setupMyService() per creare una connessione (rappresentata da un oggetto CalendarService) a Google Calendar. Abbiamo inserito il codice di creazione del servizio in una funzione separata per la modularità; successivamente, modificheremo la funzione setupMyService(), a seconda delle tue scelte di autenticazione.

Una volta configurato il servizio, getMyFeed() chiama il metodo getEventsFeed() della libreria client per richiedere il feed.

Abbiamo specificato l'URL del feed in una variabile globale in modo che possa essere utilizzato nelle funzioni successive. In questo esempio, utilizziamo l'URL del feed pubblico (non autenticato) per un utente denominato liz@gmail.com. Per rappresentare l'utente autenticato, puoi anche utilizzare default al posto dell'indirizzo email dell'utente.

var feedUrl = "http://www.google.com/calendar/feeds/liz@gmail.com/public/full";

function setupMyService() {
  var myService = new google.gdata.calendar.CalendarService('exampleCo-exampleApp-1');
  return myService;
}

function getMyFeed() {
  myService = setupMyService();

  myService.getEventsFeed(feedUrl, handleMyFeed, handleError);
}

Stiamo rendendo myService una variabile globale per facilitarne l'utilizzo nelle funzioni successive.

Per utilizzare il codice sopra riportato nel tuo client, devi utilizzare l'indirizzo email di un utente reale per un account Calendar con un calendario condiviso pubblicamente.

Nota: quando crei un nuovo oggetto CalendarService, la libreria client chiama un metodo denominato google.gdata.client.init(), che verifica che il browser su cui è in esecuzione il client sia supportato. Se si verifica un errore, la libreria client mostra all'utente un messaggio di errore. Se vuoi gestire autonomamente questo tipo di errore, puoi chiamare esplicitamente google.gdata.client.init(handleInitError) prima di creare il servizio, dove handleInitError() è la tua funzione. Se si verifica un errore di inizializzazione, la funzione riceve un oggetto Error standard; puoi fare tutto ciò che vuoi con l'oggetto.

Nella chiamata a getEventsFeed(), il secondo argomento è handleMyFeed, che è una funzione di callback; vedi sotto. Google Calendar elabora la richiesta e, se è andata a buon fine, passa un oggetto "feed root" contenente il feed richiesto al callback. La radice del feed è un oggetto contenitore che contiene un feed.

Il terzo argomento per getEventsFeed() è una funzione facoltativa di gestione degli errori; se la libreria client riscontra un errore, chiama il gestore di errori specificato anziché la funzione di callback di operazione riuscita. L'oggetto trasmesso dalla libreria client come argomento per il gestore di errori è un'istanza dell'oggetto JavaScript Error, con un'ulteriore proprietà cause.

Di seguito sono riportate alcune versioni semplici della funzione di callback e il gestore degli errori:

function handleMyFeed(myResultsFeedRoot) {
  alert("This feed's title is: " + myResultsFeedRoot.feed.getTitle().getText());
}

function handleError(e) {
  alert("There was an error!");
  alert(e.cause ? e.cause.statusText : e.message);
}

Stiamo gestendo gli errori semplicemente mostrandoli all'utente; il gestore degli errori del tuo client dovrebbe probabilmente essere più sofisticato. In alcuni contesti, potrebbe non essere specificata alcuna causa, pertanto in questi casi il nostro gestore di errori usa il codice per visualizzare la proprietà message standard.

Tieni presente che, poiché questo codice non esegue l'autenticazione, puoi utilizzarlo solo per ottenere un feed pubblico.

Autenticazione

La libreria client JavaScript può essere utilizzata in due modalità. Per scrivere un gadget, viene usato un proxy chiamato OAuth. Se si accede da un'applicazione JavaScript autonoma, viene usato il sistema di autenticazione SubSub. Per informazioni sull'autenticazione, consulta il documento Panoramica dell'autenticazione delle API di dati di Google. Il resto di questa sezione presuppone che tu abbia acquisito familiarità con le nozioni di base sul funzionamento del sistema.

Prima di utilizzare l'autenticazione con il codice campione fornito in questo documento, modifica l'URL del feed da pubblico a privato:

var feedUrl = "http://www.google.com/calendar/feeds/liz@gmail.com/private/full";

Autenticazione in un client web con AuthSub

Il sistema di autorizzazione "AuthSub per JavaScript" di Google non è più disponibile.

Consigliamo invece di utilizzare OAuth 2.0 per le applicazioni lato client.

Autenticazione in un gadget con il proxy OAuth

Di seguito è riportata una breve panoramica di ciò che accade durante la procedura di autenticazione di un gadget:

  1. Il gadget viene caricato per la prima volta e tenta di accedere ai dati dell'utente utilizzando una delle API di dati di Google.
  2. La richiesta ha esito negativo perché l'utente non ha ancora concesso l'accesso ai suoi dati. L'oggetto di risposta contiene un URL (in response.oauthApprovalUrl) per la pagina di approvazione OAuth. Il tuo gadget dovrebbe fornire un metodo per avviare una nuova finestra con quell'URL.
  3. Nella pagina di approvazione, l'utente sceglie di concedere/negare l'accesso al tuo gadget. Se l'operazione ha esito positivo, l'utente viene indirizzato alla pagina oauth_callback specificata. Per una migliore esperienza utente, utilizza http://oauth.gmodules.com/gadgets/oauthcallback.
  4. Successivamente, l'utente chiude la finestra popup. Per informare il tuo gadget che l'utente ha dato l'approvazione, abbiamo fornito un gestore popup che puoi utilizzare per rilevare la chiusura della finestra di approvazione. In alternativa, il tuo gadget può visualizzare un link (ad esempio, "Ho approvato l'accesso") su cui l'utente può fare clic manualmente dopo la chiusura di questa finestra.
  5. Il tuo gadget tenta di accedere all'API di dati di Google una seconda volta richiedendo nuovamente i dati dell'utente. Questo tentativo è andato a buon fine.
  6. Il tuo gadget è autenticato e può iniziare a funzionare normalmente.

Nel gadget, aggiungi un elemento <OAuth> nella sezione <ModulePrefs>:

<ModulePrefs>
...
<OAuth>
  <Service name="google">
    <Access url="https://www.google.com/accounts/OAuthGetAccessToken" method="GET" /> 
    <Request url="https://www.google.com/accounts/OAuthGetRequestToken?
                  scope=http://www.blogger.com/feeds/%20http://www.google.com/calendar/feeds/" method="GET" /> 
    <Authorization url="https://www.google.com/accounts/OAuthAuthorizeToken?
                        oauth_callback=http://oauth.gmodules.com/gadgets/oauthcallback" /> 
  </Service>
</OAuth>
...
</ModulePrefs>

In questa sezione, modifica i seguenti parametri di ricerca:

  • scope

    Un parametro obbligatorio nell'URL della richiesta. Il tuo gadget potrà accedere solo ai dati dei scope utilizzati in questo parametro. In questo esempio, il gadget accederà ai tuoi dati di Blogger e Calendar. Un gadget può richiedere dati per uno o più ambiti (come in questo esempio).

  • oauth_callback

    Un parametro facoltativo nell'URL di autorizzazione. La pagina di approvazione OAuth reindirizzerà a questo URL dopo che l'utente avrà approvato l'accesso ai propri dati. Puoi scegliere di lasciare invariato questo parametro, impostarlo sulla tua "pagina approvata" o, preferibilmente, utilizzare http://oauth.gmodules.com/gadgets/oauthcallback. In seguito potrai usufruire della migliore esperienza utente quando gli utenti installano per la prima volta il tuo gadget. Questa pagina fornisce uno snippet di JavaScript che chiude automaticamente la finestra popup.

Dopodiché carica la libreria client JavaScript nella sezione <Content> del gadget. Modifica la funzione setupMyService() dagli esempi precedenti per chiamare il metodo useOAuth() dell'oggetto di servizio. In questo modo indichi al gadget di utilizzare il proxy OAuth per l'autenticazione anziché AuthSub. Il seguente modello dovrebbe aiutarti a iniziare:

<Content type="html">
<![CDATA[
  ...
  <script src="https://www.google.com/jsapi"></script>
  <script type="text/javascript">
    var myService = null;
    
    function setupMyService() {
      myService = new google.gdata.calendar.CalendarService('exampleCo-exampleApp-1');
      myService.useOAuth('google');
      fetchData();
    }
    
    function initGadget() {
      google.load('gdata', '2.x');
      google.setOnLoadCallback(setupMyService);
    }

    function fetchData() {            
      var callback = function(response) {
        if (response.oauthApprovalUrl) {
        
          // TODO: Display "Sign in" link (response.oauthApprovalUrl contains the URL) 
          
        } else if (response.feed) {
        
          // TODO: show results
          
        } else {
        
          // TODO: handle the error
          
        }
      };

      myService.getEventsFeed('http://www.google.com/calendar/feeds/default/public/full', callback, callback);
    }
    
    gadgets.util.registerOnLoadHandler(initGadget);
  </script>
  ...
]]> 
</Content>

Tieni presente che la chiamata al numero google.accounts.user.login(scope) è stata rimossa. Il proxy gestisce l'autenticazione per te.

Per ulteriori informazioni sulla scrittura dei gadget dell'API di dati di Google, inclusi i dettagli relativi ai contenuti di fetchData(), consulta il nostro articolo sulla creazione di un gadget di dati di Google o consulta la documentazione completa sulla scrittura di gadget OAuth.

Inserimento di un nuovo elemento

Per creare un nuovo evento di calendario, continua l'esecuzione dell'esempio precedente modificando la fine della funzione handleMyFeed() per richiamare una nuova funzione:

function handleMyFeed(myResultsFeedRoot) {
  alert("This feed's title is: " + myResultsFeedRoot.feed.getTitle().getText());
  insertIntoMyFeed(myResultsFeedRoot);
}

Nella nuova funzione, utilizza prima il costruttore CalendarEventEntry per creare la nuova voce. Quindi, inserisci la voce, fornendo un callback al servizio da chiamare al termine dell'inserimento.

function insertIntoMyFeed(feedRoot) {
  var newEntry = new google.gdata.calendar.CalendarEventEntry({
      authors: [{
        name: "Elizabeth Bennet",
        email: "liz@gmail.com"
      }],
      title: {
        type: 'text', 
        text: 'Tennis with Darcy'
      },
      content: {
        type: 'text', 
        text: 'Meet for a quick lesson'
      },
      locations: [{
        rel: "g.event",
        label: "Event location",
        valueString: "Netherfield Park tennis court"
      }],
      times: [{
        startTime: google.gdata.DateTime.fromIso8601("2007-09-23T18:00:00.000Z"),
        endTime: google.gdata.DateTime.fromIso8601("2007-09-23T19:00:00.000Z")
      }]
  });
  feedRoot.feed.insertEntry(newEntry, handleMyInsertedEntry, handleError);
}

Tieni presente che il nome di ogni proprietà dell'oggetto utilizzata nel costruttore corrisponde al nome del metodo del setter utilizzato per quella proprietà. (ad esempio, anziché il nome del campo JSON corrispondente).

Inoltre, tieni presente che non puoi semplicemente fornire stringhe di data e ora ISO 8601 per startTime e endTime, ma devi prima eseguire queste stringhe utilizzando il metodo fromIso8601().

Il servizio restituisce una copia della voce inserita come oggetto entryRoot e la trasmette al callback:

function handleMyInsertedEntry(insertedEntryRoot) {
  alert("Entry inserted. The title is: " + insertedEntryRoot.entry.getTitle().getText());
  alert("The timestamp is: " + insertedEntryRoot.entry.getTimes()[0].startTime);
}

Richiedere una voce specifica

Per richiedere una voce specifica, modifica prima la funzione handleMyInsertedEntry() per chiamare una nuova funzione di richiesta di ingresso:

function handleMyInsertedEntry(insertedEntryRoot) {
  alert("Entry inserted. The title is: " + insertedEntryRoot.entry.getTitle().getText());
  alert("The timestamp is: " + insertedEntryRoot.entry.getTimes()[0].startTime);
  requestMySpecificEntry(insertedEntryRoot.entry.getSelfLink().getHref());
}

Il seguente codice consente di richiedere la voce specifica inserita nell'esempio precedente.

Nel contesto di questa serie di esempi, non è necessario recuperare la voce perché Calendar ha già restituito la voce inserita, ma la stessa tecnica può essere applicata ogni volta che conosci l'URI di una voce.

function requestMySpecificEntry(entryURI) {
  myService.getEventsEntry(entryURI, handleMySpecificEntry, handleError);
}

function handleMySpecificEntry(retrievedEntryRoot) {
  myEntryRoot = retrievedEntryRoot; // Global variable for later use
  alert("This entry's title is: " + retrievedEntryRoot.entry.getTitle().getText());
}

Questo esempio è sostanzialmente lo stesso dell'esempio getEventsFeed(), tranne per il fatto che chiamiamo il metodo getEventEntry() del servizio per ottenere una voce specifica e l'URI è leggermente diverso: utilizza "default" per fare riferimento al calendario principale dell'utente autenticato e alla fine il suo ID voce è incluso.

Inoltre, dobbiamo essere in grado di utilizzare la voce recuperata in un secondo momento, quindi la copiamo in una variabile globale.

Ricerca delle voci in corso...

Per eseguire una ricerca a testo intero, modifica prima la funzione handleMySpecificEntry() per chiamare una nuova funzione di ricerca:

function handleMySpecificEntry(retrievedEntryRoot) {
  myEntryRoot = retrievedEntryRoot; // Global variable for later use
  alert("This entry's title is: " + retrievedEntryRoot.entry.getTitle().getText());
  searchMyFeed();
}

Per recuperare la prima corrispondenza dalla ricerca, utilizza il seguente codice:

function searchMyFeed() {
  var myQuery = new google.gdata.calendar.CalendarEventQuery(feedUrl);
  myQuery.setFullTextQuery("Tennis");
  myQuery.setMaxResults(10);
  myService.getEventsFeed(myQuery, handleMyQueryResults, handleError);
}

function handleMyQueryResults(myResultsFeedRoot) {
  if (myResultsFeedRoot.feed.getEntries()[0]) {
    alert("The first search-match entry's title is: " + myResultsFeedRoot.feed.getEntries()[0].getTitle().getText());
  }
  else {
    alert("There are no entries that match the search query.");
  }
}

Aggiornamento di un elemento

Per aggiornare un elemento esistente, aggiungi prima una riga alla fine di handleMyQueryResults() per chiamare una nuova funzione di aggiornamento:

  updateMyEntry();

quindi utilizza il codice riportato di seguito. In questo esempio, cambieremo il titolo della voce recuperata in precedenza (che era inclusa nell'oggetto globale denominato myEntryRoot in un esempio precedente) dal suo vecchio testo ("Tennis con Darcy") a "Riunione importante".

function updateMyEntry() {
  myEntryRoot.entry.getTitle().setText("Important meeting");
  myEntryRoot.entry.updateEntry(handleMyUpdatedEntry, handleError);
}

function handleMyUpdatedEntry(updatedEntryRoot) {
  alert("Entry updated. The new title is: " + updatedEntryRoot.entry.getTitle().getText());
}

Come con tutti i metodi di Calendar, il metodo updateEntry() determina automaticamente l'URI di modifica corretto da utilizzare per aggiornare la voce, quindi non devi fornire l'URI in modo esplicito.

Eliminare un elemento

Per eliminare la voce aggiornata, aggiungi prima una riga a handleMyUpdatedEntry():

 deleteMyEntry(updatedEntryRoot);

Utilizza quindi il seguente codice:

function deleteMyEntry(updatedEntryRoot) {
  updatedEntryRoot.entry.deleteEntry(handleMyDeletedEntry, handleError);
}

function handleMyDeletedEntry() {
  alert("Entry deleted");
}

Anche in questo caso, il metodo deleteEntry() determina automaticamente l'URI di modifica corretto da utilizzare per eliminare la voce.

Tieni presente che non viene restituita alcuna voce. Se il callback viene chiamato, sappiamo che l'eliminazione è riuscita; se l'operazione non riesce, deleteEntry() chiama il numero handleError() invece di chiamare handleMyDeletedEntry().

Utilizzo di ETag

Nota: gli ETag possono essere utilizzati solo con i servizi che utilizzano la versione 2.0 del protocollo dati di Google.

Introduzione

La versione 2 del client JavaScript di Google Data introduce il supporto per i tag ETag. Gli ETag sono identificatori che specificano una determinata versione di una determinata voce; questo è importante in due casi:

  • Effettuare un "recupero condizionale" in cui un client richiede una voce e il server la invia solo se la voce è stata modificata dall'ultima volta che il client l'ha richiesta.
  • Assicurarsi che più client non sovrascrivano inavvertitamente le modifiche l'uno dell'altro. A questo scopo, le API di dati effettuano aggiornamenti ed eliminazioni non riuscite se il client specifica un vecchio ETag per la voce.

Esistono due tipi di ETag: deboli e forti. Un ETag debole inizia sempre con W/, ad esempio: W/"D08FQn8-eil7ImA9WxZbFEw". Non è garantito che le ETag deboli cambino quando la voce cambia, quindi HTTP ne consente l'utilizzo solo per il recupero condizionale. Gli ETag efficaci identificano una versione specifica di una voce specifica e possono essere utilizzati sia per il recupero condizionale sia per gli aggiornamenti o le eliminazioni, per evitare di sovrascrivere le modifiche di altri client. A causa di questa distinzione, la libreria client non ti consentirà di inviare ETag deboli con una richiesta di aggiornamento o eliminazione.

I tag ETag si trovano in due posizioni nella risposta del server:

  • Nell'intestazione HTTP ETag.
  • Nel feed/voce, come attributo gd:etag.

Se un servizio supporta la versione 2, ogni feed e oggetto voce avrà un metodo getEtag() per recuperare il valore dell'ETag.

Il client JavaScript supporta due metodi per includere gli ETag con una richiesta. Il primo è il nuovo oggetto opt_params. Tutte le funzioni get/update/insert nella versione 2 della libreria client hanno un nuovo parametro opt_params. Questo oggetto viene utilizzato per specificare parametri facoltativi quando si effettua una richiesta. Per il momento, 'etag' è l'unico parametro facoltativo supportato (anche se in futuro potrebbero essere introdotti altri parametri). Ad esempio, puoi aggiungere un ETag a una richiesta GET come segue:

var opt_params = {};
opt_params['etag'] = 'ETAG GOES HERE';
service.getFeed(uri, successHandler, errorHandler, opt_params);

Puoi anche aggiungere un tag ETag direttamente a un feed o a un oggetto voce chiamando il metodo setEtag() nel feed/voce.

Per scoprire di più sugli ETag, consulta la pagina GData Protocol Reference.

Utilizzo di ETag per recuperare i dati

Gli eTag possono aiutare a ridurre la larghezza di banda e i tempi di esecuzione durante il recupero dei dati. Un ETag può essere incluso in una richiesta GET con If-None-Match header:

If-None-Match: ETAG GOES HERE

Se l'ETag corrisponde alla versione corrente del feed o della voce, il server risponde con una risposta 304 NOT MODIFIED e con un corpo vuoto. In caso contrario, il server risponde con una risposta 200 OK e con i dati del feed o della voce.

Puoi utilizzare i tag ETag nel client JavaScript includendo un parametro 'etag' quando effettui la richiesta:

var etag = feed.getEtag(); // Feed loaded from a previous request
var opt_params = {};
opt_params['etag'] = etag;
service.getFeed(feedUrl, successHandler, errorHandler, opt_params);

I recuperi condizionali funzionano con ETag forti e deboli. Se l'ETag è una corrispondenza, il gestore di errori viene chiamato con una risposta 304:

function successHandler(feedRoot) {
  // 200 response
  // Update UI to display updates
}

function errorHandler(errorObj) {
  if (errorObj.cause.getStatus() == 304) {
    // 304 response, do nothing
  }
  // otherwise the response is some other error
}

Dai un'occhiata all'esempio relativo al recupero condizionale con Blogger per visualizzare un esempio più pratico di utilizzo di eTag nel client JavaScript. Questo campione esegue il sondaggio di Blogger a intervalli di 5 secondi per cercare aggiornamenti sul tuo blog. In caso di modifiche, l'esempio aggiorna un elenco di post.

Utilizzo di ETag per aggiornare ed eliminare dati

L'utilizzo di ETag nelle richieste di aggiornamento/eliminazione assicura che più client non sovrascrivano inavvertitamente le modifiche l'uno dell'altro. In questo caso, un ETag è incluso con l'intestazione If-Match:

If-Match: ETAG GOES HERE

Se l'ETag nella richiesta corrisponde all'ETag sul server, l'aggiornamento/eliminazione ha esito positivo. Tuttavia, una mancata corrispondenza ETag indica che la voce è cambiata e l'aggiornamento/l'eliminazione non riesce. In questo caso, l'applicazione deve richiedere una nuova istanza dei dati e quindi provare a eseguire nuovamente l'aggiornamento o l'eliminazione.

In alcuni casi, potresti voler forzare le modifiche, indipendentemente da altre modifiche alla voce. A tale scopo, puoi passare un elemento * all'intestazione If-Match:

If-Match: *

Tieni presente che questa operazione sostituirà le modifiche apportate da altri clienti, quindi utilizzalo con cautela.

Puoi aggiornare/eliminare una voce solo con un tag ETag efficace. Se viene specificato un ETag debole, verrà visualizzato un errore. Per evitare questo caso, il client JavaScript non imposterà ETag deboli alle richieste di aggiornamento ed eliminazione.

Gli eTag vengono utilizzati allo stesso modo dei recuperi condizionali:

function updateData(entry, service) {
  var etag = entry.getEtag();
  var opt_params = {};
  opt_params['etag'] = etag; // Or use '*' to force an update.
  service.updateEntry(successHandler, errorHandler, opt_params);
}

function successHandler(response) {
  // Successful update
}

function errorHandler(errorObj) {
  // ERROR - Update failed. Could be due to an ETag mismatch, but check the
  // error message to make sure. An ETag error will be in the format:
  // Mismatch: etags = ["Qnc-fTVSLyp7ImA9WxJbFEsDRAw."], version = [1249675665358000]
}

Quando esegui gli aggiornamenti, puoi specificare un ETag in due punti:

  1. Nella voce stessa, utilizzando i metodi getEtag() e setEtag().
  2. Nell'intestazione, utilizzando l'oggetto opt_params (come mostrato sopra).

Per una voce caricata da una richiesta GET precedente, sarà già impostato un campo ETag. Pertanto, specificare lo stesso ETag nell'oggetto opt_params è ridondante. Nel caso in cui un ETag sia specificato sia nel corpo della voce sia in opt_params, avrà la precedenza in opt_params. Questo può confondere, quindi se hai problemi con gli aggiornamenti condizionali, assicurati di controllare l'ETag sia nella voce che nell'oggetto opt_params.

Per semplificare le cose, i corsi google.gdata.Entry hanno anche i loro metodi updateEntry() e deleteEntry(). Se la classe di voce ha già un ETag, non è necessario aggiungerlo alla richiesta: la libreria client lo farà automaticamente. Ad esempio:

// entry was loaded from a previous request.  No need to specify
// an ETag in opt_params here, it is added automatically.
entry.deleteEntry(successHandler, errorHandler);

Questo ti offre i vantaggi degli ETag senza preoccuparti di impostarli correttamente. Tuttavia, se vuoi forzare l'aggiornamento utilizzando '*', devi sempre includere l'oggetto opt_params con 'etag' = '*'.

Puoi visualizzare gli aggiornamenti condizionali al lavoro in Aggiornamenti condizionali in Contatti. L'esempio crea prima un Gruppo di contatti di prova in cui verranno creati tutti i dati utilizzati. Quando hai finito di utilizzare l'anteprima, puoi eliminare questo gruppo di contatti. L'esempio carica due iframe con i contenuti del gruppo di contatti. Puoi apportare aggiornamenti in un iframe e vedere come influisce sugli aggiornamenti nell'altro iframe. Visita l'esempio per maggiori dettagli su come utilizzarlo.

Esempi

  • Recupero condizionale in Blogger: esegue il polling di Blogger ogni 5 secondi e verifica la presenza di aggiornamenti.
  • Aggiornamento condizionale in Contatti: mostra due iframe separati con i dati dei contatti, in modo da poter ricreare il modo in cui due client possono interagire durante la creazione, l'aggiornamento o l'eliminazione dei contatti.

Riferimento

Per informazioni sulle classi e sui metodi forniti dalla libreria client, consulta la sezione Riferimento API della libreria client JavaScript (in formato JSdoc).

Torna all'inizio