Google Data API
Google postanowił zawojować rynek za pomocą aplikacji codziennego użytku. Kolejne propozycje programów użytkowych Google'a przerastają najśmielsze oczekiwania użytkowników.
Sam Google swojego czasu postawił na integracje swoich usług, już dziś istnieje możliwość otwierania za pomocą Google Mail dokumentów (Google Documents), oraz zarządzania listą kontaktów z Google Contacts. Jednak to co najbardziej zdziwiło użytkowników usług firmy z Santa Clara to to, że został upubliczniony protokół GData który pozwala na integracje naszych aplikacji "Googlowych" z innymi aplikacjami przy zastosowaniu protokołu HTTP. Idea samej komunikacji opiera się na dwóch rozwiązaniach: RSS oraz ATOM, które w spójny sposób dostarczają nam dostępu do danych. Logiczne jest więc, że z samego GData może korzystać każdy język programowania wspierający HTTP, w tym między innymi Java, dla której zostały udostępnione biblioteki Java Client Library for Google Data API. Zbiór klas dedykowany Javie ma także swoje odpowiedniki dla języków, takich jak .Net, Php, Python, Objective-C czy JavaScript, w których jest jednakowo dobrze wspierany. Sama biblioteka do Javy jest dostarczana w postaci modularnej która bazuje na 2 podstawowych elementach : GData Core oraz GData Client, a także paczkach przypisanych do każdej usługi (pełne źródła możemy pobrać z http://code.google.com/p/gdata-java-client/downloads/list ).
Na chwile obecną integracja została zapewniona z aplikacjami takimi jak:
- Google Apps
- Google Base
- Blogger
- Google Calendar
- Code Search
- Google Contacts
- Google Documents
- Google Notebook
- Google SpreadSheets
- Picasa Web Albums
- YouTube
- Webmaster Tools
- Google Health
- Google Finance Portfolio
- Google Book Search
Piękno zapytań
Jak wcześniej wspomniałem, działanie samego protokołu GData Api jest oparte o komunikacje HTTP, co wymusza odwoływanie się do zasobów przez odpowiednie adresy URL.
Dobrym przykładem na początek jest zapytanie skierowane do serwisu
Picasa:
http://picasaweb.google.com/data/feed/projection/path?kind=kind&access=visibility
w którym możemy wyróżnić cześć stałą:
http://picasaweb.google.com/data/feed/
oraz parametry, które są ustalane zgodnie z zasadą /nazwa_paramteru/wartosc.
W przykładowym zapytaniu możemy wyróżnić takie atrybuty jak:
- projection (base lub api) – format otrzymywanej odpowiedzi.
- Base – zgodny ze standardem Atom bez informacji specyficznych dla serwisu.
- API – odpowiedz w formacie GData zawierająca dodatkowe informacje
- path - zdefiniowane źródło pobierania danych
- kind – rodzaj zwracanej informacji (photo/album/comment)
- access – rodzaj dostępności zasobu (public,private,all)
Uzupełniając poprawnie parametry otrzymujemy przykładowo:
http://picasaweb.google.com/data/feed/base/user/lodzjugexample?kind=album&access=public
Jako ciekawostkę możemy stworzyć zapytanie do przeszukiwania wszystkich zasobów Picasy:
http://picasaweb.google.com/data/feed/base/all?q=Java%20User&max-results=100
Niestety w obecnej chwili nie ma jednakowego standardu dla wszystkich aplikacji, jednak same biblioteki pozwalają na dynamiczne tworzenie zapytań.
Zapytania do przykładowych aplikacji Google
Google Calendar – www.google.com/calendar/feeds/userId/visibility/full
Blogger – www.blogger.com/feeds/userId/blogs
Code Search – www.google.com/codesearch/feeds/search?q=query
Contacts – www.google.com/m8/feeds/contacts/userId/projection
Google Documents – www.docs.google.com/feeds/documents/visibility/projection
Google Notebook – www.google.com/notebook/feeds/userId/
YouTube – www.gdata.youtube.com/feeds/projection/video/field
Picasa Web Albums – www.picasaweb.google.com/data/feed/projection/path
Java Client Library for GData
Wracając z szarej krainy HTTP do naszej ulubionej Javy, powoli
okazuje się, że sam protokół nie jest taki straszny bo Google, zapewnia
nam bogate API do zarządzania usługami. Opakowywanie rozwiązania dla
klas Javy sprawiło, że tworzenie zapytań stało się banalnie proste,
przez zastosowanie klasy Query
, a zmian dokonujemy już na
obiektach.
Oto przykład potwierdzający powyższą tezę:
URL feedUrl = new URL("http://picasaweb.google.com/data/feed/api/user/username?kind=album"); PicasawebService myService = new PicasawebService(“Example1”); UserFeed myUserFeed = myService.getFeed(feedUrl, UserFeed.class); for (AlbumEntry myAlbum : myUserFeed.getAlbumEntries()) { System.out.println(myAlbum.getTitle().getPlainText()); }
Aplikacja sprowadza się do pętli, która pobiera nazwy albumów i je
wyświetla. Cała obsługa usługi odbywa się przez klasę PicasawebService
,
która jest rozszerzoną wersją GoogleService.
Pytania jakie odnośnie powyższego przykładu mogą paść to:
1. Dlaczego podajemy Example1 w konstruktorze klasy PicasawebService?
2. Dlaczego odwołujemy się do użytkownika, jeżeli chcemy pobrać albumy?
Odpowiedz na pierwsze pytanie może wydać się z początku dziwna, ale
Google chce aby podawać nazwę aplikacji, która używa protokołu w celach
identyfikacyjnych, czyli zapewne są to dane indeksowane. Druga kwestia
wynika z budowy samej biblioteki, gdyż obiekt do którego się odwołujemy
zawiera informacje o sobie samym i elementach bezpośrednio mu podrzędnych
czyli np. UserFeed
zawiera informacje o użytkowniku i albumach
natomiast AlbumFeed
o albumie, oraz należących do niego
zdjęciach.
Wchodząc coraz głębiej w przykłady, dochodzimy do modyfikacji danych w naszych aplikacjach i wtedy dopiero możemy zobaczyć prawdziwą funkcjonalność samego protokołu oraz biblioteki, co obrazuje poniższy listing.
URL feedUrl = new URL("http://picasaweb.google.com/data/feed/api/user/username?kind=album"); PicasawebService myService = new PicasawebService(“Example2”); AlbumEntry myAlbum = new AlbumEntry(); myAlbum.setTitle(new PlainTextConstruct("Java Express")); myAlbum.setDescription(new PlainTextConstruct("Photos to new edition")); AlbumEntry insertedEntry = myService.insert(postUrl, myAlbum); // uaktualnianie albumów myAlbum.setDescription(new PlainTextConstruct("Updated album description")); myAlbum.update(); //kasowanie albumów myAlbum.delete();
Analizując powyższy listing możemy zauważyć, że nigdzie nie ma linijki odpowiadającej za samą autoryzacje do aplikacji, a wynika to z tego, że jeżeli jesteśmy zalogowani w przeglądarce do aplikacji a GData Api bazuje na HTTP, to odpowiedź na to pytanie staje się prosta. Nie mniej jednak dostarczone klasy same w sobie dostarczają mechanizm autoryzacji przy użyciu jawnej deklaracji loginu i hasła lub krążącego tokenu (zastosowanie w aplikacjach JEE).
CalendarService myService = new CalendarService("exampleCo-exampleApp-1"); myService.setUserCredentials("lodzjugexample@gmail.com", "mypassword"); URL feedUrl = new URL("http://www.google.com/calendar/feeds/default/allcalendars/full"); //owncalendars albo allcalendars CalendarFeed resultFeed = myService.getFeed(feedUrl, CalendarFeed.class); System.out.println("Your calendars:"); System.out.println(); for (int i = 0; i < resultFeed.getEntries().size(); i++) { CalendarEntry entry = resultFeed.getEntries().get(i); System.out.println(" " + entry.getTitle().getPlainText()); }
W powyższym listingu możemy zauważyć, że autoryzacja odbywa się już poprzez funkcje setUserCredentials, a nie przez sesję zachowaną w samej przeglądarce. Kwestie samych praw dostępu i metody, jaką należy wybrać są szeroko poruszane w dokumentacji ( http://code.google.com/apis/gdata/articles/java_client_lib.html). Jeżeli chodzi o większą ilość przykładów, to można je będzie znaleźć na stronie dWorld, a dodatkowo dla każdej aplikacji na http://code.google.com/apis/gdata/articles/java_client_lib.html#samples.
Dalsze kroki?
Myślę, że z powodu ograniczonej długości artykułu oraz przykładów, które mogę zamieścić, poniżej nie pozostaje mi nic innego niż zamieszczenie linków do strony, które mogą pomóc w zgłębianiu GData API i jego implementacji w Javie.
Wtyczka do eclipse wspierająca Google Data API
http://googledataapis.blogspot.com/2008/07/google-data-apis-java-client-eclipse.htmlUstawienia Eclipse IDE
http://code.google.com/apis/gdata/articles/eclipse.htmlGłówna strona samej biblioteki
http://code.google.com/apis/gdata/articles/java_client_lib.htmlOfficial Google Data APIs Blog
http://googledataapis.blogspot.com/Atom and Google Data API
http://www.snellspace.com/wp/?p=306Google Data Protocol
http://groups.google.com/group/google-help-dataapiIntroduction to the Google Base Data API
http://pl.youtube.com/watch?v=3WSUIe5id3E&feature=related
Nobody has commented it yet.