[http://creativecommons.org/licenses/by/3.0/]
This work is licensed under a CC
Attribution 3.0 Unported License [http://creativecommons.org/licenses/by/3.0/]
Hello World
REST's level of abstraction and its simplicity as a small set of constraints can make it hard to get a grasp on how it can be applied for real-world projects. This presentations introduces real-world REST by looking at how REST can be used by reusing existing RESTful designs in terms of representations and interaction protocols; Atom and the Atom Publishing Protocol (AtomPub) are used as examples for existing RESTful designs. In addition, we take a brief look at how to go beyond using these canned REST
approaches, and how existing programming framework provide support for designing and implementing RESTful services.
Hello World
application/xml
provide a machine-readable representation<xml>Hello World</xml>
Hello Worldservice
hello-world.xml
[./src/hello-world.xml]collections of things
The Myth of RSS Compatibility [http://diveintomark.org/archives/2004/02/04/incompatible-rss]provides a good overview
why standards are a good thing
parse and pray)
incompatible by design(RDF vs. non-RDF)
new RSS
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-us"> <title>ongoing</title> <id>http://www.tbray.org/ongoing/</id> <link rel='self' href="http://www.tbray.org/ongoing/ongoing.atom"/> <updated>2007-04-11T12:55:09-07:00</updated> <author> <name>Tim Bray</name> </author> <subtitle>ongoing fragmented essay by Tim Bray</subtitle> <entry xml:base="When/200x/2007/04/02/"> <title>Atom Publishing Protocol Interop!</title> <id>http://www.tbray.org/ongoing/When/200x/2007/04/02/APP-Interop</id> <published>2007-04-02T13:00:00-07:00</published> <updated>2007-04-10T14:24:00-07:00</updated> <category scheme="http://www.tbray.org/ongoing/What/" term="Technology/Atom"/> <category scheme="http://www.tbray.org/ongoing/What/" term="Technology"/> <category scheme="http://www.tbray.org/ongoing/What/" term="Atom"/> <content type="xhtml"> <div xmlns="http://www.w3.org/1999/xhtml"> <p>Mark your calendar: <a href="http://www.intertwingly.net/wiki/pie/April2007Interop">April 16-17 at Google</a>. <em>Everybody</em> is invited, provided they bring along an APP implementation, client or server. This was just announced a couple of days ago, and as I write this there are already <s>six</s> twelve client and <s>seven</s> fourteen server implementations signed up to be there and try to <a href="http://www.intertwingly.net/wiki/pie/InteropGrid">fill in the grid</a>. Let’s drop some names, in alphabetical order: AOL, Flock, Google, IBM, Lotus, Microsoft, Oracle, O’Reilly, Six Apart, Sun, WordPress. Um, have I mentioned that the APP is going to be huge?</p> </div> </content> </entry> </feed>
smartabout what the RSS author really wanted
<content type="xhtml"> <div xmlns="http://www.w3.org/1999/xhtml"> One <strong>bold</strong> foot forward </div> </content>[http://www.xml.com/lpt/a/1633]
<content>The "atom:content" element either contains or links to the content of the entry. The content of atom:content is Language-Sensitive.</content>[http://www.xml.com/lpt/a/1633]
<content type="html">The <code>atom:content</code> element either contains or links to the content of the entry. The content of <code>atom:content</code> is <a href="http://www.ietf.org/rfc/rfc3066.txt">Language-Sensitive</a>.</content>[http://www.xml.com/lpt/a/1633]
<content type="image/png"> iVBORw0KGgoA … TAAAAAElFTkSuQmCC </content>[http://www.xml.com/lpt/a/1633]
<content src="image.png" type="image/png"/>[http://www.xml.com/lpt/a/1633]
<link rel="alternate" type="application/rdf+xml" title="…" href="…" /> <link rel="alternate" type="application/rss+xml" title="…" href="…" />
<link rel="alternate" type="application/atom+xml" title="…" href="…" />
CUDout of the
CRUDset of operations
Resource | HTTP Method | Representation | Description |
---|---|---|---|
Introspection | GET | Atom Service Document [Service Documents (1)] | Enumerates a set of collections and lists their URIs and other information about the collections |
Collection | GET | Atom Feed | A list of member of the collection (this may be a subset of all entries in the collection) |
Collection | POST | Atom Entry | Create a new entry in the collection |
Member | GET | Atom Entry | Get the Atom Entry |
Member | PUT | Atom Entry | Update the Atom Entry |
Member | DELETE | n/a | Delete the Atom Entry from the collection |
Metacollections(collections of collections) can extend AtomPub
Service Documents represent server-defined groups of Collections, and are used to initialize the process of creating and editing resources.
realtop-level construct of AtomPub is the workspace
<service xmlns="http://purl.org/atom/app#" xmlns:atom="http://www.w3.org/2005/Atom"> <workspace> <atom:title>Main Site</atom:title> <collection href="http://example.org/reilly/main"> <atom:title>My Blog Entries</atom:title> <categories href="http://example.com/cats/forMain.cats"/> </collection> <collection href="http://example.org/reilly/pic"> <atom:title>Pictures</atom:title> <accept>image/*</accept> </collection> </workspace> <workspace> <atom:title>Side Bar Blog</atom:title> <collection href="http://example.org/reilly/list"> <atom:title>Remaindered Links</atom:title> <accept>entry</accept> <categories fixed="yes"> <atom:category scheme="http://example.org/extra-cats/" term="joke"/> <atom:category scheme="http://example.org/extra-cats/" term="serious"/> </categories> </collection> </workspace> </service>
<app:categories xmlns:app="http://purl.org/atom/app#" xmlns="http://www.w3.org/2005/Atom" fixed="yes" scheme="http://example.com/cats/big3"> <category term="animal"/> <category term="vegetable"/> <category term="mineral"/> </app:categories>