Ostrzeżenie: ta strona dotyczy starszych interfejsów API Google – interfejsów API danych Google – dotyczy tylko interfejsów API wymienionych w katalogu interfejsów API danych Google, z których wiele zostało zastąpionych nowszych. Informacje na temat konkretnego nowego interfejsu API można znaleźć w dokumentacji nowego interfejsu API. Informacje o autoryzowaniu żądań za pomocą nowszego interfejsu API znajdziesz w artykule Uwierzytelnianie i autoryzacja kont Google.
Ten dokument opisuje protokół danych Google używany w wielu interfejsach API Google, w tym informacje na temat wyglądu zapytania, wyników itp.
Więcej informacji o protokole Google Data Protocol znajdziesz na stronie przeglądu w przewodniku dla programistów i w artykule Podstawy protokołu.
Odbiorcy
Ten dokument jest przeznaczony dla wszystkich, którzy chcą poznać szczegółowe informacje na temat formatu XML i protokołu używanych przez interfejsy API implementujące protokół Google Data Protocol.
Jeśli chcesz napisać kod, który korzysta z jednego z tych interfejsów API, nie musisz znać tych szczegółów. Zamiast tego możesz użyć bibliotek klienckich.
Jeśli jednak chcesz zrozumieć protokół, przeczytaj ten dokument. Ten dokument może Ci się przydać na przykład w przypadku następujących zadań:
- analizowanie architektury protokołu danych Google
- kodowania za pomocą protokołu bez konieczności używania bibliotek klienckich.
- pisanie biblioteki klienta w nowym języku
W tym dokumencie założono, że znasz podstawy formatu XML, przestrzeni nazw, kanałów dystrybucji oraz żądań GET
, POST
, PUT
i DELETE
w protokole HTTP, a także koncepcję „zasobu” HTTP. Więcej informacji na ten temat znajdziesz w sekcji Materiały dodatkowe tego dokumentu.
Dokument nie wymaga konkretnego języka programowania. Wiadomości można wysyłać i odbierać za pomocą dowolnego języka programowania, który pozwala wysyłać żądania HTTP i analizować odpowiedzi XML.
Szczegóły protokołu
Ta sekcja opisuje format dokumentu Google Data Data i składnię zapytań.
Format dokumentu
Protokół Google Data Protocol i Atom mają ten sam podstawowy model danych: kontener, w którym znajdują się zarówno dane globalne, jak i dowolna liczba wpisów. W przypadku każdego protokołu format jest określany przez schemat podstawowy, ale można go rozszerzyć za pomocą obcych przestrzeni nazw.
Atom to domyślny format protokołu danych Google. Aby wysłać odpowiedź w innym formacie, użyj parametru zapytania alt
. Więcej informacji znajdziesz w artykule Zapytania.
Uwaga: większość kanałów Google Data Protocol w formacie Atom używa przestrzeni nazw Atom jako domyślnej przestrzeni nazw, podając atrybut xmlns
w elemencie pliku danych, tak jak w przykładach podanych w sekcji Protocol Basics. Dlatego przykłady w tym dokumencie nie określają jednoznacznie atom:
w przypadku elementów w formacie Atom.
W tabelach poniżej znajdziesz elementy Atom przedstawiające elementy schematu. Wszystkie dane, które nie zostały wymienione w tych tabelach, są traktowane jak zwykły kod XML. O ile nie wskazano inaczej, elementy XML w danej kolumnie znajdują się w przestrzeni nazw Atom.
Uwaga: w tym podsumowaniu zastosowano standardową notację XPath: ukośniki pokazują hierarchię elementów, a znak @ wskazuje atrybut elementu.
W poniższych tabelach wymagane są wyróżnione elementy.
Tabela przedstawia elementy kanału danych Google:
Element schematu kanału | Reprezentacja Atom |
---|---|
Tytuł pliku danych | /feed/title |
Identyfikator kanału RSS | /feed/id |
Link do kanału HTML | /feed/link[@rel="alternate"] \[@type="text/html"]/@href |
Opis kanału | /feed/subtitle |
Język pliku danych | /feed/@xml:lang |
Prawa autorskie kanału | /feed/rights |
Autor kanału |
(w niektórych przypadkach wymagane; zobacz specyfikację Atom). |
Data ostatniej aktualizacji pliku danych | /feed/updated (format RFC 3339) |
Kategoria pliku danych | /feed/category/@term |
Schemat kategorii pliku danych | /feed/category/@scheme |
Generator plików danych | /feed/generator /feed/generator/@uri |
Ikona pliku danych | /feed/icon |
Logo pliku danych | /feed/logo |
Poniższa tabela przedstawia elementy kanału wyników wyszukiwania Google Data Protocol. Pamiętaj, że protokół udostępnia niektóre elementy odpowiedzi OpenSearch 1.1 w kanałach wyników wyszukiwania.
Element schematu kanału wyników wyszukiwania | Reprezentacja Atom |
---|---|
Liczba wyników wyszukiwania | /feed/openSearch:totalResults |
Indeks początkowy wyniku wyszukiwania | /feed/openSearch:startIndex |
Liczba wyników wyszukiwania na stronie | /feed/openSearch:itemsPerPage |
Tabela zawiera elementy wpisu dotyczącego protokołu danych Google:
Element schematu wpisów | Reprezentacja Atom |
---|---|
Entry ID | /feed/entry/id |
Tytuł wpisu | /feed/entry/title |
Link do wpisu | /feed/entry/link |
Podsumowanie wpisu |
(w niektórych przypadkach wymagane; zobacz specyfikację Atom). |
Treść wpisu |
(Jeśli nie ma elementu treści, wpis musi zawierać co najmniej 1 element |
Autor wpisu |
(w niektórych przypadkach wymagane; zobacz specyfikację Atom). |
Kategoria wpisu | /feed/entry/category/@term |
Schemat kategorii wpisów | /feed/entry/category/@scheme |
Data publikacji wpisu | /feed/entry/published (RFC 3339) |
Data aktualizacji wpisu | /feed/entry/updated (RFC 3339) |
Zapytania
W tej sekcji dowiesz się, jak korzystać z systemu zapytań.
Pytania dotyczące projektowania modeli zapytań
Model zapytań jest celowo bardzo prosty. Podstawowe założenia to:
- Zapytania są podawane jako identyfikatory URI HTTP, a nie jako nagłówki HTTP czy jako część ładunku. Jedną z zalet takiego podejścia jest to, że możesz dodać link do zapytania.
- Predykaty obejmują zakres pojedynczego elementu. Nie ma więc możliwości wysłania zapytania o korelację, na przykład „znajdź wszystkie e-maile od osób, które wysłały mi dzisiaj co najmniej 10 e-maili”.
- Zestaw właściwości, które mogą być wskazywane przez zapytania, jest bardzo ograniczony. Większość zapytań to proste zapytania tekstowe.
- Kolejność wyników zależy od implementacji.
- Protokół można w naturalny sposób zwiększać. Jeśli chcesz udostępnić dodatkowe predykaty lub sortować usługę, możesz to łatwo zrobić, wprowadzając nowe parametry.
Zapytania
Klient wysyła zapytanie do usługi Google, wysyłając żądanie HTTP GET
. Identyfikator URI zapytania składa się z identyfikatora URI zasobu (w pliku Atom o nazwie FeedURI) i parametrów zapytania. Większość parametrów zapytania jest wyświetlanych jako tradycyjne parametry adresu URL ?name=value[&...]
. Parametry kategorii są obsługiwane w różny sposób (patrz poniżej).
Jeśli np. identyfikator URI to http://www.example.com/feeds/jo
, możesz wysłać zapytanie z tym identyfikatorem URI:
http://www.example.com/feeds/jo?q=Darcy&updated-min=2005-04-19T15:30:00Z
Protokół danych Google obsługuje warunkowe HTTP GET
. Interfejsy API, które implementują protokół, ustawiają nagłówek odpowiedzi Last-Modified na podstawie wartości elementu <atom:updated>
w zwróconym pliku lub wpisie. Klient może wysłać tę wartość z powrotem jako wartość nagłówka żądania If-Modified-From, by uniknąć ponownego pobrania treści, jeśli się nie zmieniła. Jeśli treści nie zmieniły się od czasu If-Modified-From, usługa zwraca odpowiedź HTTP 304 (nie zmodyfikowano).
Interfejsy API, które implementują protokół danych Google, muszą obsługiwać zapytania alt
. Obsługa innych parametrów jest opcjonalna. Jeśli wystąpi standardowy parametr, który nie jest zrozumiały dla danej usługi, wyświetla się odpowiedź 403 Forbidden
. Przekazanie nieobsługiwanego parametru niestandardowego powoduje wysłanie odpowiedzi 400 Bad Request
. Informacje o innych kodach stanu znajdziesz w sekcji dotyczącej kodów stanu HTTP w tym dokumencie.
Standardowe parametry zapytania znajdziesz w tabeli poniżej. Wszystkie wartości parametrów muszą być zakodowane na potrzeby adresu URL.
Parametr | Znaczenie | Uwagi |
---|---|---|
alt |
Alternatywny typ reprezentacji |
|
author |
Autor wpisu |
|
category |
Filtr zapytań kategorii |
|
/-/category |
Filtr zapytań kategorii |
|
entryID | Identyfikator konkretnego wpisu do pobrania |
|
fields |
Filtr odpowiedzi |
|
max-results |
Maksymalna liczba wyników do pobrania | W przypadku każdej usługi, która ma domyślną wartość max-results (aby ograniczyć domyślny rozmiar kanału), możesz podać bardzo dużą liczbę, jeśli chcesz otrzymać cały kanał. |
prettyprint |
Zwraca odpowiedź XML z identycznymi znakami podziału wiersza |
|
published-min , published-max |
jest ograniczona do daty publikacji wpisu; |
|
q |
Pełny tekst zapytania |
|
start-index |
1 indeks oparty na pierwszym wyniku do pobrania |
|
strict |
Ścisłe sprawdzanie parametru zapytania |
|
updated-min , updated-max |
Ograniczenia w dniu aktualizacji wpisu |
|
Zapytania dotyczące kategorii
Postanowiliśmy udostępnić nieco nietypowy format dla zapytań dotyczących kategorii. Zamiast wymagać zapytań takich jak to:
http://example.com/jo?category=Fritz&category=2006
umożliwiliśmy:
http://example.com/jo/-/Fritz/2006
Takie podejście pozwala zidentyfikować zasób bez używania parametrów zapytania i uzyskać bardziej przejrzyste identyfikatory URI. Wybraliśmy tę opcję w przypadku kategorii, ponieważ naszym zdaniem są najpopularniejsze.
Wadą tego podejścia jest to, że w tego typu zapytaniach wymagamy użycia atrybutu /-/
, aby usługi mogły odróżniać zapytania od kategorii od innych identyfikatorów URI zasobów, takich jak http://example.com/jo/MyPost/comments
.
Odpowiedzi na zapytania
Zapytania zwracają kanał Atom, wpis Atom lub kanał RSS, w zależności od parametrów żądania.
Wyniki wyszukiwania zawierają te elementy OpenSearch bezpośrednio pod elementem <feed>
lub <channel>
(w zależności od tego, czy wyniki to Atom czy RSS):
openSearch:totalResults
- Łączna liczba wyników wyszukiwania danego zapytania (niekoniecznie wszystkie widoczne w pliku danych wyników).
openSearch:startIndex
- Indeks 1 wyniku pierwszego wyniku.
openSearch:itemsPerPage
- Maksymalna liczba elementów na jednej stronie. Dzięki temu klienci mogą generować bezpośrednie linki do dowolnego zestawu kolejnych stron. Jeśli jednak chcesz natrafić na ten numer, zapoznaj się z uwagą na temat
start-index
w tabeli w sekcji Żądania zapytań.
Kanał i odpowiedzi Atom mogą zawierać również dowolne z tych elementów Atom i Data API (a także inne elementy wymienione w specyfikacji Atom):
<link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="..."/>
- Określa identyfikator URI, z którego można pobrać pełny kanał Atom.
<link rel="http://schemas.google.com/g/2005#post" type="application/atom+xml" href="..."/>
- Określa postURI kanału Atom (gdzie można publikować nowe wpisy).
<link rel="self" type="..." href="..."/>
- Zawiera identyfikator URI zasobu. Wartość atrybutu
type
zależy od żądanego formatu. Jeśli tymczasem nie nastąpi zmiana danych, wysłanie tej samej wartości GET do innego identyfikatora URI spowoduje zwrócenie tej samej odpowiedzi. <link rel="previous" type="application/atom+xml" href="..."/>
- Określa identyfikator URI poprzedniego fragmentu tego zestawu wyników (jeśli jest on podzielony).
<link rel="next" type="application/atom+xml" href="..."/>
- Określa identyfikator URI następnego fragmentu tego zestawu wyników zapytania, jeśli jest on podzielony.
<link rel="edit" type="application/atom+xml" href="..."/>
- Określa element EditURI we wpisie Atom (gdzie wysyłasz zaktualizowany wpis).
Oto przykładowa treść odpowiedzi w odpowiedzi na zapytanie:
<?xml version="1.0" encoding="UTF-8"?> <feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:gd='http://schemas.google.com/g/2005' gd:etag='W/"C0QBRXcycSp7ImA9WxRVFUk."'> <id>http://www.example.com/feed/1234.1/posts/full</id> <updated>2005-09-16T00:42:06Z</updated> <title type="text">Books and Romance with Jo and Liz</title> <link rel="alternate" type="text/html" href="http://www.example.net/"/> <link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://www.example.com/feed/1234.1/posts/full"/> <link rel="http://schemas.google.com/g/2005#post" type="application/atom+xml" href="http://www.example.com/feed/1234.1/posts/full"/> <link rel="self" type="application/atom+xml" href="http://www.example.com/feed/1234.1/posts/full"/> <author> <name>Elizabeth Bennet</name> <email>liz@gmail.com</email> </author> <generator version="1.0" uri="http://www.example.com">Example Generator Engine</generator> <openSearch:totalResults>2</openSearch:totalResults> <openSearch:startIndex>0</openSearch:startIndex> <entry gd:etag='W/"C0QBRXcycSp7ImA9WxRVGUo."'> <id>http://www.example.com/feed/1234.1/posts/full/4521614025009481151</id> <published>2005-01-09T08:00:00Z</published> <updated>2005-01-09T08:00:00Z</updated> <category scheme="http://www.example.com/type" term="blog.post"/> <title type="text">This is the title of entry 1009</title> <content type="xhtml"> <div xmlns="http://www.w3.org/1999/xhtml">This is the entry body of entry 1009</div> </content> <link rel="alternate" type="text/html" href="http://www.example.com/posturl"/> <link rel="edit" type="application/atom+xml" href="http://www.example.com/feed/1234.1/posts/full/4521614025009481151"/> <author> <name>Elizabeth Bennet</name> <email>liz@gmail.com</email> </author> </entry> <entry gd:etag='W/"C0QBRXrurSp7ImA9WxRVGUo."'> <id>http://www.example.com/feed/1234.1/posts/full/3067545004648931569</id> <published>2005-01-07T08:00:00Z</published> <updated>2005-01-07T08:02:00Z</updated> <category scheme="http://www.example.com/type" term="blog.post"/> <title type="text">This is the title of entry 1007</title> <content type="xhtml"> <div xmlns="http://www.w3.org/1999/xhtml">This is the entry body of entry 1007</div> </content> <link rel="alternate" type="text/html" href="http://www.example.com/posturl"/> <link rel="edit" type="application/atom+xml" href="http://www.example.com/feed/1234.1/posts/full/3067545004648931569"/> <author> <name>Elizabeth Bennet</name> <email>liz@gmail.com</email> </author> </entry> </feed>
Jeśli żądany plik danych ma format Atom, a nie zostały określone żadne parametry zapytania i nie zawiera on wszystkich wpisów, w kanale najwyższego poziomu pojawi się ten element: <link rel="next" type="application/atom+xml" href="..."/>
. Wskazuje on kanał zawierający następny zbiór wpisów. Kolejne zestawy zawierają odpowiedni element <link rel="previous" type="application/atom+xml" href="..."/>
. Klikając wszystkie kolejne linki, klient może pobrać wszystkie wpisy z kanału.
Kody stanów HTTP
W tabeli poniżej opisujemy, co oznaczają różne kody stanu HTTP w kontekście interfejsów API danych.
Kod | Objaśnienie |
---|---|
200 OK | Brak błędów. |
201 UTWORZONE | Udało się utworzyć zasób. |
304 NIE ZMODYFIKOWANO | Zasób nie zmienił się od czasu określonego w nagłówku If-Modified-From. |
400 ZŁYCH PROŚB | Nieprawidłowy identyfikator URI lub nagłówek żądania albo nieobsługiwany parametr niestandardowy. |
401 NIEAUTORYZOWANYCH | Wymagana jest autoryzacja. |
403 Zabronione | Nieobsługiwany parametr standardowy albo uwierzytelnianie lub autoryzacja nie powiodło się. |
404 NIE ZNALEZIONO | Nie znaleziono zasobu (np. kanału lub wpisu). |
409 ROZWÓJ | Podany numer wersji nie odpowiada numerowi najnowszej wersji zasobu. |
410 GONE | Historia żądanych zmian nie jest już dostępna na serwerze. Więcej informacji znajdziesz w dokumentacji poszczególnych usług. |
500 WEWNĘTRZNY BŁĄD SERWERA | Błąd wewnętrzny. Jest to kod domyślny, który jest używany w przypadku wszystkich nierozpoznanych błędów serwera. |
Obsługa wersji zasobu (ETag)
Czasami musisz mieć możliwość odwołania się do konkretnej wersji konkretnego wpisu.
Jest to szczególnie ważne w 2 przypadkach:
- „Pobieranie warunkowe”, w którym klient wysyła żądanie, a serwer wysyła wpis tylko wtedy, gdy zmienił się on od czasu, gdy klient ostatnio go o to poprosił.
- Zadbaj o to, aby wielu klientów nie przypadkiem nie zastępowało swoich zmian. Interfejsy API danych wykonują tę czynność przez aktualizowanie i usuwanie, jeśli klient określi stary identyfikator wersji wpisu.
Interfejsy Google Data API obsługują oba te przypadki przy użyciu ETags (standardowej części HTTP).
ETag to identyfikator określający konkretną wersję danego wpisu. Serwer dołącza tag ETag do wpisów i elementów kanału, które wysyła do klientów. Gdy wpis lub kanał ulega zmianie, zmienia się też tag ETag.
Interfejsy API danych Google udostępniają znaczniki ETag w 2 miejscach: w nagłówku HTTP ETag
oraz w atrybucie gd:etag
elementów <feed>
i <entry>
.
W interfejsach API danych Google tag ETag jest zwykle ciągiem liter i cyfr. Czasami zawiera też łączniki i kropki. Zwykle jest on ujęty w cudzysłowy. (cudzysłowy są częścią ETagu). Oto przykładowy tag ETag z wpisu do interfejsu Data API: "S0wCTlpIIip7ImA0X0QI"
.
Istnieją 2 rodzaje ETagów: silne i słabe. Intensywne tagi ETag określają konkretną wersję konkretnego wpisu i mogą być używane do zastępowania zmian innych klientów. Słabe tagi ETag w kontekście interfejsów API danych Google są używane tylko do warunkowego pobierania. Słaby tag ETag zawsze zaczyna się od W/
. Na przykład: W/"D08FQn8-eil7ImA9WxZbFEw."
Nie wszystkie interfejsy API danych Google obsługują silne tagi ETag. W pozostałych przypadkach silne tagi ETag będą używane tylko w przypadku wpisów. Tagi ETag w plikach danych są zawsze słabe.
Oto przykład kanału (w tym niektóre nagłówki HTTP) pobranego z usługi, która obsługuje silne tagi ETag:
GData-Version: 2.0 ETag: W/"C0QBRXcycSp7ImA9WxRVFUk." ... <?xml version='1.0' encoding='utf-8'?> <feed xmlns='http://www.w3.org/2005/Atom' xmlns:gd='http://schemas.google.com/g/2005' gd:etag='W/"C0QBRXcycSp7ImA9WxRVFUk."'> ... <entry gd:etag='"CUUEQX47eCp7ImA9WxRVEkQ."'> ... </entry> </feed>
Biblioteki klienta, które obsługują wersje 2 interfejsów API danych, w przejrzysty sposób obsługują znaczniki ETag. Te informacje są przeznaczone dla klientów, którzy nie korzystają z bibliotek klienta, oraz dla czytelników zainteresowanych obsługą wersji na poziomie protokołu.
Uwaga: informacje o systemie obsługi wersji zasobów używanym w wersji 1.0 interfejsów API danych znajdziesz w przewodniku po wersji 1.0.
Pobieranie warunkowe
Jeśli chcesz pobrać pobrany wcześniej wpis, możesz zwiększyć wydajność, informując serwer, aby wysyłał tylko te wpisy, które zostały zmienione od czasu ostatniego pobrania.
Aby przeprowadzić tego rodzaju pobieranie warunkowe, wyślij żądanie HTTP GET
zawierające nagłówek HTTP If-None-Match
. W nagłówku określ tag ETag wpisu.
Oto przykład nagłówka If-None-Match
:
If-None-Match: W/"D08FQn8-eil7ImA9WxZbFEw."
Gdy serwer otrzyma to żądanie, sprawdza, czy żądana pozycja ma taki sam tag ETag jak określony przez Ciebie tag ETag. Jeśli tagi ETags pasują, wpis się nie zmienił, a serwer zwraca kod stanu HTTP 304 Not Modified
.
Jeśli tagi ETag nie są zgodne, oznacza to, że wpis został zmodyfikowany od czasu ostatniego żądania, a serwer zwraca wpis.
Aktualizowanie wpisów
Najłatwiejszym sposobem na zastąpienie zmian wprowadzonych przez innego klienta jest zaktualizowanie serwera tak, aby gdy klient wysyłał zaktualizowany wpis, wersja utworzona przez niego jest taka sama jak bieżąca wersja przechowywana przez serwer. Jeśli drugi klient zaktualizuje oprogramowanie przed aktualizacją, zostanie ona odrzucona, ponieważ klient nie określa już modyfikacji na podstawie najnowszej wersji.
Gdy klient pobiera dane z usługi, która obsługuje silne tagi ETag, każdy wpis ma tag ETag, który jako unikalny identyfikator wersji odpowiada tej wersji tego wpisu.
Uwaga: aktualizowanie ETagów działa tylko w przypadku silnych tagów ETag. W przypadku usług, które udostępniają słabe tagi ETag, wszystkie aktualizacje są skuteczne niezależnie od tego, czy ktoś inny zaktualizował wpis od czasu jego pobrania. Najnowsza aktualizacja zawsze zastępuje wszystkie wcześniejsze aktualizacje. Nie wysyłaj więc słabej wartości ETag podczas aktualizowania lub usuwania. Jeśli tak, pojawi się komunikat o błędzie.
Gdy klient wysyła aktualizację usługi strong-ETags, musi określić, która wersja wpisu jest aktualizowana. Możesz to zrobić na 2 sposoby:
- Użyj nagłówka HTTP
If-Match
. - Użyj atrybutu
gd:etag
w elemencie<atom:entry>
.
Zalecamy, aby w miarę możliwości korzystać z metody If-Match
.
Aby zaktualizować wpis za pomocą If-Match
, zacznij od pozyskania tego wpisu. Wprowadź odpowiednie zmiany we wpisie, a następnie utwórz nowe żądanie PUT
ze zmodyfikowanym wpisem. (Szczegółowe informacje o adresach URL do użycia znajdziesz w dokumentacji poszczególnych usług).
Zanim wyślesz PUT
, dodaj nagłówek HTTP If-Match
zawierający tag ETag z pierwotnego wpisu:
If-Match: "S0wCTlpIIip7ImA0X0QI"
Następnie wyślij żądanie PUT
.
Jeśli aktualizacja się powiedzie, serwer zwróci kod stanu HTTP 200 OK
i kopię zaktualizowanego wpisu.
Jeśli aktualizacja się nie powiedzie, ponieważ podany ETag nie pasuje do bieżącego tagu ETag w wpisie (co sugeruje, że wpis zmienił się na serwerze od ostatniego pobrania), serwer zwraca kod stanu HTTP 412 Precondition Failed
.
Jeśli nie możesz łatwo napisać nagłówków HTTP lub masz inny powód, by nie używać nagłówka If-Match
, możesz zamiast tego użyć atrybutu gd:etag
.
Jeśli nagłówek If-Match
nie zostanie wysłany, serwer użyje wartości atrybutu gd:etag
zaktualizowanego wpisu jako domniemanej wartości If-Match
.
Aby zastąpić system obsługi wersji i zaktualizować wpis niezależnie od tego, czy został on zaktualizowany przez kogoś innego, użyj If-Match: *
zamiast określania tagu ETag w nagłówku.
Informacje na temat usług, które obsługują silne znaczniki ETag, znajdziesz w przewodniku po migracji.
Usuwanie wpisów
Usuwanie wpisów, które używają silnych tagów ETag, przypomina ich aktualizowanie.
Aby usunąć wpis z silnym tagiem ETag, najpierw pobierz wpis, który chcesz usunąć, a następnie wyślij żądanie DELETE
na adres URL edycji wpisu.
Jeśli chcesz mieć pewność, że nie usuniesz wpisu zmienionego przez innego klienta od czasu jego pobrania, dołącz nagłówek HTTP If-Match
zawierający wartość ETag oryginalnego wpisu.
Jeśli chcesz zastąpić system obsługi wersji i usunąć wpis niezależnie od tego, czy został on zaktualizowany przez kogoś innego, użyj If-Match: *
zamiast określania tagu ETag w nagłówku.
Jeśli wpis nie ma silnego tagu ETag, żądanie DELETE
zawsze zostaje zrealizowane.
Odpowiedź częściowa (funkcja eksperymentalna)
Domyślnie po przetworzeniu żądań serwer wysyła pełną reprezentację zasobu docelowego. Częściowa odpowiedź umożliwia wysyłanie żądań tylko wybranych elementów lub atrybutów, a nie pełnego zasobu. Dzięki temu aplikacja kliencka nie musi przenosić, analizować ani przechowywać niepotrzebnych pól, co pozwala wydajniej wykorzystywać zasoby sieciowe, CPU i pamięć.
Aby dowiedzieć się, czy w przypadku używanej usługi jest dostępna odpowiedź częściowa, zapoznaj się z dokumentacją interfejsu API.
Aby zażądać częściowej odpowiedzi, użyj parametru zapytania fields
, aby określić elementy lub atrybuty, które chcesz wyświetlić. Oto przykład:
http://www.example.com/feeds?fields=link,entry(@gd:etag,id,updated,link[@rel='edit']))
Odpowiedź serwera zawiera tylko elementy linku i wpisu dla pliku danych. Elementy wpisu zawierają tylko tag ETag, ID, zaktualizowany i edytuj link. Składnia parametrów zapytania fields
jest opisana w poniższych sekcjach. Więcej informacji o odpowiedziach znajdziesz w artykule Obsługa częściowych odpowiedzi.
Uwaga: parametru zapytania fields
możesz używać w każdym żądaniu zwrotu danych. Obejmują one nie tylko parametry GET
, ale też POST
i PUT
(oraz PATCH
, która służy do częściowych aktualizacji). Parametr zapytania fields
wpływa jednak tylko na dane odpowiedzi. Nie ma wpływu na dane, które należy podać, ani na pola, które zostaną zaktualizowane lub utworzone.
Podsumowanie składni parametru Pola
Format wartości parametru zapytania fields
jest oparty na składni XPath, obsługuje jednak tylko część prawidłowych wyrażeń XPath. Podsumowanie obsługiwanej składni znajdziesz poniżej, a dodatkowe przykłady znajdziesz w tej sekcji.
- Aby wybrać kilka pól, użyj listy rozdzielonej przecinkami.
- Użyj elementu
a/b
, aby wybrać elementb
zagnieżdżony w elemenciea
. Użyj elementua/b/c
, aby wybrać elementc
umieszczony w elemencieb
. - Użyj prefiksu
'@'
, aby zidentyfikować atrybut o podanej nazwie. Pomiń prefiks'@'
, aby wskazać element. - Zastosuj warunki pól, aby wybrać elementy spełniające określone kryteria, umieszczając wyrażenia w nawiasach „
[ ]
” po elemencie, który chcesz ograniczyć.Na przykład
fields=entry[author/name='Elizabeth']
zwraca tylko wpisy w pliku danych, których autorem jest Elżbieta. - Określ selektory pól, aby żądały tylko określonych atrybutów lub elementów podrzędnych, umieszczając wyrażenia w nawiasach „
( )
” po dowolnym wybranym elemencie.fields=entry(id,author/email)
zwraca na przykład tylko identyfikator i adres e-mail autora każdego wpisu kanału. - Możesz ograniczyć ciągi znaków, używając cudzysłowów podwójnych lub pojedynczych
.
Aby uniknąć podwójnego cudzysłowu, powtórz cudzysłów. Na przykład
"""Hello,"" he said"
tworzy ciąg"Hello," he said
, a'''Hello,'' he said'
tworzy ciąg'Hello,' he said
. - W polach możesz używać symboli wieloznacznych.
Na przykład
entry/gd:*
wybiera wszystkie elementy podrzędne wpisu w przestrzeni nazwgd
, aentry/@gd:*
wybiera atrybuty podrzędne w tej samej przestrzeni nazw.
Parametr zapytania fields
działa jak filtr wyjściowy. Oznacza to, że odpowiedź częściowa jest obliczana dopiero po przetworzeniu pozostałej części zapytania. Jeśli na przykład określisz parametr zapytania max-results
wskazujący, że chcesz wygenerować 20 wyników na stronie, zostaną wygenerowane pierwsze 20 wyników, na podstawie których zostanie obliczona częściowa odpowiedź. Jeśli specyfikacja fields
nie pasuje do żadnego z pierwszych 20 wpisów wybranych przez zapytanie, zwracasz pusty plik danych, ale nie zwracasz pierwszych 20 pasujących wpisów.
Uwaga: nie próbuj używać warunków pól do wyboru zapytań. Oznacza to, że nie próbuj pobierać całego pliku danych i stosuj warunki pól, aby odfiltrowywać interesujące Cię elementy z bardzo dużego zbioru danych. Gdy tylko jest to możliwe, używaj innych parametrów zapytania, takich jak start-index
i max-results
, aby ograniczyć wyniki każdego zapytania do rozmiaru, który ułatwia obsługę. W przeciwnym razie wzrost wydajności spowodowany częściową odpowiedzią może zrównoważyć pogorszenie wydajności spowodowane nieprawidłowym użyciem.
Formatowanie wartości parametru w polach
Z podanych niżej wskazówek dowiesz się, jak utworzyć wartość parametru zapytania fields
. Każda wskazówka zawiera przykłady i opisuje, jak wartość parametru wpływa na odpowiedź.
Uwaga: tak jak każda wartość parametru zapytania, wartość parametru fields
musi być zakodowana na potrzeby adresu URL. W celu zapewnienia czytelności w poniższych przykładach pominięto kodowanie.
- Znajdź pola, które chcesz zwrócić, lub wybierz pola.
- Wartość parametru zapytania
fields
to rozdzielona przecinkami lista elementów lub atrybutów (łącznie nazywanych polami). Każde pole jest określane względem elementu głównego reprezentacji zasobu. Oznacza to, że jeśli pobierasz plik danych, pola są określane względem elementu<feed>
, a jeśli pobierasz pojedynczy wpis – pola są określane względem elementu<entry>
. Jeśli wybrany element jest (lub jest częścią) elementu cyklicznego w pliku danych, usługa zwraca wszystkie jego wystąpienia.
Oto kilka przykładów na poziomie pliku danych:
Przykłady Efekt entry
Zwraca wszystkie elementy <entry>
i ich elementy podrzędne, ale nie inne elementy podrzędne elementu<feed>
.id,entry
Zwraca zarówno plik danych <id>
, jak i wszystkie elementy<entry>
.entry/title
Zwraca element <title>
we wszystkich wpisach w pliku danych.
Gdy zwracany jest zagnieżdżony element, odpowiedź zawiera tagi zamykające dla wszystkich elementów nadrzędnych. Tagi nadrzędne nie zawierają żadnych innych elementów podrzędnych ani atrybutów, chyba że zostaną wybrane wyraźnie.
entry/author/uri
Zwraca tylko podelement <uri>
elementu<author>
dla wszystkich wpisów w pliku danych.entry/*:rating
Zwraca w przestrzeni nazw tylko elementy podrzędne o lokalnej nazwie rating
we wszystkich wpisach w pliku danych.
Oto kilka przykładów:
Przykłady Efekt author
Zwraca element podrzędny <author>
we wpisie docelowym.@gd:etag
Zwraca atrybut etag
wpisu docelowego.author/uri
Zwraca podelement <uri>
elementu<author>
dla wpisu docelowego.media:group/media:*
Zwraca wszystkie pola podrzędne pola <media:group>
w przestrzeni nazwmedia
dla wpisu docelowego. - Ogranicz odpowiedzi do wybranych pól, które spełniają określone kryteria, lub użyj warunków pól.
- Domyślnie, jeśli żądanie określa element, który występuje więcej niż raz, odpowiedź częściowa będzie obejmować wszystkie wystąpienia tego elementu. Za pomocą składni „
[ ]
” możesz jednak określić, że odpowiedź powinna zawierać tylko elementy o konkretnej wartości atrybutu lub spełniające inne warunki, tak jak w przykładach poniżej. Więcej informacji znajdziesz w sekcji Składnia warunków pola.Przykłady Efekt entry[link/@rel='edit']
Zwraca wszystkie wpisy w pliku danych, które zawierają element <link>
z wartością atrybuturel
równą'edit'
.entry/title[text()='Today']
Zwraca wszystkie elementy <title>
, które pojawiają się we wpisach w pliku danych, jeśli ich zawartość to'Today'
.entry/author[name='Jo']
Zwraca wszystkie elementy <author>
występujące we wpisach w pliku danych, jeśli zawierają element podrzędny<name>
z treścią'Jo'
.author[name='Jo']
Zwraca element <author>
we wpisie docelowym, jeśli zawiera element podrzędny<name>
z treścią'Jo'
. - Poproś tylko o wybrane elementy lub użyj selektorów podrzędnych.
- Domyślnie, jeśli żądanie określa określone elementy, usługa zwraca elementy w całości. Możesz określić, że odpowiedź powinna zawierać tylko niektóre elementy podrzędne z wybranych elementów. W tym celu użyj składni wyboru podrzędnego „
( )
”, jak pokazano w poniższych przykładach.Przykłady Efekt entry/author(uri)
Zwraca tylko element podrzędny <uri>
dla autorów we wpisach kanału.entry/author[name='Jo'](uri)
Zwraca tylko podelement <uri>
elementu<author>
w przypadku wszystkich wpisów o nazwie autora'Jo'
.entry(link(@rel,
@href))
Zwraca tylko wartości atrybutów rel
ihref
dla każdego elementu<link>
we wpisach pliku danych.entry(title,link[@rel='edit'])
Zwraca tylko elementy <title>
i<link>
, które mają przypisane atrybutyrel
do każdego wpisu w pliku danych.entry(title,author(uri)
Zwraca zarówno elementy <title>
, jak i elementy autora<uri>
.
Więcej informacji o składni warunku pola
W warunkach możesz używać pól lub pól podrzędnych. Aby wybrane pole zostało uwzględnione w wynikach, warunek musi mieć wartość Prawda.Jeśli nie ma warunku pola, uwzględniane są wszystkie pola wybranego typu.
Wartość tekstowa wybranego pola jest używana do porównań. W tym kontekście, jeśli pole jest elementem, wartością tekstową jest jego zawartość. Jeśli pole jest atrybutem, wartością tekstową jest wartość atrybutu. Jeśli pole nie ma wartości tekstowej, porównanie się nie powiedzie, a pole nie zostanie uwzględnione w wynikach.
Poniższa tabela zawiera operatory XPath obsługiwane w warunkach pól i przykładowe przykłady.
Operator | Składnia | Przykłady |
---|---|---|
Porównanie ciągów znaków |
|
|
Porównanie logiczne | and |
|
Porównanie liczbowe | = lub eq != lub ne > lub gt > = lub ge < lub lt <= lub le
|
|
Porównanie dat | Korzystaj z operatorów porównania liczbowego, tak jak w przykładach. | Aby przeprowadzić porównania dat lub dat i godzin, możesz przesyłać elementy, atrybuty lub literatury ciągów do
|
Obecność | Użyj nazwy elementu lub atrybutu zgodnie z przykładami. |
|
Wartość logiczna | true() false()
|
Wartość logiczna może być przydatna podczas testów, gdy chcesz wymusić spełnienie warunków pola do wartości prawda lub fałsz.
|
Radzenie sobie z odpowiedziami częściowymi
Gdy serwer, który obsługuje częściową odpowiedź, przetwarza prawidłowe żądanie zawierające parametr zapytania fields
, wysyła kod stanu HTTP 200 OK
wraz z żądanymi atrybutami lub elementami. Jeśli parametr zapytania fields
zawiera błąd lub jest nieprawidłowy z innego powodu, serwer zwraca kod stanu HTTP 400 Bad Request
.
Głównym elementem odpowiedzi jest <feed>
lub <entry>
, w zależności od docelowego identyfikatora URI. Zawartość elementu głównego obejmuje tylko wybrane pola pliku danych lub wpisy wraz z tagami zamykającymi dla elementów nadrzędnych.
Wartość parametru żądania fields
można cofnąć na 2 sposoby:
- Element główny ma atrybut
gd:fields
, który pokazuje wartość parametru zapytaniafields
określonego w żądaniu. - Jeśli docelowy identyfikator URI jest plikiem danych, każda możliwa do edytowania pozycja ma atrybut
gd:fields
, który pokazuje tylko część zaznaczonego polafields
.
Uwaga: aby zobaczyć wartości atrybutu gd:fields
w odpowiedzi częściowej, musisz uwzględnić je w specyfikacji parametru zapytania fields
. Możesz to zrobić za pomocą właściwości @gd:fields
lub używając ogólniejszej metody @gd:*
, która zawiera też informacje o tagu ETag.
Poniżej znajduje się przykład zapytania, które powoduje zwracanie przez serwer dokumentu zawierającego tylko atrybuty z przestrzeni nazw gd
(na poziomie kanału i wpisu), a także identyfikatora, tytułu i linku edycji każdego wpisu w kanale:
http://example.com/myFeed?fields=@gd:*,id,entry(@gd:*,title,link[@rel='edit'])
Serwer zwraca tę częściową odpowiedź wraz z kodem stanu HTTP 200 Successful
:
<?xml version='1.0' encoding='utf-8'?> <feed xmlns='http://www.w3.org/2005/Atom' xmlns:gd='http://schemas.google.com/g/2005' gd:etag='W/"DEAEQH47eCp7IWA9WxBVGUo."' gd:fields='@gd:*,id,entry(@gd:*,title,link[@rel='edit'])> <id>http://example.com/myFeed</id> <entry gd:etag='"EksPTg1Bfyp7IWA6WhJT"' gd:fields="@gd:*,title,link[@rel='edit']"> <link rel='edit' href='http://example.com/myFeed/1/'/> <title>This year</title> </entry> <entry gd:etag='"EksPQA1Cdyp7IWA6WhJT"' gd:fields="@gd:*,title,link[@rel='edit']"> <link rel='edit' href='http://example.com/myFeed/2/'/> <title>Last year</title> </entry> <entry d:etag='"EksPQAxHeCp7IWA6WhJT"' gd:fields="@gd:*,title,link[@rel='edit']"> <link rel='edit' href='http://example.com/myFeed/3/'/> <title>Today</title> </entry> </feed>
Jeśli wybrane pola nie pasują do siebie, usługa nadal zwraca kod stanu HTTP 200 Successful
, ale odpowiedź częściowa to pusty plik danych:
<?xml version='1.0' encoding='utf-8'?> <feed xmlns='http://www.w3.org/2005/Atom' xmlns:gd='http://schemas.google.com/g/2005' gd:etag='W/"DEAEQH47eCp7IWA9WxBVGUo."' gd:fields='@gd:*,id,entry(@gd:*,title,link[@rel='edit'])> </feed>
Częściowa aktualizacja (eksperymentalna)
Usługi Google, które obsługują częściową odpowiedź i materiały, które można edytować, umożliwiają korzystanie z częściowej aktualizacji. W przypadku częściowej aktualizacji wysyłasz tylko pola, które chcesz zaktualizować, zamiast zmodyfikowanej wersji pełnej reprezentacji zasobów. Pozwala to zwiększyć wydajność aplikacji klienckiej podczas aktualizowania oraz częściowej odpowiedzi na pobieranie danych.
Zamiast używać PUT
, musisz jednak użyć żądania PATCH
podczas częściowej aktualizacji. Znaczenie jest przydatne dla elementu PATCH
, dzięki czemu możesz dodawać, zastępować i usuwać określone pola w przypadku konkretnego wpisu – wystarczy jedno żądanie.
Aby sprawdzić, czy dostępna jest częściowa aktualizacja usługi, której używasz, zapoznaj się z jej dokumentacją.
Przesyłanie częściowej prośby o aktualizację
Aby przesłać częściową prośbę o aktualizację, wyślij żądanie HTTP PATCH
na ten sam adres URL, którego zwykle używasz w przypadku PUT
. Treść żądania PATCH
to częściowy element <entry>
określający pola, które chcesz dodać lub zmodyfikować. Atrybut gd:fields
wpisu wskazuje pola, które chcesz usunąć.
Serwer przetwarza żądania PATCH
w określonej kolejności:
- Najpierw usuwa się z zasobu reprezentującego pola określone w atrybucie
gd:fields
.Składnia atrybutu
gd:fields
jest taka sama jak w parametrze zapytaniafields
używanym w żądaniu częściowej odpowiedzi. Więcej informacji znajdziesz w sekcji Obsługiwana składnia. - Następnie scala się z istniejącym zasobem reprezentującym dane podane w treści żądania.
Więcej informacji o scalaniu danych znajdziesz w sekcji Dodawanie i aktualizowanie pól poniżej.
Uwaga: treść żądania PATCH
nie jest zwykle zgodna z formatem Atom Syndication Format, więc Content-Type
, którego używasz z żądaniem PATCH
, to application/xml
.
Oto przykład żądania częściowej aktualizacji:
PATCH /myFeed/1/1/ Content-Type: application/xml <entry xmlns='http://www.w3.org/2005/Atom' xmlns:gd='http://schemas.google.com/g/2005' gd:fields='description'> <title>New title</title> </entry>
To żądanie PATCH
wprowadza następujące zmiany w reprezentacji zasobu przechowywanej na serwerze dla wpisu docelowego identyfikatora URI:
- Usuwa element
<description>
. - Aktualizuje element
<title>
.
Semantyka częściowego żądania aktualizacji
Z instrukcji poniżej dowiesz się, jak skonfigurować żądanie PATCH
dotyczące usunięcia, dodania lub zaktualizowania określonych pól we wpisie. Jedno żądanie PATCH
może wykonać dowolną kombinację tych operacji.
Usuwanie pól. Użyj atrybutu
gd:fields
elementu<entry>
, aby zidentyfikować pola, które chcesz usunąć z zasobu. Poniżej znajduje się przykład żądania usunięcia tytułu i podsumowania powiązanych z wpisem. Prośba nie powoduje jednak dodania ani aktualizacji innych danych dla danego wpisu.PATCH /myfeed/1/1/ Content-Type: application/xml <entry xmlns='http://www.w3.org/2005/Atom' xmlns:gd='http://schemas.google.com/g/2005' gd:fields='title,summary'/>
Dodawanie lub aktualizowanie pól. W elemencie
<entry>
określ, jakie dane chcesz dodać lub zaktualizować. Pola te są scalane z dotychczasowymi danymi zasobu po usunięciu wszystkich informacji zgodnie z tymi regułami:Pola, które nie są jeszcze dodane, zostaną dodane. Jeśli dane zasobu nie podają wartości dla danego pola, pole zostanie dodane do istniejących danych. Jeśli na przykład wpis nie ma tytułu, a żądanie
PATCH
zawiera element<title>
, do filmu zostanie dodany nowy tytuł.Pola, które już istnieją, są zastępowane lub dołączane. Konkretne działanie scalania pól określone już w danych zasobu zależy od jego właściwości:
Niepowtarzające się pola są zastępowane. Jeśli dane zasobu określają już wartość elementu niepowtarzającego się, wartość określona w żądaniu
PATCH
zastępuje istniejącą wartość tego elementu. Na przykład w poniższym przykładzie nowy tytuł zastępuje istniejący.PATCH /myFeed/1/1/ Content-Type: application/xml <entry xmlns='http://www.w3.org/2005/Atom' xmlns:gd='http://schemas.google.com/g/2005'> <title>New Title</title> </entry>
Bardziej złożony przykład znajdziesz poniżej. W tym przykładzie załóżmy, że wpis może mieć tylko jednego autora, a zasób docelowy ma już wartości imienia i nazwiska oraz adresu e-mail autora. Element
<author>
ma 2 pola podrzędne, ale w dostępnych danych występuje tylko element<name>
. W rezultacie tylko wartość tego pola zostanie zastąpiona. Wartość elementu<email>
, której nie ma w danych, pozostaje bez zmian.PATCH /myfeed/1/1/ Content-Type: application/xml <entry xmlns='http://www.w3.org/2005/Atom' xmlns:gd='http://schemas.google.com/g/2005'> <author> <name>New Name</name> </author> </entry>
Powtarzające się pola są dołączane. Jeśli dane zasobu określają już wartość elementu cyklicznego, podany przez Ciebie element jest dodawany do istniejącego zestawu wartości.
Pamiętaj, że czasem możesz chcieć zrobić coś innego niż dodać nowe wystąpienie powtarzającego się elementu. Możesz na przykład wykonać jedną z tych czynności:
Zastąp całą listę powtarzających się elementów. Możesz usunąć wszystkie pola powtarzające się, używając atrybutu
gd:fields
(np.gd:fields='ns:accessControl'
) i przesłać pełny zestaw pól zastępczych. Wszystkie istniejące elementy są najpierw usuwane, więc zestaw podanych pól nie powoduje konfliktu z dołączonymi wartościami.Zastąp 1 wartość w zestawie istniejących wartości elementu cyklicznego. W takim przypadku po prostu usuń pojedynczy element, określając wartość
gd:fields
na tyle wąsko, aby uniknąć usunięcia innych wartości, które chcesz zachować. Aby na przykład usunąć tylko kontrolę dostępu z wartościąaction
embed
, możesz użyćgd:fields='ns:accessControl[@action="embed"]'
. Następnie musisz podać jedno pole, które chcesz zastąpić w treści elementu<entry>
:PATCH /myfeed/1/1/ Content-Type: application/xml <entry xmlns='http://www.w3.org/2005/Atom' xmlns:gd='http://schemas.google.com/g/2005' gd:fields='ns:accessControl[@action="embed"]> <ns:accessControl action="embed" permission="allowed" /> </entry>
Przetwarzanie odpowiedzi na częściową aktualizację
Po przetworzeniu prawidłowego częściowego żądania aktualizacji interfejs API zwraca kod odpowiedzi HTTP 200 OK
. Domyślnie treść odpowiedzi to pełny wpis zaktualizowany przez Ciebie. Serwer aktualizuje wartości ETag po przetworzeniu żądania PATCH
tak samo jak w przypadku PUT
.
Jeśli żądanie PATCH
spowoduje nowy stan zasobu, który jest składniowo lub semantycznie nieprawidłowy, serwer zwraca kod stanu HTTP HTTP 400 Bad Request
lub 422 Unprocessable Entity
, a stan zasobu pozostaje bez zmian. Jeśli na przykład spróbujesz usunąć wymagane pole, ale nie zastąpisz go innym, serwer zwróci błąd.
Uwaga: pamiętaj, że musisz wiedzieć, jaki jest związek między poszczególnymi polami. Dodanie zasobu do stanu niespójności może być możliwe po zaktualizowaniu tylko części wspólnych ze sobą wartości. Na przykład czas rozpoczęcia może być późniejszy niż czas zakończenia. Chociaż interfejs API powinien zwracać kod błędu, zalecamy pełne przetestowanie tego rodzaju warunków, aby zapewnić spójność.
Tekst alternatywny, gdy technologia PATCH nie jest obsługiwana
Jeśli zapora sieciowa nie zezwala na PATCH
, wykonaj żądanie HTTP POST
i ustaw nagłówek zastępowania na PATCH
, jak pokazano poniżej:
POST /myfeed/1/1/ X-HTTP-Method-Override: PATCH Content-Type: application/xml ...
Użycie częściowej odpowiedzi z częściową aktualizacją
Możesz użyć odpowiedzi częściowej jako podstawy do kolejnej prośby o częściową aktualizację. Jeśli tak jest, określ parametr zapytania fields
zawierający linki do edycji, a także @gd:*
. Dzięki temu częściowa odpowiedź zawiera takie informacje jak wartości atrybutów ETag i gd:fields
, które są ważne w przypadku kolejnych żądań.
Oto przykład, który zwraca częściową odpowiedź, która może posłużyć jako podstawa do przyszłej częściowej aktualizacji:
http://example.com/myFeed/1/1/?fields=@gd:*,link[@rel='edit'](@href),gd:who
Serwer odpowiada:
<?xml version='1.0' encoding='utf-8'?> <entry xmlns='http://www.w3.org/2005/Atom' xmlns:gd='http://schemas.google.com/g/2005' gd:etag='"E0UKRAREeCp7IWA6WhJT"' gd:fields="@gd;*,link[@rel='edit'](@href),gd:who"> <link href='http://example.com/myFeed/1/1/'/> <gd:who email='liz@gmail.com'/> <gd:who email='jo@gmail.com'/> <gd:who email='jane@gmail.com'/> </entry>
Załóżmy, że chcesz usunąć użytkownika z adresem e-mail 'jane@gmail.com'
, dodać użytkownika z adresem e-mail 'will@gmail.com'
i zmienić adres e-mail użytkownika wymienionego jako 'jo@gmail.com'
na 'josy@gmail.com'
.
Aby wprowadzić te zmiany, zacznij od wyników poprzedniej odpowiedzi, zmodyfikuj tylko te pola, które zawierają zmodyfikowane fragmenty, i prześlij zmodyfikowany części treści jako treść żądania PATCH
. W tym przykładzie niezbędne modyfikacje są następujące:
- Usuń pozycję
<gd:who email='jane'/>
z listy dostępnych elementów. - Dodaj
<gd:who email='will@gmail.com'/>
do listy dostępnych elementów. - Zastąp
<gd:who email='jo@gmail.com'/>
wartością<gd:who email='josy@gmail.com'/>
.
Żądanie PATCH
oparte na oczywistej odpowiedzi częściowej jest widoczne poniżej:
PATCH /myFeed/1/1/ Content-Type: application/xml <entry gd:fields="@gd:*,link[@rel='edit'](@href),gd:who" gd:etag="FE8LQQJJeSp7IWA6WhVa"> <link href='http://example.com/myFeed/1/1'/> <gd:who email='liz@gmail.com'/> <gd:who email='josy@gmail.com'/> <gd:who email='will@gmail.com'/> </entry>
Uwaga: ta metoda zależy od atrybutów gd:fields
i gd:etag
(jeśli są obsługiwane) w częściowej odpowiedzi na wpis. Treść częściowego wpisu musi zawierać wszystkie pola i atrybuty, które znajdowały się w odpowiedzi częściowej – z wyjątkiem tych, które chcesz usunąć. Możesz zaktualizować dowolne pola w treści, dodając nowe wartości. Możesz też dodać dowolne pola, które chcesz dodać.
Uwierzytelnianie
Gdy klient próbuje uzyskać dostęp do usługi, może być konieczne podanie danych logowania użytkownika w tej usłudze, aby udowodnić, że jest uprawniony do wykonania danego działania.
Sposób, w jaki klient powinien korzystać z uwierzytelniania, zależy od jego typu:
- Aplikacja komputerowa powinna używać własnego systemu uwierzytelniania Google o nazwie Uwierzytelnianie konta dla zainstalowanych aplikacji (nazywanym też „ClientLogin”). (Klienty nie powinni używać tego systemu).
- Klient sieciowy, np. interfejs innej firmy w usłudze Google, powinien korzystać z specyficznego dla Google systemu uwierzytelniania o nazwie Account Authentication Proxy for Web-Based Applications (nazywanym też „AuthSub”).
W systemie ClientLogin klient komputerowy pyta użytkownika o dane logowania, a następnie wysyła je do systemu uwierzytelniania Google.
Jeśli uwierzytelnianie się powiedzie, system uwierzytelniania zwróci token, którego klient następnie używa (w nagłówku autoryzacji HTTP) podczas wysyłania żądań do interfejsu Data API.
Jeśli uwierzytelnianie się nie powiedzie, serwer zwróci kod stanu 403 Forbidden (Dostęp zabroniony) wraz z nagłówkiem WWW-Authenticate zawierającym wyzwanie związane z uwierzytelnianiem.
System AuthSub działa podobnie, z tą różnicą, że nie prosi użytkownika o dane logowania, tylko łączy go z usługą Google, która prosi o dane logowania. Następnie usługa zwraca token, którego może używać aplikacja internetowa. Zaletą tej metody jest to, że Google (zamiast interfejsu internetowego) w bezpieczny sposób obsługuje i przechowuje dane logowania użytkownika.
Szczegółowe informacje o tych systemach uwierzytelniania znajdziesz w artykule Omówienie uwierzytelniania przy użyciu interfejsów API danych Google lub w dokumentacji uwierzytelniania konta Google.
Stan sesji
Wiele implementacji logiki biznesowej wymaga utrzymywania sesji, aby śledzić stan sesji użytkownika.
Google śledzi stan sesji na 2 sposoby: używając plików cookie lub tokena, który można wysłać jako parametr zapytania. Oba sposoby dają ten sam efekt. Zalecamy, aby klienci obsługiwały jedną z tych metod śledzenia stanu sesji. Jeśli klient nie obsługuje żadnej z tych metod, może on nadal korzystać z interfejsów API danych, ale wydajność może być niższa niż w przypadku klientów, którzy obsługują te metody. Jeśli klient nie obsługuje tych metod, każde żądanie powoduje przekierowanie, dlatego każde żądanie (i powiązane z nim dane) jest wysyłane do serwera dwukrotnie, co ma wpływ na wydajność zarówno klienta, jak i serwera.
Biblioteki klienta Google obsługują stan sesji, więc jeśli korzystasz z naszych bibliotek, nie musisz nic robić, aby uzyskać pomoc dotyczącą stanu sesji.
Dodatkowe materiały
Oto dokumenty innych firm:
- Porównanie kanałów Atom i RSS z przeplatanymi treściami
- Omówienie Atom od IBM
- Rozszerzenia Dublin Core do RSS
- Definicje metod HTTP 1.1; specyfikacja w
GET
,POST
,PUT
iDELETE
- Definicje kodów stanu HTTP 1.1
- Jak utworzyć protokół REST
- Tworzenie usług internetowych w sposób REST
- Wprowadzenie techniczne do kodu XML
- Przestrzenie nazw XML według przykładu
- Sekcja ETag specyfikacji HTTP