Dokumentacja protokołu Google Data API

W tym dokumencie opisano protokół używany przez interfejsy API danych Google, w tym informacje o wyglądzie zapytania, wynikach i tym podobnych.

Więcej informacji o interfejsach API danych Google znajdziesz w przewodniku Google dla programistów danych oraz w przewodniku po zasadach.

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 danych Google.

Jeśli chcesz napisać kod, który używa interfejsów API klienta Google Data, nie musisz znać tych szczegółów. Zamiast tego możesz użyć bibliotek klienta dla danego języka.

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 danych Google
  • kodowania z użyciem protokołu bez użycia bibliotek klienckich danych Google.
  • 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.

Ten dokument nie wymaga konkretnego języka programowania, można wysyłać i odbierać wiadomości z danymi Google przy użyciu dowolnego języka programowania, który pozwala wysyłać żądania HTTP i analizować odpowiedzi oparte na formacie XML.

Szczegóły protokołu

Ta sekcja opisuje format dokumentu danych Google i składnię zapytań.

Format dokumentu

Dane Google, Atom i RSS 2.0 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.

Interfejsy API danych Google mogą używać formatu Atom (tylko do odczytu i zapisu) lub RSS (tylko do odczytu).

Atom to domyślny format danych Google. Aby wysłać odpowiedź w formacie RSS, użyj parametru /alt=rss/. Więcej informacji znajdziesz w artykule Zapytania.

Gdy żądasz danych w formacie RSS, dane Google udostępniają kanał (lub inną reprezentację zasobu) w formacie RSS. Jeśli dla danej usługi danych Google nie ma odpowiednika RSS, usługa Google używa danych Atom, oznaczając je odpowiednią przestrzenią nazw, aby wskazać, że jest to rozszerzenie RSS.

Uwaga: większość plików danych Google w formacie Atom używa przestrzeni nazw Atom jako domyślnej przestrzeni nazw, podając atrybut xmlns w elemencie pliku danych. Przykłady znajdziesz w sekcji z przykładami. Dlatego przykłady w tym dokumencie nie określają jednoznacznie atom: w przypadku elementów w formacie Atom.

W tabelach poniżej przedstawiono elementy Atom i RSS elementów schematu. Wszystkie dane, które nie zostały wymienione w tych tabelach, są traktowane jak zwykły kod XML i wyświetlane w obu przypadkach. O ile nie wskazano inaczej, elementy XML w danej kolumnie znajdują się w przestrzeni nazw odpowiadającej tej kolumnie. To podsumowanie korzysta ze standardowego zapisu XPath: ukośniki wskazują hierarchię elementów, a symbol @ oznacza atrybut elementu.

W poniższych tabelach wymagane są wyróżnione elementy.

Poniższa tabela przedstawia elementy pliku danych Google:

Element schematu kanału Reprezentacja Atom Prezentacja RSS
Tytuł pliku danych /feed/title /rss/channel/title
Identyfikator kanału RSS /feed/id /rss/channel/atom:id
Link do kanału HTML /feed/link[@rel="alternate"]\
[@type="text/html"]/@href
/rss/channel/link
Opis kanału /feed/subtitle /rss/channel/description
Język pliku danych /feed/@xml:lang /rss/channel/language
Prawa autorskie kanału /feed/rights /rss/channel/copyright
Autor kanału

/feed/author/name
/feed/author/email

(w niektórych przypadkach wymagane; zobacz specyfikację Atom).

/rss/channel/managingEditor
Data ostatniej aktualizacji pliku danych /feed/updated
(format RFC 3339)
/rss/channel/lastBuildDate
(format RFC 822)
Kategoria pliku danych /feed/category/@term /rss/channel/category
Schemat kategorii pliku danych /feed/category/@scheme /rss/channel/category/@domain
Generator plików danych /feed/generator
/feed/generator/@uri
/rss/channel/generator
Ikona pliku danych /feed/icon /rss/channel/image/url (chyba że logo ma też logo – w takim przypadku nie ma ikony).
Logo pliku danych /feed/logo /rss/channel/image/url

Poniższa tabela przedstawia elementy kanału z wynikami wyszukiwania danych Google. Pamiętaj, że dane Google udostępniają w kanałach wyników wyszukiwania niektóre elementy odpowiedzi OpenSearch 1.1.

Element schematu kanału wyników wyszukiwania Reprezentacja Atom Reprezentacja RSS/OpenSearch
Liczba wyników wyszukiwania /feed/openSearch:totalResults /rss/channel/openSearch:totalResults
Indeks początkowy wyniku wyszukiwania /feed/openSearch:startIndex /rss/channel/openSearch:startIndex
Liczba wyników wyszukiwania na stronie /feed/openSearch:itemsPerPage /rss/channel/openSearch:itemsPerPage

Poniższa tabela przedstawia elementy wpisu danych Google:

Element schematu wpisów Reprezentacja Atom Prezentacja RSS
Entry ID /feed/entry/id /rss/channel/item/guid
Identyfikator wersji wpisu Opcjonalnie umieszczone w edytorze URI (zobacz sekcję Równoczesna optymalizacja w tym dokumencie).
Tytuł wpisu /feed/entry/title /rss/channel/item/title
Link do wpisu /feed/entry/link /rss/channel/item/link
/rss/channel/item/enclosure
/rss/channel/item/comments
Podsumowanie wpisu

/feed/entry/summary

(w niektórych przypadkach wymagane; zobacz specyfikację Atom).

/rss/channel/item/atom:summary
Treść wpisu

/feed/entry/content

(Jeśli nie ma elementu treści, wpis musi zawierać co najmniej 1 element <link rel="alternate">).

/rss/channel/item/description
Autor wpisu

/feed/entry/author/name
/feed/entry/author/email

(w niektórych przypadkach wymagane; zobacz specyfikację Atom).

/rss/channel/item/author
Kategoria wpisu /feed/entry/category/@term /rss/channel/item/category
Schemat kategorii wpisów /feed/entry/category/@scheme /rss/channel/item/category/@domain
Data publikacji wpisu /feed/entry/published
(RFC 3339)
/rss/channel/item/pubDate
(RFC 822)
Data aktualizacji wpisu /feed/entry/updated
(RFC 3339)
/rss/channel/item/atom: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 danych 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

Usługi danych Google obsługują warunkowe HTTP GET. Ustawienie nagłówka odpowiedzi ostatniej modyfikacji na podstawie wartości elementu <atom:updated> w zwróconym pliku danych 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 danych Google zwraca odpowiedź HTTP 304 (nie zmodyfikowaną).

Usługa danych Google musi obsługiwać zapytania o kategorię i 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
q Pełny tekst zapytania
  • Podczas tworzenia zapytania wyświetl wyszukiwane hasła rozdzielone spacjami w formacie q=term1 term2 term3. (tak jak w przypadku wszystkich wartości parametrów zapytania, spacje muszą być zakodowane na potrzeby adresu URL). Usługa danych Google zwraca wszystkie wpisy pasujące do wszystkich wyszukiwanych haseł (np. AND). Podobnie jak wyszukiwarka Google, usługa danych Google wyszukuje całe słowa (i powiązane słowa z tym samym rdzeniem), a nie podłańcuchy.
  • Aby wyszukać dokładne wyrażenie, umieść je w cudzysłowie: q="exact phrase".
  • Aby wykluczyć wpisy pasujące do danego hasła, użyj formularza q=-term.
  • Wielkość znaków nie jest rozróżniana.
  • Przykład: aby znaleźć wszystkie hasła, które zawierają dokładne wyrażenie „Elizabeth Bennet” i słowo „Darcy”, ale nie zawierają słowa „Austen”, użyj tego zapytania: ?q="Elizabeth Bennet" Darcy -Austen
/-/category Filtr kategorii
  • Każdą kategorię należy podać w postaci identyfikatora URI zasobu w formacie /categoryname/ – jest to wyjątek od tradycyjnego formularza name=value.
  • Wymień wszystkie kategorie przed innymi parametrami zapytania.
  • Wyróżnij pierwszą kategorię za pomocą atrybutu /-/, aby określić, że jest to kategoria. Jeśli na przykład w kanale Jana są kategorie wpisów Fritz, możesz o to poprosić: http://www.example.com/feeds/jo/-/Fritz. Dzięki temu implementacja może odróżnić identyfikatory URI zapytania określone na podstawie kategorii od identyfikatorów URI zasobów.
  • Możesz tworzyć zapytania dotyczące wielu kategorii, podając wiele parametrów kategorii rozdzielonych ukośnikami. Usługa danych Google zwraca wszystkie wpisy pasujące do wszystkich kategorii (np. AND). Na przykład: http://www.example.com/feeds/jo/-/Fritz/Laurie zwraca wpisy pasujące do obu kategorii.
  • Aby wstawić OR między terminami, użyj znaku kreski pionowej (|) zakodowanej w adresie URL jako %7C. Na przykład: http://www.example.com/feeds/jo/-/Fritz%7CLaurie zwraca wpisy pasujące do każdej kategorii.
  • Wpis pasuje do określonej kategorii, jeśli należy do kategorii, która ma pasujące hasło lub etykietę zgodnie ze specyfikacją Atom. (Ogólnie „hasło” to wewnętrzny ciąg znaków używany przez oprogramowanie do identyfikowania kategorii, a „etykieta” to zrozumiały dla człowieka ciąg znaków wyświetlany użytkownikowi w interfejsie).
  • Aby wykluczyć wpisy pasujące do danej kategorii, użyj formularza /-categoryname/.
  • Aby wyszukać kategorię, która ma schemat, np. <category scheme="urn:google.com" term="public"/>, musisz umieścić nawiasy klamrowe przed nazwą kategorii. na przykład: /{urn:google.com}public. Jeśli schemat zawiera ukośnik (/), powinien być zakodowany jako URL w formacie %2F. Aby dopasować kategorię, która nie ma schematu, użyj pustej pary nawiasów klamrowych. Jeśli nie określisz nawiasów klamrowych, kategorie w obrębie dowolnego schematu będą pasować.
  • Te funkcje możesz połączyć. Na przykład: /A%7C-{urn:google.com}B/-C oznacza (A OR (NOT B)) AND (NOT C).
category Filtr kategorii
  • Alternatywny sposób na filtrowanie kategorii. Te 2 metody są równoważne.
  • Aby wstawić OR między terminami, użyj kreski pionowej (|) zakodowanej w adresie URL jako %7C. Na przykład: http://www.example.com/feeds?category=Fritz%7CLaurie zwraca wpisy pasujące do każdej kategorii.
  • Aby wstawić znak AND między wyszukiwanymi hasłami, użyj przecinka (,). Na przykład http://www.example.com/feeds?category=Fritz,Laurie zwraca wpisy pasujące do obu kategorii.
author Autor wpisu
  • Usługa zwraca wpisy, w przypadku których imię i nazwisko autora lub adres e-mail pasują do ciągu zapytania.
alt Alternatywny typ reprezentacji
  • Jeśli nie określisz parametru alt, usługa zwróci kanał Atom. To odpowiednik alt=atom.
  • alt=rss zwraca kanał RSS 2.0.
  • alt=json zwraca plik danych w formacie JSON. Więcej informacji
  • alt=json-in-script żąda odpowiedzi, która opakowuje JSON w tagu skryptu. Więcej informacji
updated-min, updated-max Ograniczenia w dniu aktualizacji wpisu
  • Użyj formatu sygnatury czasowej RFC 3339. na przykład: 2005-08-09T10:57:00-08:00.
  • Dolna granica jest integralna, a górna – jedyna.
published-min, published-max jest ograniczona do daty publikacji wpisu;
  • Użyj formatu sygnatury czasowej RFC 3339. na przykład: 2005-08-09T10:57:00-08:00.
  • Dolna granica jest integralna, a górna – jedyna.
start-index 1 indeks oparty na pierwszym wyniku do pobrania
  • Pamiętaj, że nie jest to ogólny mechanizm kursora. Jeśli po raz pierwszy wyślesz zapytanie z ?start-index=1&max-results=10, a potem wyślesz kolejne za pomocą ?start-index=11&max-results=10, usługa nie może zagwarantować, że wyniki będą równoważne wynikowi ?start-index=1&max-results=20, bo między zapytaniami mogły wystąpić operacje wstawienia i usunięcia.
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ł.
entryID Identyfikator konkretnego wpisu do pobrania
  • Jeśli podasz identyfikator wpisu, nie możesz podać żadnych innych parametrów.
  • Formę identyfikatora wpisu określa usługa danych Google.
  • W przeciwieństwie do większości innych parametrów zapytania identyfikator wpisu jest określany jako część identyfikatora URI, a nie jako para nazwa=wartość.
  • Przykład: http://www.example.com/feeds/jo/entry1.

Zapytania dotyczące kategorii

Postanowiliśmy określić nieco nietypowy format dla zapytań dotyczących kategorii. Zamiast zapytania:

http://example.com/jo?category=Fritz&category=2006

wykorzystujemy:

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ę kategorię, ponieważ naszym zdaniem najczęstsze zapytania są najczęściej stosowane.

Wadą tego podejścia jest to, że w zapytaniach dotyczących kategorii musisz używać nazwy /-/, aby usługi danych Google odróżniały zapytania 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 w witrynie Atom mogą zawierać również dowolne z tych elementów danych Atom i Google (oraz inne dane 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:atom="http://www.w3.org/2005/Atom"
        xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">
  <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>
    <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>
    <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 poniższej tabeli opisano różne kody stanu HTTP w kontekście usług danych Google.

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.
500 WEWNĘTRZNY BŁĄD SERWERA Błąd wewnętrzny. Jest to kod domyślny używany w przypadku wszystkich nierozpoznanych błędów.

Optymizm równoczesny (wersja)

Czasami ważne jest, aby upewnić się, że wielu klientów nie przypadkiem nie zastępuje innych zmian. Najłatwiej to zrobić, upewniając się, że bieżąca wersja wpisu, który klient zmodyfikował, jest taka sama jak wersja, którą klient wprowadza w bazie. Jeśli drugi klient przeprowadzi aktualizację, zanim zrobi to pierwszy klient, odmawia ona aktualizacji, ponieważ pierwszy klient nie opiera już swoich modyfikacji na najnowszej wersji.

W plikach danych Google, które obsługują wersje, semantykę uzyskujemy, dodając identyfikator wersji do elementu EditURI każdego wpisu. Pamiętaj, że problem dotyczy tylko identyfikatora URI, nie identyfikatora wpisu. W tym schemacie każda aktualizacja powoduje zmianę identyfikatora URI URI, dzięki czemu kolejne aktualizacje na podstawie pierwotnej wersji kończą się niepowodzeniem. Usuwanie jest oczywiście identyczne z aktualizacjami tej funkcji. Usunięcie usługi w starej wersji spowoduje jej usunięcie.

Nie wszystkie pliki danych Google obsługują optymizm równoczesny. Jeśli w kanale, który obsługuje ten format, serwer wykryje konflikt wersji w stanie PUT lub DELETE, zwróci odpowiedź 409 Conflict. Treść odpowiedzi zawiera bieżący stan wpisu (dokument wejścia Atom). Klient powinien rozwiązać konflikt i ponownie przesłać żądanie, korzystając z identyfikatora EditURI z odpowiedzi 409.

Motywacja i uwagi projektowe

Ta metoda optymalizowania na podstawie równoczesności pozwala nam wdrożyć semantykę bez konieczności dodawania nowych identyfikatorów dla wersji, dzięki czemu odpowiedzi danych Google są zgodne z punktami końcowymi Atom Google innych niż Google.

Zamiast określania identyfikatorów wersji moglibyśmy sprawdzić sygnaturę czasową aktualizacji w każdym wpisie (/atom:entry/atom:updated). Jednak istnieją 2 problemy z sygnaturą czasową aktualizacji:

  • Działa tylko w przypadku aktualizacji – nie można ich usunąć.
  • Wymusza używanie w aplikacjach wartości daty i godziny jako identyfikatorów wersji, co utrudnia modernizację danych Google do wielu istniejących baz danych.

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:

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) do wysyłania żądań danych Google.

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 danych Google lub Uwierzytelnianie 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 nadal korzystać z usług danych Google, ale skuteczność 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:

Powrót do góry