L'elaborazione batch ti dà la possibilità di eseguire più operazioni in una singola richiesta, anziché dover inviare ogni operazione singolarmente.
Nota: per eseguire operazioni batch, devi utilizzare una versione recente della libreria client dell'API di dati di Google. Le operazioni batch non sono supportate dalla libreria client JavaScript.
Pubblico
Questo documento è destinato ai programmatori che vogliono inviare più operazioni con una singola richiesta utilizzando l'elaborazione batch.
Questo documento presuppone che tu abbia dimestichezza con l'utilizzo della libreria client di Java di GData. Gli esempi in questo documento mostrano come utilizzare la libreria client Java per eseguire operazioni batch.
Gli esempi in questo documento sono specifici per l'API Google Base Data. Tuttavia, altri servizi potrebbero fornire funzionalità in batch.
Nota: il protocollo e le procedure generali saranno gli stessi per altre librerie client, ma i metodi specifici per eseguire le richieste in batch potrebbero essere diversi. Consulta la documentazione specifica della libreria client.
Introduzione
Utilizzando un feed batch di GData, puoi raccogliere più operazioni di inserimento, aggiornamento, eliminazione ed esecuzione di query, quindi inviarle ed eseguirle tutte contemporaneamente.
Ad esempio, il seguente feed include quattro operazioni:
<feed> <entry> <batch:operation type="insert"/> ... what to insert ... </entry> <entry> <batch:operation type="update"/> ... what to update ... </entry> <entry> <batch:operation type="delete"/> ... what to delete ... </entry> <entry> <batch:operation type="query"/> ... what to query ... </entry> </feed>
Il servizio eseguirà il maggior numero possibile di modifiche richieste e restituirà informazioni sullo stato che puoi utilizzare per valutare l'esito positivo o negativo di ogni operazione.
Il servizio tenta di eseguire ciascuna delle operazioni all'interno di un batch, anche se alcune delle operazioni incluse nel batch non vanno a buon fine.
Invio di una richiesta batch
Una richiesta batch deve essere inviata come POST HTTP a un URL batch. Feed diversi supportano operazioni batch diverse. I feed di sola lettura supportano solo le query.
Per scoprire se un determinato feed supporta le operazioni batch, puoi eseguire query sul feed. Se il feed contiene una relazione di collegamento "batch" a livello di feed, significa che il feed supporta le operazioni batch.
Una relazione di link "batch" è un elemento <link>
con rel="http://schemas.google.com/g/2005#batch"
. L'attributo href
della relazione con il link definisce l'URL in cui possono essere pubblicati i documenti del feed per le operazioni collettive.
Ad esempio, se esegui: GET http://www.google.com/base/feeds/items
(il
normale feed "item" di Google Base), potresti ricevere la seguente risposta:
<feed xmlns=... <id>http://www.google.com/base/feeds/items</id> <link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://www.google.com/base/feeds/items"/> <link rel="http://schemas.google.com/g/2005#post" type="application/atom+xml" href="http://www.google.com/base/feeds/items"/> <link rel="http://schemas.google.com/g/2005#batch" type="application/atom+xml" href="http://www.google.com/base/feeds/items/batch"/> ... </feed>
In questo esempio, l'URL batch è http://www.google.com/base/feeds/items/batch
.
Scrittura di un feed delle operazioni batch
Un feed operazioni contiene un elenco di voci da inserire, aggiornare, eliminare o eseguire query.
Ogni operazione è definita da un elemento <batch:operation type="insert|update|delete|query"/>
.
Questo elemento può essere un elemento secondario secondario diretto di un elemento <feed>
, un elemento secondario diretto di una qualsiasi delle voci nel feed o entrambi. Quando è incluso in una voce, specifica l'operazione da eseguire per quella voce specifica. Se incluso nel feed, questo elemento specifica l'operazione predefinita da eseguire su qualsiasi voce che non ha un elemento <batch:operation/>
.
Quando né la voce né il feed specificano un'operazione, l'operazione predefinita è insert
.
Le applicazioni non devono applicare più operazioni alla stessa voce in un unico feed batch. I risultati sono definitivi se specifichi più operazioni per la stessa voce.
Per migliorare le prestazioni, le operazioni potrebbero non essere elaborate nell'ordine in cui sono state richieste. Tuttavia, il risultato finale è sempre lo stesso se le voci sono state elaborate in ordine.
Il numero di byte nel file XML che invii al server non può essere superiore a 1 MB (1048.576 byte). In generale, non ci sono limiti al numero di operazioni che puoi richiedere, purché la dimensione totale dei byte non superi 1 MB. Tuttavia, alcuni servizi potrebbero comportare ulteriori vincoli.
Per utilizzare le operazioni batch, devi aggiungere la dichiarazione dello spazio dei nomi batch come attributo all'elemento <f
eed>
:
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" ... xmlns:batch="http://schemas.google.com/gdata/batch">
Inserisci operazioni
Un'operazione di inserimento è indicata come segue:
<batch:operation type="insert">
Un'operazione di inserimento equivale a POSTare la voce. Una volta che l'operazione ha esito positivo, viene restituito l'intero contenuto della voce, con un elemento <id>
aggiornato e un elemento <batch:status code="201"/>
.
Ecco un esempio di una richiesta di inserimento riuscita:
<entry> <title type="text">...</title> <content type="html">...</content> <batch:id>itemA</batch:id> <batch:operation type="insert"/> <g:item_type>recipes</g:item_type> ... </entry>
Di seguito è riportato un esempio di risposta a una richiesta di inserimento riuscita:
<entry> <batch:status code="201"/> <batch:id>itemA</batch:id> <batch:operation type="insert"/> <id>http://www.google.com/base/feeds/items/17437536661927313949</id> <link rel="self" type="application/atom+xml" href="http://www.google.com/base/feeds/items/17437536661927313949"/> <title type="text">...</title> <content type="html">...</content> <g:item_type>recipes</g:item_type> ... </entry>
Operazioni update
<batch:operation type="update">
Un'operazione di aggiornamento equivale
a eseguire un elemento PUT
nell'URL a cui fa riferimento
l'elemento <id>
della voce. Una volta che l'operazione ha esito positivo, viene restituito l'intero contenuto della voce con un elemento <batch:status
code="200"/>
.
Nota:con alcuni feed, devi anche specificare il link rel="edit"
della voce con richieste di aggiornamento batch. Sono inclusi quelli che supportano la contemporaneità ottimistica della versione 1 di Google Data Protocol e quelli che non hanno ID costituiti da URL.
Ecco un esempio di richiesta di aggiornamento:
<entry> <id>http://www.google.com/base/feeds/items/17437536661927313949</id> <batch:operation type="update"/> ... </entry>
Ecco un esempio di risposta corretta:
<entry> <batch:status code="200"/> <id>http://www.google.com/base/feeds/items/17437536661927313949</id> <batch:operation type="update"/> ... </entry>
Nota: alcuni feed utilizzano tag ETag efficaci per impedire modifiche involontarie delle modifiche di un'altra persona. Quando effettui una richiesta di aggiornamento batch per una voce in uno di questi feed, devi fornire il valore ETag nell'attributo gd:etag
della voce. Ad esempio, <entry gd:etag="'F08NQAxFdip7IWA6WhVR'">...<batch:operation type="update"/>...
Operazioni di aggiornamento parziale
I feed che supportano gli aggiornamenti parziali possono essere utilizzati anche nelle richieste in batch. Un'operazione di aggiornamento parziale equivale
a eseguire un elemento PATCH
nell'URL a cui fa riferimento
l'elemento <id>
della voce. Una volta che l'operazione ha esito positivo, viene restituito l'intero contenuto della voce con un elemento <batch:status
code="200"/>
.
Nota:con alcuni feed, devi anche specificare il link rel="edit"
della voce con richieste di aggiornamento batch. Sono inclusi quelli che supportano la contemporaneità ottimistica della versione 1 di Google Data Protocol e quelli che non hanno ID costituiti da URL.
<batch:operation type="patch"/>
Ecco un esempio di richiesta di aggiornamento parziale:
<entry gd:fields="content" gd:etag="FE8LQQJJeSp7IWA6WhVa"> <id>http://www.google.com/calendar/feeds/jo@gmail.com/private/full/entryID</id> <batch:operation type="patch"/> <title>New title</title> </entry>
Ecco un esempio di risposta corretta:
<entry gd:etag="FE8LQQJJeSp7IWA6WhVa"> <batch:status code="200"/> <id>http://www.google.com/calendar/feeds/jo@gmail.com/private/full/entryID</id> <batch:operation type="patch"/> <title>New title</title> <content></content> ...rest of the entry... </entry>
Eliminazione operazioni
<batch:operation type="delete">
Un'operazione di eliminazione equivale a eseguire DELETE
nell'URL a cui fa riferimento l'elemento <id>
della voce. Per un'operazione di eliminazione, devi inviare solo un elemento <id>
per eliminare la voce. Qualsiasi altra informazione fornita in elementi che non si trovano nello spazio dei nomi batch:
verrà ignorata. Una volta che l'operazione ha esito positivo, verrà restituita una voce con lo stesso ID con un elemento <batch:status
code="200"/>
.
Nota: con alcuni feed, devi anche specificare il link rel="edit"
della voce con una richiesta di eliminazione batch. Sono inclusi quelli che supportano la contemporaneità ottimistica della versione 1 di Google Data Protocol e quelli che non hanno ID costituiti da URL.
Ecco un esempio di richiesta di eliminazione:
<entry> <batch:operation type="delete"/> <id>http://www.google.com/base/feeds/items/17437536661927313949</id> </entry>
Ecco un esempio di risposta corretta:
<entry> <batch:operation type="delete"/> <id>http://www.google.com/base/feeds/items/17437536661927313949</id> <batch:status code="200" reason="Success"/> </entry>
Nota: alcuni feed utilizzano tag ETag efficaci per impedire modifiche involontarie delle modifiche di un'altra persona. Quando effettui una richiesta di eliminazione in blocco per una voce in uno di questi feed, devi fornire il valore ETag nell'attributo gd:etag
della voce. Ad esempio, <entry gd:etag="'F08NQAxFdip7IWA6WhVR'">...<batch:operation type="delete"/>...
Operazioni di query
<batch:operation type="query">
Un'operazione di query equivale a eseguire GET
nell'URL a cui fa riferimento l'elemento <id>
della voce. Quando l'operazione va a buon fine, viene restituito l'intero contenuto della voce.
Nota: con determinati feed, devi anche specificare il link rel="self"
della voce con richieste di query batch. Sono inclusi i feed che non hanno ID costituiti da URL.
Di seguito è riportato un esempio di richiesta di query:
<entry> <id>http://www.google.com/base/feeds/items/1743753666192313949</id> <batch:operation type="query"/> </entry>
Ecco un esempio di risposta corretta:
<entry> <id>http://www.google.com/base/feeds/items/1743753666192313949</id> <batch:operation type="query"/> <batch:status code="200" reason="Success"/> ... </entry>
Operazioni di monitoraggio
I risultati della voce GData non vengono necessariamente restituiti nello stesso ordine della richiesta. Puoi monitorare un'operazione per tutta la sua durata utilizzando un identificatore.
Per le operazioni di aggiornamento, eliminazione ed esecuzione di query, puoi utilizzare l'ID della voce stessa per monitorare l'operazione.
Per le operazioni di inserimento, dato che non esiste ancora alcun ID, puoi passare un identificatore dell'operazione. Questo identificatore può essere utilizzato per collegare le voci dei risultati alle richieste. L'identificatore dell'operazione viene trasmesso nell'elemento <batch:id>
.
Per ogni operazione, GData restituisce una risposta che indica se l'operazione è riuscita o meno. Ogni risposta identifica la voce correlata. Per un'operazione di aggiornamento, eliminazione o query oppure un'operazione di inserimento riuscita, viene sempre restituito l'ID voce. Se hai specificato un ID batch, viene restituito anche questo. Poiché alle operazioni di inserimento non riuscite non è associato un ID voce, viene restituito solo l'ID batch.
Utilizzando l'identificatore di ogni operazione, puoi riprovare solo per le operazioni non riuscite, anziché dover inviare nuovamente l'intero batch di operazioni.
Il contenuto di <batch:id>
è un valore stringa definito dal client e verrà riportato nella voce di risposta corrispondente.Puoi specificare qualsiasi valore che aiuterà il client a correlare la risposta con la voce nella richiesta originale. Questo elemento viene riportato anche come com'è nella voce corrispondente, anche se l'operazione non è riuscita. GData non archivia mai né interpreta i contenuti di questo ID batch.
L'esempio seguente mostra un feed delle operazioni in batch. Nota che l'elemento <batch:id>
etichetta questa operazione come itemB
.
<entry> <title type="text">...</title> <content type="html">...</content> <batch:id>itemB</batch:id> <batch:operation type="insert"/> <g:item_type>recipes</g:item_type> </entry>
L'esempio seguente mostra la voce dello stato del batch restituito in risposta a questa operazione.
<entry> <id>http://www.google.com/base/feeds/items/2173859253842813008</id> <published>2006-07-11T14:51:43.560Z</published> <updated>2006-07-11T14:51: 43.560Z</updated> <title type="text">...</title> <content type="html">...</content> <link rel="self" type="application/atom+xml" href="http://www.google.com/base/feeds/items/2173859253842813008"/> <link rel="edit" type="application/atom+xml" href="http://www.google.com/base/feeds/items/2173859253842813008"/> <g:item_type>recipes</g:item_type> <batch:operation type="insert"/> <batch:id>itemB</batch:id> <batch:status code="201" reason="Created"/> </entry>
Gestire i codici di stato
I codici di stato sono espressi dal seguente elemento:
<batch:status code="200|201|404|500|..." reason="reason" [content-type="type"]/>
Ogni voce nel feed delle risposte contiene un elemento <batch:status>
. Questo elemento descrive cosa è successo durante l'esecuzione dell'operazione. Imita la risposta HTTP che sarebbe stata inviata se l'operazione fosse stata inviata singolarmente, anziché come parte di un feed batch.
Devi controllare l'elemento <batch:status>
di ogni voce nella risposta per scoprire se l'operazione associata è stata elaborata correttamente. L'attributo code="n"
contiene un codice di stato GData.
Descrizioni degli stati
L'attributo reason="reason"
dell'elemento <batch:status>
contiene una spiegazione più dettagliata dello stato dell'operazione.
Tipo di contenuti
L'attributo content-type="type"
dell'elemento <batch:status>
contiene il tipo MIME dei dati contenuti nell'elemento <batch:status>
. Corrisponde all'intestazione Content-Type
di una risposta di stato HTTP. Questo attributo è facoltativo.
Una volta impostato il tipo di contenuti, il corpo dell'elemento <batch:status>
descrive il problema durante l'elaborazione della voce.
Identificare le operazioni interrotte
Il seguente elemento è incluso nella risposta per un'operazione interrotta:
<batch:interrupted reason="reason" success="N" failures="N" parsed="N">
Questo elemento indica che l'elaborazione batch è stata interrotta e che tutti i tentativi di recuperare la causa dell'interruzione non sono riusciti. Alcune voci potrebbero essere già state elaborate. Tutte le voci che non sono state segnalate come riuscite prima di questo punto sono state abbandonate.
Questo elemento è molto insolito e di solito indica che il feed inviato nel corpo della richiesta non era in un formato XML corretto.
Come con l'elemento <batch:status>
, nell'attributo reason
è riportato un breve
codice di stato. All'interno dell'elemento potresti anche trovare una risposta più lunga.
Esempi di operazioni in batch e feed di stato
Di seguito è riportato un feed delle operazioni in batch che potrebbe essere inviato al server. Questo feed richiede al server di eliminare due voci e di aggiungerne due nuove. Tieni presente che l'elemento <feed>
deve includere uno spazio dei nomi per il batch, come evidenziato nell'esempio che segue.
POST : http://www.google.com/base/feeds/items/batch <?xml version="1.0" encoding="UTF-8"?> <feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:g="http://base.google.com/ns/1.0" xmlns:batch="http://schemas.google.com/gdata/batch"> <title type="text">My Batch Feed</title> <entry> <id>http://www.google.com/base/feeds/items/13308004346459454600</id> <batch:operation type="delete"/> </entry> <entry> <id>http://www.google.com/base/feeds/items/17437536661927313949</id> <batch:operation type="delete"/> </entry> <entry> <title type="text">...</title> <content type="html">...</content> <batch:id>itemA</batch:id> <batch:operation type="insert"/> <g:item_type>recipes</g:item_type> </entry> <entry> <title type="text">...</title> <content type="html">...</content> <batch:id>itemB</batch:id> <batch:operation type="insert"/> <g:item_type>recipes</g:item_type> </entry> </feed>
Supponiamo che i due inserimenti siano riusciti, ma che una delle due eliminazioni non sia riuscita. In questo caso, il feed di stato batch potrebbe avere il seguente aspetto. Tieni presente che le voci sono state riordinate rispetto al feed delle operazioni batch.
<?xml version="1.0" encoding="UTF-8"?> <feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:g="http://base.google.com/ns/1.0" xmlns:batch="http://schemas.google.com/gdata/batch"> <id>http://www.google.com/base/feeds/items</id> <updated>2006-07-11T14:51:42.894Z</updated> <title type="text">My Batch</title> <link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://www.google.com/base/feeds/items"/> <link rel="http://schemas.google.com/g/2005#post" type="application/atom+xml" href="http://www.google.com/base/feeds/items"/> <link rel=" http://schemas.google.com/g/2005#batch" type="application/atom+xml" href="http://www.google.com/base/feeds/items/batch"/> <entry> <id>http://www.google.com/base/feeds/items/2173859253842813008</id> <published>2006-07-11T14:51:43.560Z</published> <updated>2006-07-11T14:51: 43.560Z</updated> <title type="text">...</title> <content type="html">...</content> <link rel="self" type="application/atom+xml" href="http://www.google.com/base/feeds/items/2173859253842813008"/> <link rel="edit" type="application/atom+xml" href="http://www.google.com/base/feeds/items/2173859253842813008"/> <g:item_type>recipes</g:item_type> <batch:operation type="insert"/> <batch:id>itemB</batch:id> <batch:status code="201" reason="Created"/> </entry> <entry> <id>http://www.google.com/base/feeds/items/11974645606383737963</id> <published>2006-07-11T14:51:43.247Z</published> <updated>2006-07-11T14:51: 43.247Z</updated> <title type="text">...</title> <content type="html">...</content> <link rel="self" type="application/atom+xml" href="http://www.google.com/base/feeds/items/11974645606383737963"/> <link rel="edit" type="application/atom+xml" href="http://www.google.com/base/feeds/items/11974645606383737963"/> <g:item_type>recipes</g:item_type> <batch:operation type="insert"/> <batch:id>itemA</batch:id> <batch:status code="201" reason="Created"/> </entry> <entry> <id>http://www.google.com/base/feeds/items/13308004346459454600</id> <updated>2006-07-11T14:51:42.894Z</updated> <title type="text">Error</title> <content type="text">Bad request</content> <batch:status code="404" reason="Bad request" content-type="application/xml"> <errors> <error type="request" reason="Cannot find item"/> </errors> </batch:status> </entry> <entry> <id>http://www.google.com/base/feeds/items/17437536661927313949</id> <updated>2006-07-11T14:51:43.246Z</updated> <content type="text">Deleted</content> <batch:operation type="delete"/> <batch:status code="200" reason="Success"/> </entry> </feed>
usando la funzionalità batch della libreria client Java di GData.
Questa sezione spiega come utilizzare la funzionalità batch della libreria client Java di GData per inviare un gruppo di richieste di inserimento, aggiornamento e/o eliminazione.
Gli esempi riportati in questa sezione utilizzano le API di Google Base.
Innanzitutto, importa i corsi necessari, oltre alle classi standard GData e Google Base:
import com.google.gdata.data.batch.*; import com.google.api.gbase.client.*;
Per inviare una richiesta batch, devi recuperare l'URL batch di un feed. Il seguente snippet di codice illustra come eseguire questa operazione, supponendo che feed
sia un oggetto GoogleBaseFeed
contenente informazioni su un feed:
Link batchLink = feed.getLink(Link.Rel.FEED_BATCH, Link.Type.ATOM); if (batchLink != null) { URL batchUrl = new URL(batchLink.getHref()); ... // batch handling } else { // batching is not supported for this feed }
Il seguente snippet di codice prepara un feed che inserirà due voci in un'unica operazione:
GoogleBaseEntry entry1 = new GoogleBaseEntry(); ... // initialize entry 1 content BatchUtils.setBatchId(entry1, "A"); // A is the local batch ID for this entry feed.addEntry(entry1); GoogleBaseEntry entry2 = new GoogleBaseEntry(); ... // initialize entry 2 content BatchUtils.setBatchId(entry2, "B"); // B is the local batch ID for this entry feed.addEntry(entry2);
Il codice in questo esempio non specifica mai esplicitamente che l'operazione da eseguire per queste voci è insert
. Non è necessario specificare esplicitamente questa opzione, perché l'inserimento è l'operazione predefinita.
Per inviare il feed in batch e ricevere i risultati, chiama il metodo Service.batch
.
Come Service.insert
, Service.batch
restituisce le voci inserite con i nuovi valori <atom:id>
impostati. Le voci restituite sono contenute in un oggetto GoogleBaseFeed
.
Se vuoi eliminare una terza voce (che hai già recuperato e archiviato in entry3
) contemporaneamente all'inserimento delle altre due voci,
puoi utilizzare il seguente codice:
GoogleBaseEntry toDelete = new GoogleBaseEntry(); toDelete.setId(entry3.getId()); BatchUtils.setBatchOperationType(toDelete, BatchOperationType.DELETE); feed.addEntry(toDelete); GoogleBaseFeed result = service.batch(batchUrl, feed);
In questo caso, service
è un'istanza di com.google.gdata.client.Service
.
Se vuoi aggiornare una voce, specifica OperationType.UPDATE
e inizializzala
con le modifiche desiderate, anziché lasciarla per lo più
vuota.
Questi esempi utilizzano l'API di dati di Google Base. Se utilizzi service.batch
con un altro tipo di servizio GData, sostituisci le classi GoogleBaseFeed
, GoogleBaseEntry
e GoogleBaseService
con le classi di feed, voce e servizio appropriate.
I risultati di un'operazione batch non vengono necessariamente restituiti nell'ordine in cui sono stati richiesti. Nell'esempio precedente, il feed dei risultati potrebbe
contenere molto bene entry2
, seguito da entry1
. Non dovresti mai presumere che le voci vengano restituite in un ordine particolare.
Il tuo feed delle operazioni in batch deve assegnare un ID univoco a ogni operazione di inserimento, come spiegato nella sezione Operazioni di monitoraggio. Negli esempi riportati sopra, gli ID batch sono A
e B
. Pertanto, per trovare lo stato delle operazioni richieste, devi eseguire l'iterazione delle voci nel feed batch restituito e confrontare il relativo ID batch o ID voce, come descritto di seguito:
for (GoogleBaseEntry entry : result.getEntries()) { String batchId = BatchUtils.getBatchId(entry); if (BatchUtils.isSuccess(entry)) { if ("A".equals(batchId)) { entry1 = entry; } else if ("B".equals(batchId)) { entry2 = entry; } else if (BatchUtils.getBatchOperationType(entry) == BatchOperationType.DELETE) { System.out.println("Entry " + entry.getId() + " has been deleted successfully."); } } else { BatchStatus status = BatchUtils.getBatchStatus(entry); System.err.println(batchId + " failed (" + status.getReason() + ") " + status.getContent()); } }
Ogni voce che troverai nel feed restituito ha un oggetto BatchStatus
associato.
L'oggetto BatchStatus
contiene un codice di ritorno HTTP e una risposta che descrive il problema che si è verificato durante l'elaborazione della voce. Devi controllare il codice HTTP di ritorno di ogni voce per verificare se l'operazione è riuscita.
Il controllo viene eseguito nell'esempio sopra con il metodo di praticità BatchUtils.isSuccess
.
In questo caso, equivale a: BatchUtils.getBatchStatus(entry) < 300
.
I codici di stato e le risposte sono ulteriormente illustrati nella sezione Gestire i codici di stato.