google data protocol guy mark lifshitz. motivation google’s mission: – organize the world’s...
TRANSCRIPT
Google Data Protocol
Guy Mark Lifshitz
Motivation
• Google’s Mission:– Organize the world’s information– Make information universally accessible– Provide tools to access your information
• Avoid limitations on contexts:– Not limited to Google– Not limited to browsers
Foundation
• REST
• AtomPub • JSON• RSS
REST “Representational state transfer”
REST
• Simple• Lightweight• Scalable• Maps well to representing and exposing data
REST
• 1. Client sends a request to server• 2. Server process the request • 3. Server returns a response
AtomPub“Atom Publishing Protocol”
(RFC 5023)
AtomPub
• Originally created for blogs• Feed based• Feeds are found at a specific URI• An Atom Reader looks for entries in a feed
AtomPub
• Create
• Retrieve
• Update
• Delete
AtomPub
• Create– PUT
• Retrieve – GET
• Update– GET, modify feed, PUT
• Delete– DELETE
Calendar Atom Feed<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" ... >
<id>http://www.google.com/calendar/feeds/default/settings</id>
<link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml ... >
<generator uri="http://www.google.com/calendar">Google Calendar</generator>
<updated>2009-03-05T10:46:25.244Z</updated>
<title type="text">Coach's's personal settings</title>
<openSearch:startIndex>1</openSearch:startIndex>
<author>
<name>Coach</name>
<email>[email protected]</email>
</author>
<entry>
<id>http://www.google.com/calendar/feeds/default/settings/...</id>
<updated>2009-03-05T10:46:25.245Z</updated>
<link rel="self" type="application/atom+xml" href="http://www.google...” >
<gCal:settingsProperty name="alternateCalendar" value="0"/>
</entry>
</feed>
Calendar Atom Feed<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" ... >
<id>http://www.google.com/calendar/feeds/default/settings</id>
<link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml ... >
<generator uri="http://www.google.com/calendar">Google Calendar</generator>
<updated>2009-03-05T10:46:25.244Z</updated>
<title type="text">Coach's's personal settings</title>
<openSearch:startIndex>1</openSearch:startIndex>
<author>
<name>Coach</name>
<email>[email protected]</email>
</author>
<entry>
<id>http://www.google.com/calendar/feeds/default/settings/...</id>
<updated>2009-03-05T10:46:25.245Z</updated>
<link rel="self" type="application/atom+xml" href="http://www.google...” >
<gCal:settingsProperty name="alternateCalendar" value="0"/>
</entry>
</feed>
Calendar Atom Feed<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" ... >
<id>http://www.google.com/calendar/feeds/default/settings</id>
<link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml ... >
<generator uri="http://www.google.com/calendar">Google Calendar</generator>
<updated>2009-03-05T10:46:25.244Z</updated>
<title type="text">Coach's's personal settings</title>
<openSearch:startIndex>1</openSearch:startIndex>
<author>
<name>Coach</name>
<email>[email protected]</email>
</author>
<entry>
<id>http://www.google.com/calendar/feeds/default/settings/...</id>
<updated>2009-03-05T10:46:25.245Z</updated>
<link rel="self" type="application/atom+xml" href="http://www.google...” >
<gCal:settingsProperty name="alternateCalendar" value="0"/>
</entry>
</feed>
Calendar Atom Feed<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" ... >
<id>http://www.google.com/calendar/feeds/default/settings</id>
<link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml ... >
<generator uri="http://www.google.com/calendar">Google Calendar</generator>
<updated>2009-03-05T10:46:25.244Z</updated>
<title type="text">Coach's's personal settings</title>
<openSearch:startIndex>1</openSearch:startIndex>
<author>
<name>Coach</name>
<email>[email protected]</email>
</author>
<entry>
<id>http://www.google.com/calendar/feeds/default/settings/...</id>
<updated>2009-03-05T10:46:25.245Z</updated>
<link rel="self" type="application/atom+xml" href="http://www.google...” >
<gCal:settingsProperty name="alternateCalendar" value="0"/>
</entry>
</feed>
Calendar Atom Feed<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" ... >
<id>http://www.google.com/calendar/feeds/default/settings</id>
<link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml ... >
<generator uri="http://www.google.com/calendar">Google Calendar</generator>
<updated>2009-03-05T10:46:25.244Z</updated>
<title type="text">Coach's's personal settings</title>
<openSearch:startIndex>1</openSearch:startIndex>
<author>
<name>Coach</name>
<email>[email protected]</email>
</author>
<entry>
<id>http://www.google.com/calendar/feeds/default/settings/...</id>
<updated>2009-03-05T10:46:25.245Z</updated>
<link rel="self" type="application/atom+xml" href="http://www.google...” >
<gCal:settingsProperty name="alternateCalendar" value="0"/>
</entry>
</feed>
Calendar Atom Feed<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" ... >
<id>http://www.google.com/calendar/feeds/default/settings</id>
<link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml ... >
<generator uri="http://www.google.com/calendar">Google Calendar</generator>
<updated>2009-03-05T10:46:25.244Z</updated>
<title type="text">Coach's's personal settings</title>
<openSearch:startIndex>1</openSearch:startIndex>
<author>
<name>Coach</name>
<email>[email protected]</email>
</author>
<entry>
<id>http://www.google.com/calendar/feeds/default/settings/...</id>
<updated>2009-03-05T10:46:25.245Z</updated>
<link rel="self" type="application/atom+xml" href="http://www.google...” >
<gCal:settingsProperty name="alternateCalendar" value="0"/>
</entry>
</feed>
Calendar Atom Feed<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" ... >
<id>http://www.google.com/calendar/feeds/default/settings</id>
<link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml ... >
<generator uri="http://www.google.com/calendar">Google Calendar</generator>
<updated>2009-03-05T10:46:25.244Z</updated>
<title type="text">Coach's's personal settings</title>
<openSearch:startIndex>1</openSearch:startIndex>
<author>
<name>Coach</name>
<email>[email protected]</email>
</author>
<entry>
<id>http://www.google.com/calendar/feeds/default/settings/...</id>
<updated>2009-03-05T10:46:25.245Z</updated>
<link rel="self" type="application/atom+xml" href="http://www.google...” >
<gCal:settingsProperty name="alternateCalendar" value="0"/>
</entry>
</feed>
JSON“JavaScript Object notation”
JSON
• Properties– Lightweight data interchange format– Widespread use among web developers– Easy to read and write– Can parse JSON using any language– JSON structures map directly to data structures
used in most programming languages• Within the Google Data Protocol, JSON objects
simply mirror the Atom representation.
JSON vs. XML• "firstName": "John",• "lastName": "Smith",• "age": 25,• "address": {• "streetAddress": "21 2nd Street",
"city": "New York",• "state": "NY",• "postalCode": "10021“• }, • "phoneNumbers": [• { "type": "home“, "number": "212 555-1234"},• { "type": "fax", "number": "646 555-4567" } • ],• "newSubscription": false,• "companyName": null
JSON vs. XML<Person firstName="John" lastName="Smith">
<age>25</age><address>
<streetAddress>21 2nd Street</streetAddress> <city>New York</city><state>NY</state> <postalCode>10021</postalCode>
</address> <phoneNumber type="home">555 1234</phoneNumber><phoneNumber type="fax">646 555-4567</phoneNumber><newSubscription>false</newSubscription> <companyName />
</Person>
GData
Additional Features
• Authentication• Queries• Concurrency • Common Elements • Batch Processing
Authentication
• ClientLogin– Desktop applications– Uses text input in application
myService.setUserCredentials("[email protected]", "mypassword");
• AuthSub– 3rd party websites – Directs you to Google’s website.
Query
• Add query to the URL
• Basic:http://www.google.com/calendar/feeds/default/private/full
• Events before February 11th 2010, ordered by datehttp://www.google.com/calendar/feeds/default/private/full
?start-max=2010-02-11&orderby=starttime
Query
• Use the API to build queries
CalendarQuery myQuery = new CalendarQuery(feedUrl);
myQuery.setMinimumStartTime(DateTime.parseDateTime("2006-03-16T00:00:00"));
myQuery.setMaximumStartTime(DateTime.parseDateTime("2006-03-24T23:59:59"));
...
CalendarEventFeed resultFeed = myService.query(myQuery, Feed.class);
Additional Features
• Authentication• Queries• Concurrency • Common Elements • Batch Processing
Additional Features
• Authentication• Queries• Concurrency • Common Elements – “Kines”
• Batch Processing
Additional Features
• Authentication• Queries• Concurrency • Common Elements • Batch Processing
APIs
Libraries
• Java• .NET• PHP• Python• JavaScript• Obj-C
API Library
Links
• http://code.google.com/apis/gdata/
Examplepublic class CalendarTest {
public static void main(String[] args) { CalendarService myService = new CalendarService("exampleCo-exampleApp-1.0");myService.setUserCredentials("[email protected]", "pa$$word");
URL feedUrl = new URL("http://www.google.com/calendar/feeds/default/allcalendars/full");
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("\t" + entry.getTitle().getPlainText());
} }
}
Request
• GET PUT DELETEE HEAD POST– All Methods– POST not safe or idempotent
• Intermediaries can be added in between– Proxies and Gateways– Can add performance
Protocol
• Client Server• Stateless– Requests are independent (don’t know what other
interactions are doing)
• Layered – HTTP intermdiaries can be added without
changing behaviour
• Cacheable
REST
• Architectural Style• Architecture of the web• HTTP (protocol)• Request Response. • Client requests from server, and server
responds.
Extends• Atom 1.0 • RSS 2.0 • Atom Publishing Protocol (APP).• Google Data protocol extends those standards in
various ways, using the extension mechanisms built into the standards.
• Feeds conform to either the Atom or RSS syndication formats.
• The publishing model conforms to the Atom Publishing Protocol.
AtomPub
• “Atom Publishing Protocol” (RFC 5023)
• Web syndication is an effective and popular method for providing and aggregating content.
• It also lets you send data to Google and update data that Google maintains.
Benefits
• Efficiency– Caches
• Scalability– Large set of origin servers
• Performance to user– Partial rendering of html and such.
Calendar Feed<feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:gCal="http://schemas.google.com/gCal/2005" xmlns:gd="http://schemas.google.com/g/2005" gd:etag="W/"Ck8FQ3Y4cCp7I2A9WxVVEkU.""> <id>http://www.google.com/calendar/feeds/default/settings</id> <updated>2009-03-05T10:46:25.244Z</updated> <title type="text">Coach's's personal settings</title> <link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://www.google.com/calendar/feeds/default/settings"/> <link rel="self" type="application/atom+xml" href="http://www.google.com/calendar/feeds/default/settings"/> <author> <name>Coach</name> <email>[email protected]</email> </author> <generator version="1.0" uri="http://www.google.com/calendar">Google Calendar</generator> <openSearch:startIndex>1</openSearch:startIndex> <entry> <id>http://www.google.com/calendar/feeds/default/settings/alternateCalendar</id> <updated>2009-03-05T10:46:25.245Z</updated> <link rel="self" type="application/atom+xml" href="http://www.google.com/calendar/feeds/default/settings/alternateCalendar"/> <gCal:settingsProperty name="alternateCalendar" value="0"/> </entry> <entry> <id>http://www.google.com/calendar/feeds/default/settings/country</id> <updated>2009-03-05T10:46:25.245Z</updated> <link rel="self" type="application/atom+xml" href="http://www.google.com/calendar/feeds/default/settings/country"/> <gCal:settingsProperty name="country" value="EH"/> </entry></feed>
Calendar Feed<feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:gCal="http://schemas.google.com/gCal/2005" xmlns:gd="http://schemas.google.com/g/2005" gd:etag="W/"Ck8FQ3Y4cCp7I2A9WxVVEkU.""> <id>http://www.google.com/calendar/feeds/default/settings</id> <updated>2009-03-05T10:46:25.244Z</updated> <title type="text">Coach's's personal settings</title> <link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://www.google.com/calendar/feeds/default/settings"/> <link rel="self" type="application/atom+xml" href="http://www.google.com/calendar/feeds/default/settings"/> <author> <name>Coach</name> <email>[email protected]</email> </author> <generator version="1.0" uri="http://www.google.com/calendar">Google Calendar</generator> <openSearch:startIndex>1</openSearch:startIndex> <entry> <id>http://www.google.com/calendar/feeds/default/settings/alternateCalendar</id> <updated>2009-03-05T10:46:25.245Z</updated> <link rel="self" type="application/atom+xml" href="http://www.google.com/calendar/feeds/default/settings/alternateCalendar"/> <gCal:settingsProperty name="alternateCalendar" value="0"/> </entry> <entry> <id>http://www.google.com/calendar/feeds/default/settings/country</id> <updated>2009-03-05T10:46:25.245Z</updated> <link rel="self" type="application/atom+xml" href="http://www.google.com/calendar/feeds/default/settings/country"/> <gCal:settingsProperty name="country" value="EH"/> </entry></feed>
Calendar Feed<feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:gCal="http://schemas.google.com/gCal/2005" xmlns:gd="http://schemas.google.com/g/2005" gd:etag="W/"Ck8FQ3Y4cCp7I2A9WxVVEkU.""> <id>http://www.google.com/calendar/feeds/default/settings</id> <updated>2009-03-05T10:46:25.244Z</updated> <title type="text">Coach's's personal settings</title> <link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://www.google.com/calendar/feeds/default/settings"/> <link rel="self" type="application/atom+xml" href="http://www.google.com/calendar/feeds/default/settings"/> <author> <name>Coach</name> <email>[email protected]</email> </author> <generator version="1.0" uri="http://www.google.com/calendar">Google Calendar</generator> <openSearch:startIndex>1</openSearch:startIndex> <entry> <id>http://www.google.com/calendar/feeds/default/settings/alternateCalendar</id> <updated>2009-03-05T10:46:25.245Z</updated> <link rel="self" type="application/atom+xml" href="http://www.google.com/calendar/feeds/default/settings/alternateCalendar"/> <gCal:settingsProperty name="alternateCalendar" value="0"/> </entry> <entry> <id>http://www.google.com/calendar/feeds/default/settings/country</id> <updated>2009-03-05T10:46:25.245Z</updated> <link rel="self" type="application/atom+xml" href="http://www.google.com/calendar/feeds/default/settings/country"/> <gCal:settingsProperty name="country" value="EH"/> </entry></feed>
Calendar Feed
<entry>
<id>http://www.google.com/calendar/feeds/default/settings/alternateCalendar</id>
<updated>2009-03-05T10:46:25.245Z</updated>
<link rel="self" type="application/atom+xml" href="http://www.google.com/calendar/feeds/default/settings/alternateCalendar"/>
<gCal:settingsProperty name="alternateCalendar” value="0"/>
</entry>
Atom Feeds <?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Example Feed</title><subtitle>A subtitle.</subtitle><link href="http://example.org/feed/" rel="self" /><link href="http://example.org/" /><id>urn:uuid:60a76c80-d399-11d9-b91C-0003939e0af6</id><updated>2003-1213T18:30:02Z</updated> <author>
<name>John Doe</name><email>[email protected]</email>
</author> <entry>
<title>Atom-Powered Robots Run Amok</title><link href="http://example.org/2003/12/13/atom03" /> <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id> <updated>2003-12-13T18:30:02Z</updated> <summary>Some text.</summary>
</entry> </feed>
Atom Feeds<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Example Feed</title><subtitle>A subtitle.</subtitle><link href="http://example.org/feed/" rel="self" /><link href="http://example.org/" /><id>urn:uuid:60a76c80-d399-11d9-b91C-0003939e0af6</id><updated>2003-1213T18:30:02Z</updated> <author>
<name>John Doe</name><email>[email protected]</email>
</author> <entry>
<title>Atom-Powered Robots Run Amok</title><link href="http://example.org/2003/12/13/atom03" /> <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id> <updated>2003-12-13T18:30:02Z</updated> <summary>Some text.</summary>
</entry> </feed>
Atom Feeds<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Example Feed</title><subtitle>A subtitle.</subtitle><link href="http://example.org/feed/" rel="self" /><link href="http://example.org/" /><id>urn:uuid:60a76c80-d399-11d9-b91C-0003939e0af6</id><updated>2003-1213T18:30:02Z</updated> <author>
<name>John Doe</name><email>[email protected]</email>
</author> <entry>
<title>Atom-Powered Robots Run Amok</title><link href="http://example.org/2003/12/13/atom03" /> <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id> <updated>2003-12-13T18:30:02Z</updated> <summary>Some text.</summary>
</entry> </feed>
Atom Feeds<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Example Feed</title><subtitle>A subtitle.</subtitle><link href="http://example.org/feed/" rel="self" /><link href="http://example.org/" /><id>urn:uuid:60a76c80-d399-11d9-b91C-0003939e0af6</id><updated>2003-1213T18:30:02Z</updated> <author>
<name>John Doe</name><email>[email protected]</email>
</author> <entry>
<title>Atom-Powered Robots Run Amok</title><link href="http://example.org/2003/12/13/atom03" /> <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id> <updated>2003-12-13T18:30:02Z</updated> <summary>Some text.</summary>
</entry> </feed>
Atom Feeds<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Example Feed</title><subtitle>A subtitle.</subtitle><link href="http://example.org/feed/" rel="self" /><link href="http://example.org/" /><id>urn:uuid:60a76c80-d399-11d9-b91C-0003939e0af6</id><updated>2003-1213T18:30:02Z</updated> <author>
<name>John Doe</name><email>[email protected]</email>
</author> <entry>
<title>Atom-Powered Robots Run Amok</title><link href="http://example.org/2003/12/13/atom03" /> <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id> <updated>2003-12-13T18:30:02Z</updated> <summary>Some text.</summary>
</entry> </feed>
Atom Feeds<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Example Feed</title><subtitle>A subtitle.</subtitle><link href="http://example.org/feed/" rel="self" /><link href="http://example.org/" /><id>urn:uuid:60a76c80-d399-11d9-b91C-0003939e0af6</id><updated>2003-1213T18:30:02Z</updated> <author>
<name>John Doe</name><email>[email protected]</email>
</author> <entry>
<title>Atom-Powered Robots Run Amok</title><link href="http://example.org/2003/12/13/atom03" /> <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id> <updated>2003-12-13T18:30:02Z</updated> <summary>Some text.</summary>
</entry> </feed>
Atom Feeds<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Example Feed</title><subtitle>A subtitle.</subtitle><link href="http://example.org/feed/" rel="self" /><link href="http://example.org/" /><id>urn:uuid:60a76c80-d399-11d9-b91C-0003939e0af6</id><updated>2003-1213T18:30:02Z</updated> <author>
<name>John Doe</name><email>[email protected]</email>
</author> <entry>
<title>Atom-Powered Robots Run Amok</title><link href="http://example.org/2003/12/13/atom03" /> <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id> <updated>2003-12-13T18:30:02Z</updated> <summary>Some text.</summary>
</entry> </feed>