Korzystanie z cURL do interakcji z usługami Google Data

Ostrzeżenie: ta strona dotyczy starszych interfejsów API Google, czyli interfejsów Google Data API. Jest ona istotna tylko w przypadku interfejsów API wymienionych w katalogu interfejsów Google Data API, z których wiele zostało zastąpionych nowszymi interfejsami API. Informacje o konkretnym nowym interfejsie API znajdziesz w jego dokumentacji. Informacje o autoryzowaniu żądań za pomocą nowszego interfejsu API znajdziesz w artykule Uwierzytelnianie i autoryzacja kont Google.

Ryan Boyd, zespół interfejsów API Google Data
Wrzesień 2007 r.

Wprowadzenie

Interfejsy Google Data API wykorzystują przede wszystkim pliki i wpisy Atom (XML) jako format danych oraz HTTP jako protokół transmisji danych, rozszerzając protokół publikowania Atom. Udostępniamy wiele bibliotek klienta, aby ułatwić korzystanie z interfejsów Google Data API. Zawsze możesz jednak korzystać z narzędzi niższego poziomu, aby pracować z naszymi usługami. Z odpowiednimi wskazówkami jest to dość proste.

cURL to aplikacja wiersza poleceń do wykonywania żądań za pomocą różnych protokołów, w tym HTTP. Programiści często używają cURL do testowania usług Google Data, ponieważ obsługuje on funkcje HTTP wymagane do interakcji z interfejsami API na niskim poziomie.

cURL obsługuje tylko komunikację HTTP, więc aby korzystać z tej aplikacji, musisz znać protokół danych Google, protokół specyficzny dla usługi i używany format danych XML. W tym artykule znajdziesz też inne narzędzia, które ułatwią Ci te zadania.

W tym artykule używamy przykładów opartych na interfejsie Picasa Web Albums Data API. Wszystkie te przykłady można jednak łatwo zastosować do innych interfejsów Google Data API.

Pobieranie i instalowanie cURL

cURL jest zwykle dostępny w domyślnej instalacji wielu platform UNIX/Linux. Wpisz curl w ulubionej powłoce, aby sprawdzić, czy narzędzie jest zainstalowane i znajduje się w PATH. Jeśli nie masz zainstalowanego tego narzędzia, wejdź na stronę pobieraniawitrynie cURL, aby uzyskać oficjalne źródło lub pakiet binarny udostępniony przez użytkownika. Narzędzie wiersza poleceń korzysta z biblioteki libcurl, która może być oferowana jako osobny pakiet do pobrania. Jeśli nie kompilujesz z kodu źródłowego, pobierz pakiet „binarny” zamiast pakietu „libcurl”. Pakiety z obsługą SSL są wymagane, jeśli chcesz używać cURL do uzyskiwania tokenów uwierzytelniających lub uzyskiwać dostęp do niektórych usług Google Data, które wymagają używania SSL w przypadku żądań.

Uwierzytelnianie w usłudze danych Google

Uwierzytelnione żądania danych Google są wykonywane przez dodanie do żądania nagłówka HTTP, który zawiera token uwierzytelniania ClientLogin (aplikacje na komputery i urządzenia mobilne) lub AuthSub (aplikacje internetowe). Do testowania za pomocą cURL łatwiejsza jest metoda ClientLogin, która została opisana poniżej. Nagłówki uwierzytelniania AuthSub można było używać z cURL, ale bardziej zaawansowany proces uzyskiwania tokenów wykracza poza zakres tego artykułu.

Korzystanie z uwierzytelniania ClientLogin

ClientLogin jest przeznaczony dla zainstalowanych aplikacji (na komputery i urządzenia mobilne). W przypadku tej metody uwierzytelniania aplikacja korzystająca z interfejsów Google Data API bezpośrednio obsługuje nazwę użytkownika i hasło.

Żądanie uwierzytelnienia w przypadku ClientLogin przyjmuje nazwę użytkownika, hasło i nazwę usługi jako zmienne POST formularza. Zmienne te są przekazywane odpowiednio jako argumenty Email, Passwdservice. W odpowiedzi na to żądanie otrzymasz kilka tokenów, z których jeden możesz wykorzystać do wysyłania żądań do usługi Google Data. Pamiętaj, że argumenty danych przekazywane za pomocą parametru curl muszą być zakodowane w formacie URL, jeśli zawierają znaki inne niż ASCII, które często występują w argumentach EmailPasswd. Możesz poprosić o zakodowanie tych argumentów w formacie URL, używając flagi --data-urlencode.curl

Przykładowe żądanie:

curl https://www.google.com/accounts/ClientLogin \
--data-urlencode Email=brad.gushue@example.com --data-urlencode Passwd=new+foundland \
-d accountType=GOOGLE \
-d source=Google-cURL-Example \
-d service=lh2

Przykładowa odpowiedź:

SID=DQAAAHYBADCv2pSv7nflacDNwz3zEDUGtrSvNVDcpkSfddi77b3U5sEaHmP8YLWhmA36F9rk85mL8J5dqo4apn0T1vKz0fPGI9Xtnuet6cuE2ZzYvrNIwbSC_HjTqF4zudNQnnlDuD2wqZT-g1qXI8KhGAQZV4NexHZoQPlabTsGuRZeIBxj1A
LSID=EUBBBIaBADCl-kNxvRVmcQghpt3cqSMfEooKR9flLOUZqwgP9OrZS83gse-KSdTNeXhxsET7FYenDhceP9lIPOmesH-t9qh-AWUHjjMdZEbUNeF9mWyzln6Z-FajaiG-cVFkqW0ZJ8ZbnCP30xXj6xFK6QxaAcqy_9Pej8jhEnxS9E61ftQGPg
Auth=EUBBIacAAADK-kNxvRVmcQghpt3cqSMfEooLNMflLNIQqwgP9OrZS83gs-KSdTNeXhxsET7FYePWmaD8Vsy1V4LSUGMUP48Je2TO8OcjBj6HgAtPhiZeX-gKDfagZDK44j4n-Tkb44nhOnp2_QPSnBj3Z2vYwOEDjjG3Q53aQVC2132JKOuGh

Szczegółowe informacje o parametrach użytych w powyższym żądaniu znajdziesz w dokumentacji ClientLogin. W tym przykładzie używamy interfejsu Picasa Web Albums Data API. Nazwa usługi (service) to lh2. Nazwy usług innych usług danych Google znajdziesz na stronie Najczęstsze pytania dotyczące interfejsów API danych Google.

Wartość tokena Auth w odpowiedzi powyżej jest jedyną wartością potrzebną do uwierzytelniania w usługach danych Google. Wartość tego tokena jest tworzona w nagłówku HTTP, który jest następnie używany w każdym żądaniu do usługi danych Google.

curl --silent --header "Authorization: GoogleLogin auth=EUBBIacAAADK\
-kNxvRVmcQghpt3cqSMfEooLNMflLNIQqwgP9OrZS83gs-KSdTNeXhxs\
ET7FYePWmaD8Vsy1V4LSUGMUP48Je2TO8OcjBj6HgAtPhiZeX-gKDfag\
ZDK44j4n-Tkb44nhOnp2_QPSnBj3Z2vYwOEDjjG3Q53aQVC2132JKOuGh" \
"http://picasaweb.google.com/data/feed/api/user/default"

Uwaga: powyższa metoda ucieczki znaków nowego wiersza za pomocą ukośników odwrotnych („\”) nie działa w powłoce poleceń systemu Windows, więc jeśli używasz curl w systemie Windows, musisz wpisać całe polecenie w jednym wierszu.


Pobieranie plików danych i wpisów

W interfejsach Google Data API pobieranie plików danych i wpisów odbywa się przez wykonanie żądania HTTP GET na adresie URL z opcjonalnym zestawem parametrów zapytania. Ponieważ wykonujemy żądanie GET, do curl musimy przekazać tylko nagłówek uwierzytelniania i adres URL. W przykładzie poniżej nadal używany jest interfejs Picasa Web Albums Data API, który służy do pobierania listy albumów należących do uwierzytelnionego użytkownika. Pamiętaj, że w tym przykładzie skracamy token autoryzacji do ABCDEFG, ale zamiast niego należy użyć pełnego tokena (np. EUBBIacA...32JKOuGh z przykładu powyżej).

curl --silent --header "Authorization: GoogleLogin auth=ABCDEFG" "http://picasaweb.google.com/data/feed/api/user/default"

Spowoduje to zwrócenie niesformatowanego bloku XML:

<?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:geo='http://www.w3.org/2003/01/geo/wgs84_pos#' xmlns:gml='http://www.opengis.net/gml' xmlns:georss='http://www.georss.org/georss' xmlns:photo='http://www.pheed.com/pheed/' xmlns:media='http://search.yahoo.com/mrss/' xmlns:batch='http://schemas.google.com/gdata/batch' xmlns:gphoto='http://schemas.google.com/photos/2007'><id>http://picasaweb.google.com/data/feed/base/user/brad.gushue</id><updated>2007-09-13T21:30:21.454Z</updated>...</entry></feed>

Istnieją przydatne narzędzia do formatowania tych danych wyjściowych, aby były bardziej czytelne dla człowieka, np. tidy. Najłatwiejszym sposobem użycia narzędzia tidy jest przekierowanie do niego danych wyjściowych polecenia curl, jak w tym przykładzie:

curl --silent --header "Authorization: GoogleLogin auth=ABCDEFG" "http://picasaweb.google.com/data/feed/api/user/default" | tidy -xml -indent -quiet

Dzięki temu plik danych jest znacznie bardziej czytelny, np. tak:

<?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:geo='http://www.w3.org/2003/01/geo/wgs84_pos#' 
xmlns:gml='http://www.opengis.net/gml' 
xmlns:georss='http://www.georss.org/georss' 
xmlns:photo='http://www.pheed.com/pheed/' 
xmlns:media='http://search.yahoo.com/mrss/' 
xmlns:batch='http://schemas.google.com/gdata/batch' 
xmlns:gphoto='http://schemas.google.com/photos/2007'>
  <id>http://picasaweb.google.com/data/feed/api/user/brad.gushue</id>
  <updated>2007-09-13T21:47:07.337Z</updated>
  <category scheme='http://schemas.google.com/g/2005#kind'
  term='http://schemas.google.com/photos/2007#user' />
  <title type='text'>brad.gushue</title>
  <subtitle type='text'></subtitle>
  <icon>
  http://lh6.google.com/brad.gushue/AAAAj9zigp4/AAAAAAAAAAA/RiMAlXV4MFI/s64-c/brad.gushue</icon>
  <link rel='http://schemas.google.com/g/2005#feed'
  type='application/atom+xml'
  href='http://picasaweb.google.com/data/feed/api/user/brad.gushue' />
  <link rel='alternate' type='text/html'
  href='http://picasaweb.google.com/brad.gushue' />
  <link rel='self' type='application/atom+xml'
  href='http://picasaweb.google.com/data/feed/api/user/brad.gushue?start-index=1&max-results=1000' />
  <author>
    <name>Brad</name>
    <uri>http://picasaweb.google.com/brad.gushue</uri>
  </author>
  <generator version='1.00' uri='http://picasaweb.google.com/'>
  Picasaweb</generator>
  <openSearch:totalResults>8</openSearch:totalResults>
  <openSearch:startIndex>1</openSearch:startIndex>
  <openSearch:itemsPerPage>1000</openSearch:itemsPerPage>
  <gphoto:user>brad.gushue</gphoto:user>
  <gphoto:nickname>Brad</gphoto:nickname>
  <gphoto:thumbnail>
  http://lh6.google.com/brad.gushue/AAAAj9zigp4/AAAAAAAAAAA/RiMAlXV4MFI/s64-c/brad.gushue</gphoto:thumbnail>
  <entry>
    <id>
    http://picasaweb.google.com/data/entry/api/user/brad.gushue/albumid/9810315389720904593</id>
    <published>2007-05-23T04:55:52.000Z</published>
    <updated>2007-05-23T04:55:52.000Z</updated>
    <category scheme='http://schemas.google.com/g/2005#kind'
    term='http://schemas.google.com/photos/2007#album' />
    <title type='text'>Trip To Italy</title>
    <summary type='text'>This was the recent trip I took to
    Italy.</summary>
    <rights type='text'>public</rights>
    <link rel='http://schemas.google.com/g/2005#feed'
    type='application/atom+xml'
    href='http://picasaweb.google.com/data/feed/api/user/brad.gushue/albumid/9810315389720904593' />
    <link rel='alternate' type='text/html'
    href='http://picasaweb.google.com/brad.gushue/TripToItalyV2' />
    <link rel='self' type='application/atom+xml'
    href='http://picasaweb.google.com/data/entry/api/user/brad.gushue/albumid/9810315389720904593' />
    <link rel='edit' type='application/atom+xml'
    href='http://picasaweb.google.com/data/entry/api/user/brad.gushue/albumid/9810315389720904593/123456' />
    <author>
      <name>Brad</name>
      <uri>http://picasaweb.google.com/brad.gushue</uri>
    </author>
    <gphoto:id>9810315389720904593</gphoto:id>
    <media:group>
    ...
    </media:group>
  </entry>
  <entry>
  ...
  </entry>

</feed>

Poszczególne wpisy można pobrać w ten sam sposób, podając adres URL wpisu, a nie adres URL pliku danych.

Aktualizowanie wpisów

Wpisy w interfejsach Google Data API są aktualizowane przez wysłanie żądania HTTP PUT na adres URL edycji z nową kopią kodu XML wpisu w treści żądania.

  1. Pobierz wpis, używając wartości adresu URL atom:link/@rel='self'.
  2. Zaktualizuj wpis lokalnie, aby wprowadzić potrzebne zmiany.
  3. PUT z powrotem na serwer, używając wartości adresu URL atom:link/@rel='edit'.

1. Pobieranie wpisu

Wpis można pobrać za pomocą jednego z 2 adresów URL wyróżnionych w bloku pliku danych powyżej. Wymagany adres URL to wartość href elementu link z atrybutem rel='self'.

curl --silent --header "Authorization: GoogleLogin auth=ABCDEFG" "http://picasaweb.google.com/data/entry/api/user/brad.gushue/albumid/9810315389720904593"

2. Aktualizowanie wpisu lokalnie

Po pobraniu wpisu należy go zaktualizować za pomocą lokalnego edytora tekstu lub aplikacji, aby wprowadzić niezbędne zmiany. W powyższym poleceniu służącym do pobierania wpisu nie przekierowaliśmy wyników do tidy, jak to robiliśmy w poprzednich przykładach. Wynikiem jest plik XML zawierający te same dane, ale w innym formacie niż wersja przekazana do tidy. W przypadku ręcznej edycji wpisu użycie znaku tidy może ułatwić pracę z kodem XML.

Uwaga: pamiętaj, aby podczas publikowania nowego wpisu uwzględnić wszystkie definicje przestrzeni nazw XML, które są używane jako atrybuty elementu atom:entry. Ich pominięcie spowoduje wyjątki podczas analizowania. tidy zastąpi też spacje między definicjami przestrzeni nazw znakami nowego wiersza. Jest to prawidłowy kod XML, ale usługi danych Google nie akceptują go obecnie. Jeśli używasz tidy, pamiętaj, aby dodać dodatkowe spacje między tymi atrybutami w elemencie entry.

3. Aktualizowanie wpisu na serwerze

Korzystając z edit adresu URL, musisz PUT kopię wpisu do usługi za pomocą cURL. Należy dodać nagłówek wskazujący typ treści wysyłanych na serwer. W tym fragmencie kodu założono, że plik ze zaktualizowanym wpisem jest zapisany w pliku updated_entry.xml.

curl --silent --data-binary "@updated_entry.xml" --request PUT --header "Content-Type: application/atom+xml" --header "Authorization: GoogleLogin auth=ABCDEFG" "http://picasaweb.google.com/data/entry/api/user/brad.gushue/albumid/9810315389720904593/123456"

Tworzenie wpisów

Wpisy w interfejsach Google Data API są tworzone przez wysłanie żądania HTTP POST do adresu URL posta z nowym wpisem. Symbol atom:id jest przypisywany przez serwer, więc nie musisz go uwzględniać w nowych wpisach. Najprostszym sposobem utworzenia nowego wpisu jest zmodyfikowanie starego. Poniższy przykład pokazuje, jak to zrobić.

  1. Pobieranie wpisu szablonu za pomocą funkcji atom:link/@rel='self'
  2. Zmodyfikuj lokalnie wpis szablonu, aby usunąć niepotrzebne informacje i wprowadzić potrzebne zmiany.
  3. POST wpis z powrotem na serwer, używając adresu URL post kanału. Znajduje się on w pobranym pliku danych jako wartość href elementu link z atrybutem rel='http://schemas.google.com/g/2005#post' lub w dokumentacji usługi na stronie http://code.google.com.

1. Pobieranie wpisu szablonu

Pojedynczy wpis można pobrać za pomocą wartości href elementu link z atrybutem rel='self' w taki sam sposób, jak pobrano wpis przed jego zaktualizowaniem w powyższym przykładzie.

curl --silent --header "Authorization: GoogleLogin auth=ABCDEFG" "http://picasaweb.google.com/data/entry/api/user/brad.gushue/albumid/9810315389720904593" | tidy -xml -indent -quiet > template_entry.xml

Po użyciu tidy odpowiedź będzie wyglądać mniej więcej tak:

<entry xmlns='http://www.w3.org/2005/Atom' 
xmlns:exif='http://schemas.google.com/photos/exif/2007'
xmlns:geo='http://www.w3.org/2003/01/geo/wgs84_pos#'
xmlns:gml='http://www.opengis.net/gml'
xmlns:georss='http://www.georss.org/georss'
xmlns:photo='http://www.pheed.com/pheed/'
xmlns:media='http://search.yahoo.com/mrss/'
xmlns:batch='http://schemas.google.com/gdata/batch'
xmlns:gphoto='http://schemas.google.com/photos/2007'>
  <id>
  http://picasaweb.google.com/data/entry/api/user/brad.gushue/albumid/9810315389741123981</id>
  <published>2007-05-23T04:55:52.000Z</published>
  <updated>2007-05-23T04:55:52.000Z</updated>
  <category scheme='http://schemas.google.com/g/2005#kind'
  term='http://schemas.google.com/photos/2007#album' />
  <title type='text'>Trip To Italy</title>
  <summary type='text'>This was the recent trip I took to
  Italy.</summary>
  <rights type='text'>public</rights>
  <link rel='http://schemas.google.com/g/2005#feed'
  type='application/atom+xml'
  href='http://picasaweb.google.com/data/feed/api/user/brad.gushue/albumid/9810315389741123981' />
  <link rel='alternate' type='text/html'
  href='http://picasaweb.google.com/brad.gushue/TripToItaly' />
  <link rel='self' type='application/atom+xml'
  href='http://picasaweb.google.com/data/entry/api/user/brad.gushue/albumid/9810315389741123981' />
  <link rel='edit' type='application/atom+xml'
  href='http://picasaweb.google.com/data/entry/api/user/brad.gushue/albumid/9810315389741123981/1179896152905401' />
  <author>
    <name>Brad</name>
    <uri>http://picasaweb.google.com/brad.gushue</uri>
  </author>
  <gphoto:id>9810315389741123981</gphoto:id>
  <gphoto:name>TripToItaly</gphoto:name>
  <gphoto:location></gphoto:location>
  <gphoto:access>public</gphoto:access>
  <gphoto:timestamp>1179896152000</gphoto:timestamp>
  <gphoto:numphotos>0</gphoto:numphotos>
  <gphoto:numphotosremaining>500</gphoto:numphotosremaining>
  <gphoto:bytesUsed>0</gphoto:bytesUsed>
  <gphoto:user>brad.gushue</gphoto:user>
  <gphoto:nickname>Brad</gphoto:nickname>
  <gphoto:commentingEnabled>true</gphoto:commentingEnabled>
  <gphoto:commentCount>0</gphoto:commentCount>
  <media:group>
    <media:title type='plain'>Trip To Italy</media:title>
    <media:description type='plain'>This was the recent trip I took
    to Italy.</media:description>
    <media:keywords></media:keywords>
    <media:content url='http://lh5.google.com/brad.gushue/ADFUFKqeA5E/AAAAAAAAABc/V6Sga_Z03WU/TripToItaly.jpg'
    type='image/jpeg' medium='image' />
    <media:thumbnail url='http://lh5.google.com/brad.gushue/ADFUFKqeA5E/AAAAAAAAABc/V6Sga_Z03WU/s160-c/TripToItaly.jpg'
    height='160' width='160' />
    <media:credit>Brad</media:credit>
  </media:group>

</entry>

2. Zmiana wpisu szablonu

Chcemy utworzyć album o nazwie „Curling in Canada” ze zdjęciami z ostatniego meczu curlingu. Dane Google umożliwiają pomijanie elementów Atom, dla których serwer dostarcza wartości. Aby utworzyć ten prosty wpis szablonu, usuń elementy atom:id, atom:published, atom:updated, atom:author i różne elementy atom:link w pliku danych. Spowoduje to wyświetlenie uproszczonego wpisu szablonu. Następnie należy zmodyfikować wpis, aby odzwierciedlał nowy album, który tworzymy:

<entry xmlns='http://www.w3.org/2005/Atom' 
xmlns:gphoto='http://schemas.google.com/photos/2007'>
  <category scheme='http://schemas.google.com/g/2005#kind'
  term='http://schemas.google.com/photos/2007#album' />
  <title type='text'>Curling in Canada</title>
  <summary type='text'>Pictures of all my curling matches in Canada.</summary>
  <gphoto:location>Canada</gphoto:location>
  <gphoto:access>public</gphoto:access>
  <gphoto:commentingEnabled>true</gphoto:commentingEnabled>

</entry>

Uwaga: pamiętaj, aby podczas publikowania nowego wpisu uwzględnić wszystkie definicje przestrzeni nazw XML, które są używane jako atrybuty elementu atom:entry. Ich pominięcie spowoduje wyjątki podczas analizowania. tidy zastąpi też spacje między definicjami przestrzeni nazw znakami nowego wiersza. Jest to prawidłowy kod XML, ale usługi danych Google nie akceptują go obecnie. Jeśli używasz tidy, pamiętaj, aby dodać dodatkowe spacje między tymi atrybutami w elemencie entry.

3. publikowanie nowego wpisu na serwerze;

Polecenie curl do publikowania nowego wpisu na serwerze jest bardzo podobne do aktualizowania istniejącego wpisu, z tym że adres URL jest inny:

curl --silent --request POST --data-binary "@template_entry.xml" --header "Content-Type: application/atom+xml" --header "Authorization: GoogleLogin auth=ABCDEFG" "http://picasaweb.google.com/data/feed/api/user/brad.gushue" | tidy -xml -indent -quiet

Jeśli post się powiedzie, wynikowy plik XML będzie kopią nowo utworzonego wpisu. Ten wpis będzie zawierać elementy wygenerowane przez serwer w momencie jego utworzenia, w tym wartości elementów atom:id, atom:published, atom:updatedatom:link. Uzyskane wartości link można wykorzystać do edytowania lub usuwania wpisu, pod warunkiem że w międzyczasie nie zostaną wprowadzone żadne dodatkowe zmiany.

Usuwanie wpisów

Usuwanie wpisów jest bardzo podobne do ich aktualizowania, z tym że zamiast metody HTTP PUT używana jest metoda HTTP DELETE i nie trzeba przesyłać żadnych danych. Podobnie jak w przypadku żądania aktualizacji, adres URL edit jest używany jako cel żądania HTTP.

curl --silent --request DELETE --header "Authorization: GoogleLogin auth=ABCDEFG" "http://picasaweb.google.com/data/entry/api/user/brad.gushue/albumid/9810315389720904593/123456"

Przesyłanie obiektów multimedialnych

Ważną funkcją interfejsu Picasa Web Albums Data API i interfejsu Documents List Data API jest możliwość przesyłania obiektów binarnych. cURL może łatwo przesyłać dane binarne i nagłówek slug. Interfejs Documents List Data API wymaga jednak obecnie przesyłania kodu XML wraz z danymi binarnymi w postaci wiadomości MIME multipart. Tworzenie wiadomości wieloczęściowej wykracza poza zakres tego artykułu.

Poniższy przykład pokazuje, jak przesłać zdjęcie o nazwie sweeping_the_rock.png do albumu internetowego Picasa o nazwie „Sweeping the rock”:

curl --silent --request POST --data-binary "@sweeping_the_rock.png" --header "Slug: Sweeping the rock" --header "Content-Type: image/png" --header "Authorization: GoogleLogin auth=ABCDEFG" "http://picasaweb.google.com/data/feed/api/user/brad.gushue/albumid/5113621341847124417" | tidy -xml -indent -quiet

Inne narzędzia wiersza poleceń

Niektórzy deweloperzy wolą uczyć się lub debugować za pomocą innych narzędzi wiersza poleceń.

Popularne narzędzia to:

  • telnet i openssl służą do nawiązywania połączeń z surowymi gniazdami (odpowiednio w postaci zwykłego tekstu i opartego na SSL) z serwerami internetowymi i mogą być używane do interakcji z usługami Google Data. Pamiętaj, że nie wszystkie usługi Google Data mogą obsługiwać SSL. Aby otworzyć połączenia:
    • telnet picasaweb.google.com 80 (interfejs Picasa Web Albums Data API)
    • openssl s_client -connect www.google.com:443 (Google Calendar Data API i inne usługi na www.google.com)
    Po nawiązaniu połączenia należy wysłać nieprzetworzone żądanie HTTP. To żądanie zawiera czasownik HTTP, ścieżkę względną, wersję, wszystkie nagłówki i treść żądania. Oto przykład:
    POST /data/feed/api/user/brad.gushue HTTP/1.1
    Host: picasaweb.google.com
    Authorization: GoogleLogin auth=ABCDEFG
    Content-Length: 493
    
    <entry xmlns='http://www.w3.org/2005/Atom' 
    xmlns:gphoto='http://schemas.google.com/photos/2007'>
      <category scheme='http://schemas.google.com/g/2005#kind'
      term='http://schemas.google.com/photos/2007#album' />
      <title type='text'>Curling in Canada</title>
      <summary type='text'>Pictures of all my curling matches in Canada.</summary>
      <gphoto:location>Canada</gphoto:location>
      <gphoto:access>public</gphoto:access>
      <gphoto:commentingEnabled>true</gphoto:commentingEnabled>
    
    </entry>
    
    Podczas wysyłania nieprzetworzonych danych HTTP pamiętaj, że operacje POSTPUT będą wymagać obliczenia wartości nagłówka Content-Length. Do obliczenia tej wartości możesz użyć narzędzia UNIX wc. Umieść całą zawartość treści HTTP w pliku tekstowym, np. template_entry.xml (przykład użyty powyżej), i uruchom polecenie wc -c template_entry.xml. Jeśli przypadkowo użyjesz nieprawidłowej wartości w nagłówku Content-Length, debugowanie może być trudne.
  • Polecenie wget jest zwykle używane do pobierania danych z serwera internetowego do pliku lokalnego. wget ma jednak wiele opcji, które umożliwiają wykonywanie wszystkich typów żądań potrzebnych do interakcji z usługami danych Google. Oto przykład użycia wget do POST nowego wpisu albumu w Picasa Web Albums:
    wget --post-file template_entry.xml --header "Authorization: GoogleLogin auth=ABCDEFG" --header "Content-Type: application/atom+xml" "http://picasaweb.google.com/data/feed/api/user/brad.gushue"
    
  • xsltproc to narzędzie do stosowania przekształceń XSL (XSLT) do dokumentów XML. Można go używać do łatwego wyodrębniania z wpisu lub pliku XML zwracanego przez interfejsy Google Data API wybranych fragmentów danych albo do generowania nowych lub zaktualizowanych wpisów.

Podsumowanie

Jak widać, cURL i kilka innych narzędzi wiersza poleceń umożliwia łatwą interakcję z usługami danych Google przy użyciu nieprzetworzonego kodu XML i protokołu HTTP. Jeśli masz pytania dotyczące korzystania z tych narzędzi z ulubionym interfejsem Google Data API, odwiedź fora poświęcone poszczególnym interfejsom API.