JAVA exPress logo Published on JAVA exPress (http://www.javaexpress.pl)

Google Data API

Bartek Chrabski

Issue 2 (2008-12-06)

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.

Source: http://www.javaexpress.pl/article/show/Google_Data_API