Przetwarzanie zbiorcze w protokole Google Data Protocol

Przetwarzanie wsadowe umożliwia wykonywanie wielu operacji w jednym żądaniu zamiast przesyłania każdej operacji z osobna.

Uwaga: aby wykonywać operacje wsadowe, musisz używać najnowszej wersji biblioteki klienta interfejsu Google Data API. Operacje wsadowe nie są obsługiwane przez bibliotekę klienta JavaScript.

Odbiorcy

Ten dokument jest przeznaczony dla programistów, którzy chcą przesyłać wiele operacji w ramach pojedynczego żądania za pomocą przetwarzania wsadowego.

W tym dokumencie założono, że znasz się na korzystaniu z biblioteki klienta Java GData. Przykłady w tym dokumencie pokazują, jak uruchomić operacje wsadowe za pomocą biblioteki klienta w języku Java.

Przykłady w tym dokumencie dotyczą interfejsu Google Base Data API. Inne usługi mogą też udostępniać funkcje wsadowe.

Uwaga: protokół i ogólne procedury są takie same w przypadku innych bibliotek klienta, ale konkretne metody wysyłania żądań zbiorczych mogą się różnić. Zapoznaj się z dokumentacją konkretnej biblioteki klienta.

Wprowadzenie

Dzięki wsadowemu plikowi danych GData możesz zbierać wiele operacji wstawiania, aktualizowania, usuwania i wysyłania zapytań, a następnie przesyłać i wykonywać je wszystkie jednocześnie.

Na przykład ten plik danych zawiera 4 operacje:

<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>

Usługa wykona jak najwięcej żądanych zmian i zwróci informacje o stanie, których możesz użyć do oceny powodzenia lub niepowodzenia każdej operacji.

Usługa próbuje wykonać wszystkie operacje w grupie, nawet jeśli niektóre z nich nie zostaną zrealizowane.

Przesyłanie żądania zbiorczego

Żądanie zbiorcze powinno być wysyłane jako żądanie HTTP POST na adres URL wsadu. Różne pliki danych obsługują różne operacje wsadowe. Pliki danych tylko do odczytu obsługują tylko zapytania.

Aby dowiedzieć się, czy dany plik danych obsługuje operacje wsadowe, możesz utworzyć zapytanie dotyczące tego pliku. Jeśli kanał zawiera link „zbiorczy”, na poziomie kanału oznacza to, że obsługuje on operacje wsadowe.

Relacja „zbiorcza” to element <link> z atrybutem rel="http://schemas.google.com/g/2005#batch". Atrybut href relacji linku określa adres URL, pod którym mogą być publikowane dokumenty kanału dotyczące operacji zbiorczych.

Jeśli na przykład uruchomisz: GET http://www.google.com/base/feeds/items (zwykły plik danych „items” Google Base), możesz otrzymać tę odpowiedź:

<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> 

W tym przykładzie adres URL grupy to http://www.google.com/base/feeds/items/batch.

Zapisywanie pliku operacji zbiorczych

Kanał operacji zawiera listę pozycji do wstawienia, zaktualizowania, usunięcia lub wykonania zapytania. Każda operacja jest zdefiniowana przez element <batch:operation type="insert|update|delete|query"/>.

Może to być bezpośredni element podrzędny elementu <feed>, bezpośredni element podrzędny dowolnego wpisu w pliku danych lub oba te elementy. Umieszczony we wpisie określa operację, która ma zostać wykonana. Gdy ten element jest w kanale, określa domyślną operację do wykonania dla wszystkich wpisów, które nie mają elementu <batch:operation/>.

Gdy ani wpis, ani kanał nie określa operacji, operacja domyślna to insert.

Aplikacje nie powinny stosować wielu operacji do tego samego wpisu w jednym pliku wsadowym. Jeśli w ramach jednego wpisu określisz wiele operacji, wyniki będą nieokreślone.

Aby zwiększyć wydajność, operacje mogą nie być przetwarzane w kolejności, w jakiej zostały przesłane. Ostateczny wynik jest jednak zawsze taki sam, jeśli wpisy zostały już przetworzone w określonej kolejności.

Liczba bajtów w pliku XML wysyłanych do serwera nie może przekraczać 1 MB (1 048 576 bajtów). W większości przypadków nie ma ograniczeń co do liczby operacji, o którą można poprosić, pod warunkiem że łączny rozmiar bajtów nie przekracza 1 MB. Niektóre usługi mogą jednak podlegać dodatkowym ograniczeniom.

Aby korzystać z operacji wsadowych, musisz dodać deklarację przestrzeni nazw jako atrybut elementu <feed>:

<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">

Wstaw operacje

Operacja wstawiania jest oznaczona jako:

<batch:operation type="insert">

Operacja wstawiania jest taka sama jak operacji POST wpisu. Jeśli operacja się powiedzie, wyświetli się cała treść wpisu wraz ze zaktualizowanym elementem <id> dokumentu i elementem <batch:status code="201"/>.

Oto przykład żądania wstawiania, które zostało zrealizowane:

<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>

Oto przykład odpowiedzi na udane żądanie wstawiania:

<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>

Operacje aktualizacji

<batch:operation type="update">

Operacja aktualizacji jest taka sama jak wykonanie PUT w adresie URL, do którego odwołuje się element <id> wpisu. Jeśli operacja się powiedzie, cała treść wpisu zostanie zwrócona z elementem <batch:status code="200"/>.

Uwaga: w przypadku niektórych plików danych musisz też podać link do wpisu rel="edit" za pomocą żądań aktualizacji zbiorczej. Obejmuje to pliki danych, które obsługują styl równoczesnych równoczesności protokołu Google Data Protocol, a także pliki danych, które nie mają identyfikatorów w formie adresów URL.

Oto przykład żądania aktualizacji:

<entry>
  <id>http://www.google.com/base/feeds/items/17437536661927313949</id>
  <batch:operation type="update"/>
  ...
</entry>

Oto przykład skutecznej odpowiedzi:

<entry>
  <batch:status code="200"/>
  <id>http://www.google.com/base/feeds/items/17437536661927313949</id>
  <batch:operation type="update"/>
  ... 
</entry>

Uwaga: niektóre pliki danych używają silnych tagów ETag, aby zapobiec przypadkowemu modyfikowaniu zmian wprowadzonych przez inną osobę. Wysyłając żądanie aktualizacji zbiorczej dla jednego z tych plików danych, musisz podać wartość ETag w atrybucie gd:etag wpisu. na przykład <entry gd:etag="'F08NQAxFdip7IWA6WhVR'">...<batch:operation type="update"/>....

Operacje częściowej aktualizacji

W przypadku plików danych, które obsługują częściowe aktualizacje, możesz ich używać w żądaniach zbiorczych. Operacja częściowa aktualizacji jest taka sama jak wykonanie PATCH w adresie URL, do którego odwołuje się element <id> wpisu. Jeśli operacja się powiedzie, cała treść wpisu zostanie zwrócona z elementem <batch:status code="200"/>.

Uwaga: w przypadku niektórych plików danych musisz też podać link do wpisu rel="edit" za pomocą żądań aktualizacji zbiorczej. Obejmuje to pliki danych, które obsługują styl równoczesnych równoczesności protokołu Google Data Protocol, a także pliki danych, które nie mają identyfikatorów w formie adresów URL.

<batch:operation type="patch"/>

Oto przykład żądania częściowej aktualizacji:

<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>

Oto przykład skutecznej odpowiedzi:

<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>

Usuwanie operacji

<batch:operation type="delete">

Operacja usuwania jest równoznaczna z wykonaniem DELETE na adresie URL, do którego odwołuje się element <id> wpisu. Aby usunąć wpis, wystarczy wysłać element <id>. Wszelkie inne informacje podane w elementach spoza przestrzeni nazw batch: będą ignorowane. Jeśli operacja się powiedzie, wpis o tym samym identyfikatorze zostanie zwrócony z elementem <batch:status code="200"/>.

Uwaga: w przypadku niektórych plików danych musisz też podać link rel="edit" wpisu do zbiorczego żądania usunięcia. Obejmuje to pliki danych, które obsługują styl równoczesnych równoczesności protokołu Google Data Protocol, a także pliki danych, które nie mają identyfikatorów w formie adresów URL.

Oto przykład żądania usunięcia:

<entry>
  <batch:operation type="delete"/>
  <id>http://www.google.com/base/feeds/items/17437536661927313949</id>
</entry>

Oto przykład skutecznej odpowiedzi:

<entry>
  <batch:operation type="delete"/>
  <id>http://www.google.com/base/feeds/items/17437536661927313949</id>
  <batch:status code="200" reason="Success"/>
</entry>

Uwaga: niektóre pliki danych używają silnych tagów ETag, aby zapobiec przypadkowemu modyfikowaniu zmian wprowadzonych przez inną osobę. Wysyłając żądanie usunięcia zbiorczego dla jednego z tych plików danych, musisz podać wartość ETag w atrybucie gd:etag wpisu. na przykład <entry gd:etag="'F08NQAxFdip7IWA6WhVR'">...<batch:operation type="delete"/>....

Operacje zapytań

<batch:operation type="query">

Operacja zapytania jest równoznaczna z wykonaniem GET w adresie URL, do którego odwołuje się element <id>. Jeśli operacja się powiedzie, wyświetli się cała treść wpisu.

Uwaga: w przypadku niektórych plików danych musisz też podać link do wpisu rel="self" za pomocą żądań zbiorczych. Dotyczy to też plików danych, które nie mają identyfikatorów w postaci adresów URL.

Oto przykład żądania zapytania:

<entry>
  <id>http://www.google.com/base/feeds/items/1743753666192313949</id>
  <batch:operation type="query"/>
</entry>

Oto przykład skutecznej odpowiedzi:

<entry>
  <id>http://www.google.com/base/feeds/items/1743753666192313949</id>
  <batch:operation type="query"/>
  <batch:status code="200" reason="Success"/>
   ...
</entry>

Śledzenie operacji

Wyniki wyszukiwania w GData niekoniecznie muszą być w tej samej kolejności co żądanie. Możesz śledzić operację od początku śledzenia, używając identyfikatora.

W przypadku operacji aktualizacji, usuwania i wykonywania zapytań możesz śledzić identyfikator operacji za pomocą identyfikatora wpisu.

W przypadku operacji wstawiania, ponieważ nie istnieje jeszcze identyfikator, możesz przekazać identyfikator operacji. Ten identyfikator może służyć do łączenia wpisów wyników z wpisami żądania. Identyfikator operacji jest przekazywany w elemencie <batch:id>.

Dla każdej operacji GData zwraca odpowiedź z informacją, czy operacja się udała, czy nie. Każda odpowiedź określa powiązany wpis. W przypadku aktualizacji, usunięcia lub zapytania bądź udanej operacji wstawiania identyfikator wpisu jest zawsze zwracany. Jeśli został określony identyfikator wsadowy, także zostanie on zwrócony. Ponieważ operacje wstawiania zakończone niepowodzeniem nie mają powiązanego identyfikatora wpisu, zwracany jest tylko identyfikator wsadu.

Korzystając z identyfikatora każdej operacji, możesz ponowić próbę tylko w przypadku tych, których się nie udało, bez konieczności ponownego przesyłania całej grupy operacji.

Zawartość <batch:id> to wartość ciągu znaków zdefiniowana przez klienta, która pojawia się w odpowiednim wpisie odpowiedzi.Możesz podać dowolną wartość, która pomoże klientowi powiązać odpowiedź z wpisem w pierwotnym żądaniu. Ten element będzie odczytywany w postaci, w jakiej jest w odpowiednim wpisie, nawet jeśli operacja się nie udała. GData nigdy nie przechowuje ani nie interpretuje zawartości tego identyfikatora wsadu.

Poniższy przykład pokazuje plik operacji zbiorczych. Zauważ, że element <batch:id> oznacza tę operację jako 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>

Poniższy przykład pokazuje wpis stanu wsadowego zwrócony w odpowiedzi na tę operację.

<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>

Obsługa kodów stanu

Kody stanu są następujące:

<batch:status code="200|201|404|500|..." reason="reason" [content-type="type"]/>

Każda pozycja w odpowiedzi na żądanie zawiera jeden element <batch:status>. Ten element opisuje, co się stało podczas wykonywania operacji. Naśladuje odpowiedź HTTP, która zostałaby wysłana, gdyby operacja została wysłana indywidualnie, a nie jako część zbiorczego pliku danych.

Aby upewnić się, że powiązana operacja została przetworzona, musisz sprawdzić element <batch:status> każdego wpisu w odpowiedzi. Atrybut code="n" zawiera kod stanu GData.

Opisy stanów

Atrybut reason="reason" elementu <batch:status> zawiera bardziej szczegółowe informacje o stanie operacji.

Typ treści

Atrybut content-type="type" elementu <batch:status> zawiera typ MIME danych zawartych w elemencie <batch:status>. Odpowiada to nagłówkowi Content-Type odpowiedzi stanu HTTP. Ten atrybut jest opcjonalny.

Po ustawieniu typu treści treść elementu <batch:status> opisuje, co poszło nie tak podczas przetwarzania wpisu.

Identyfikowanie przerwanych operacji

W odpowiedzi na przerywaną operację dodawany jest ten element:

<batch:interrupted reason="reason" success="N" failures="N" parsed="N">

Ten element oznacza, że przetwarzanie wsadowe zostało przerwane i wszystkie próby odzyskania tej przyczyny zakończyły się niepowodzeniem. Niektóre wpisy mogły już zostać przetworzone. Wszystkie wpisy, które nie zostały zgłoszone przed tym punktem, zostały porzucone.

Ten element jest bardzo nietypowy i zwykle sygnalizuje, że plik danych wysłany w treści żądania ma nieprawidłowy format XML.

Tak jak w przypadku elementu <batch:status> krótki atrybut stanu można znaleźć w atrybucie reason. W elemencie może być też dłuższa odpowiedź.

Przykładowe operacje wsadowe i pliki danych o stanie

Oto plik wsadowy, który może zostać wysłany na serwer. Ten kanał wymaga, aby serwer usunął 2 wpisy i dodał 2 nowe. Pamiętaj, że element <feed> musi zawierać deklarację przestrzeni nazw dla grupy, jak zaznaczono w przykładzie poniżej.

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>

Załóżmy, że 2 wstawienia działały, ale jedno z nich nie zostało usunięte. W takim przypadku plik danych o stanie przesyłania może wyglądać tak: Zwróć uwagę, że wpisy zostały przestawione w porównaniu z plikiem danych wsadowych.

<?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>

Używanie funkcji wsadowej biblioteki klienta GData Java

W tej sekcji dowiesz się, jak używać funkcji wsadowej biblioteki klienta GData Java do przesyłania grupy żądań wstawienia, aktualizacji lub usunięcia.

Przykłady w tej sekcji korzystają z interfejsów API Google Base.

Najpierw zaimportuj potrzebne klasy, a także standardowe klasy GData i Google Base:

import com.google.gdata.data.batch.*;
import com.google.api.gbase.client.*;

Aby przesłać żądanie zbiorcze, musisz uzyskać adres URL wsadowy z pliku danych. Fragment kodu poniżej pokazuje, jak to zrobić, zakładając, że feed jest obiektem GoogleBaseFeed zawierającym informacje o kanale:

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
}

Ten fragment kodu przygotowuje plik danych, który wstawia 2 wpisy w jednej operacji:

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);

Kod w tym przykładzie nigdy nie wskazuje wyraźnie, że operacja do wykonania w przypadku tych wpisów to insert. Nie musisz tego określać, ponieważ operacja domyślna jest wstawiana.

Aby wysłać plik danych wsadowych i otrzymać wyniki, wywołaj metodę Service.batch.

Tak jak Service.insert, Service.batch zwraca wstawione wpisy z nowymi wartościami <atom:id>. Zwracane wpisy znajdują się w obiekcie GoogleBaseFeed.

Jeśli chcesz usunąć trzeci wpis (który został już pobrany i zapisany w entry3) jednocześnie ze wstawieniem dwóch innych wpisów, możesz użyć tego kodu:

GoogleBaseEntry toDelete = new GoogleBaseEntry();


toDelete.setId(entry3.getId());
BatchUtils.setBatchOperationType(toDelete, BatchOperationType.DELETE);

feed.addEntry(toDelete);


GoogleBaseFeed result = service.batch(batchUrl, feed);

service jest instancją com.google.gdata.client.Service.

Jeśli chcesz zaktualizować wpis, określ OperationType.UPDATE i zainicjuj go odpowiednimi zmianami, zamiast zostawiać je puste.

W tych przykładach używany jest interfejs API danych Google Base. Jeśli używasz service.batch z innym typem usługi GData, zastąp klasy GoogleBaseFeed, GoogleBaseEntry i GoogleBaseService odpowiednimi plikami danych, wpisem i usługą.

Wyniki operacji zbiorczej nie zawsze są zwracane w kolejności, w jakiej zostały żądane. W powyższym przykładzie plik danych z wynikami wyszukiwania może zawierać wiele atrybutów entry2, po których następuje entry1. Nigdy nie zakładaj, że wpisy są zwracane w określonej kolejności.

Do pliku danych działań wsadowych należy przypisać unikalny identyfikator wsadowy do każdej operacji wstawiania, jak opisano w artykule Operacje śledzenia. W powyższych przykładach identyfikatory wsadowe to A i B. Aby znaleźć stan żądanych operacji, musisz iterować wpisy w zwróconym pliku wsadowym i porównać ich identyfikator wsadu lub identyfikator wpisu w ten sposób:

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());      
    }    
  } 

Z każdym wpisem w zwróconym pliku danych jest powiązany obiekt BatchStatus. Obiekt BatchStatus zawiera kod zwrotny HTTP oraz odpowiedź z opisem, co poszło nie tak podczas przetwarzania wpisu. Aby sprawdzić, czy operacja się powiodła, musisz sprawdzić kod zwrotny HTTP dla każdego wpisu.

Kontrolę przeprowadza się w powyższym przykładzie metodą dogodną BatchUtils.isSuccess. W tym przypadku jest to odpowiednik BatchUtils.getBatchStatus(entry) < 300.

Kody stanu i odpowiedzi zostały dokładnie opisane w sekcji Obsługa kodów stanu.

Powrót do góry