1 / 65

Building services with AtomPub

Building services with AtomPub. An exploration of Atom, AtomPub , REST, and HTTP. About me. Open Source: Mule, CXF/XFire, Abdera, Apache-* Exploring how to make building distributed services more powerful/approachable/scalable/etc <plug> MuleSource </plug>. Topic Map.

Download Presentation

Building services with AtomPub

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Building services with AtomPub An exploration of Atom, AtomPub, REST, and HTTP

  2. About me • Open Source: Mule, CXF/XFire, Abdera, Apache-* • Exploring how to make building distributed services more powerful/approachable/scalable/etc • <plug>MuleSource</plug>

  3. Topic Map

  4. The model and the protocol

  5. Atom Roots • Atom was created out of frustration with the RSS format • Many inconsistencies, many different versions • Syndication format • Blogs • Monitoring • Search • Directories • Etc • IETF RFC 4287

  6. Atom Feed Structure (roughly) • Feed • ID • Author • Link • Title • Updated • * • Entry • ID • Updated • Link • Summary • Content • *

  7. The Bare Minimum Atom Feed <?xml version="1.0" encoding="utf-8"?> <feed xmlns="http://www.w3.org/2005/Atom"> <title>Dan’s Blog</title> <link href="http://netzooid.com/blog/"/> <updated>2007-11-07T18:30:02Z</updated> <author> <name>Dan Diephouse</name> </author> <id>urn:uuid:60a76c80-d399-11d9-b91C-0003939e0af6</id> <entry> <title>Building services with AtomPub</title> <link href="http://netzooid.com/blog/atompub_services"/> <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id> <updated>2007-11-07T18:30:02Z</updated> <content> … (you must have content or a summary) </content> </entry> </feed>

  8. Atom Publishing Protocol Model

  9. APP Model: Services & Workspaces <service xmlns="http://www.w3.org/2007/app" xmlns:atom="http://www.w3.org/2005/Atom"> <workspace> <atom:title>Dan’s Website</atom:title> <collection href="http://netzooid.com/blog/feed"> <atom:title>Dan’s Blog</atom:title> </collection> <collection href="http://netzooid.com/pics"> <atom:title>Dan’s Pictures</atom:title> <accept>image/png</accept> <accept>image/jpeg</accept> <accept>image/gif</accept> </collection> </workspace> </service>

  10. What is the Atom Publishing Protocol? • Create, edit, delete resources • Extensible Protocol • Authentication extensions (i.e. WSSE) • Opensearch • GData • Properly uses HTTP so it can be scalable and reliable • Builds on Atom model

  11. Description AtomPub Resources

  12. GET / <service xmlns="http://www.w3.org/2007/app" xmlns:atom="http://www.w3.org/2005/Atom"> <workspace> <atom:title>Dan’s Website</atom:title> <collection href="http://netzooid.com/blog/feed"> <atom:title>Dan’s Blog</atom:title> </collection> <collection href="http://netzooid.com/pics"> <atom:title>Dan’s Pictures</atom:title> <accept>image/png</accept> <accept>image/jpeg</accept> <accept>image/gif</accept> </collection> </workspace> </service>

  13. GET / <service xmlns="http://www.w3.org/2007/app" xmlns:atom="http://www.w3.org/2005/Atom"> <workspace> <atom:title>Dan’s Website</atom:title> <collection href="http://netzooid.com/blog/feed"> <atom:title>Dan’s Blog</atom:title> </collection> <collection href="http://netzooid.com/pics"> <atom:title>Dan’s Pictures</atom:title> <accept>image/png</accept> <accept>image/jpeg</accept> <accept>image/gif</accept> </collection> </workspace> </service>

  14. GET /blog/feed <?xml version="1.0" encoding="utf-8"?> <feed xmlns="http://www.w3.org/2005/Atom"> <title>Dan’s Blog</title> <link href="http://netzooid.com/blog/"/> <updated>2007-12-13T18:30:02Z</updated> <author> <name>Dan Diephouse</name> </author> <id>urn:uuid:60a76c80-d399-11d9-b91C-0003939e0af6</id> <entry> <title>Building services with AtomPub</title> <link href="http://netzooid.com/blog/app_services"/> <link href="http://netzooid.com/blog/app_services“ rel="edit"/> <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id> <updated>2007-12-13T18:30:02Z</updated> <content> … (you must have content or a summary) </content> </entry> </feed>

  15. A note on <link> • Entries contain a set of links • Each link has a relationship attribute • No “rel” attribute means its an alternate representation – i.e. HTML

  16. GET /blog/feed/app_services.atom <entry> <title>Building services with AtomPub</title> <link href="http://netzooid.com/blog/app_services"/> <link href="http://netzooid.com/blog/feed/app_services.atom“ rel=“edit” /> <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id> <updated>2007-12-13T18:30:02Z</updated> <content> … </content> </entry>

  17. POST /blog/feed (request) <entry> <title>Atom Pub Patterns</title> <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-xxxxxxxxxxxx</id> <updated>2007-11-07T18:30:02Z</updated> <content> There are many ways to integrate with Atom services… </content> </entry>

  18. POST /blog/feed (response) Location: http://netzooid.com/blog/feed/patterns.atom <entry> <title>Atom Pub Patterns</title> <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-xxxxxxxxxxxx</id> <updated>2007-11-07T18:30:02Z</updated> <link href="http://netzooid.com/blog/patterns"/> <link href="http://netzooid.com/blog/feed/patterns.atom“ rel=“edit” /> <content> There are many ways to integrate with Atom services… </content> </entry>

  19. GET /blog/feed/patterns.atom <entry> <title>Atom Pub Patterns</title> <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-xxxxxxxxxxxx</id> <updated>2007-11-07T18:30:02Z</updated> <link href="http://netzooid.com/blog/patterns"/> <link href="http://netzooid.com/blog/feed/patterns.atom“ rel=“edit” /> <content> There are many ways to integrate with Atom services… </content> </entry>

  20. PUT /blog/feed/patterns (request) <entry> <title>Atom Pub Patterns</title> <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-xxxxxxxxxxxx</id> <updated>2007-11-08T18:30:02Z</updated> <content> AtomPub can be used in a variety of integration scenarios. … </content> </entry>

  21. DELETE /blog/feed/patterns 200 OK

  22. ETag Example HTTP/1.1 200 OK Date: … ETag: "3e86-410-3596fbbc" Content-Length: 1040 Content-Type: text/html … Client Server GET /blog/feed Host: netzooid.com … Client GET /blog/feed If-None-Match: "3e86-410-3596fbbc" Host: netzooid.com … Server HTTP/1.1 304 Not Modified Date: … ETag: "3e86-410-3596fbbc" Content-Length: 0…

  23. Media Resources and Media Link Entries • What about data which you don’t want to necessarily redistribute all the time? • i.e. it’s too large • What about non-XML data? • Images • APP defines: • Media Resource: your data • Media Link Entry: An atom entry which describes your data

  24. Description Media Resources

  25. Service <service xmlns="http://www.w3.org/2007/app" xmlns:atom="http://www.w3.org/2005/Atom"> <workspace> <atom:title>Dan’s Website</atom:title> <collection href="http://netzooid.com/blog/feed"> <atom:title>Dan’s Blog</atom:title> </collection> <collection href="http://netzooid.com/pics"> <atom:title>Dan’s Pictures</atom:title> <accept>image/png</accept> <accept>image/jpeg</accept> <accept>image/gif</accept> </collection> </workspace> </service>

  26. POST /pics/ (request) Content-Type: image/png Slug: Dan Rambles … binary data …

  27. POST /pics/ (request) <entry xmlns="http://www.w3.org/2005/Atom"> <title>Dan rambles</title> <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efe6b</id> <updated>2007-11-07T17:26:43Z</updated> <author> <name>Dan Diephouse</name> </author> <summary type="text" /> <content type="image/png" src="http://netzooid.com/pics/dan_rambles.png" /> <link rel="edit-media" href="http://netzooid.com/pics/dan_rambles.png" /> <link rel="edit" href="hhttp://netzooid.com/pics/dan_rambles.atom" /> </entry>

  28. The Media Link Entry • You can add summary later or have it auto-generated from the content. • Allows you to store, browse, updated, delete anything! • Pictures • XML documents • Jars • Videos • Messages…

  29. Why oh why?

  30. Universal • Atom is widely understood • Provides ubiquitous elements which have meaning across all contexts • Summary/Content • Updated date • ID • Links • Clients do not need to understand your specific application to interact with it

  31. Leverage HTTP • AtomPub (nearly) guarantees you’ll follow RESTful best practices and have a scalable service • Uniform Interface • ETags • Caching • Reliability • Avoid writing your own protocol

  32. Existing Infrastructure • Many Atom/AtomPub libraries/frameworks are popping up • Abdera (Java) • Propono (Java) • Amplee (Python) • You don’t need a framework though: Just use HTTP • wget • commons httpclient • etc

  33. Building Services: Patterns and Strategies Some scientists claim that hydrogen, because it is so plentiful, is the basic building block of the universe. I dispute that. I say that there is more stupidity than hydrogen, and that is the basic building block of the universe. – Frank Zappa

  34. Microcontent • Embed your own extensions inside Atom entries • Extensions become your model • Examples: • Contacts • Calendars • Event Monitoring • Purchase Orders • Anything…

  35. GET /contacts <feed xmlns="http://www.w3.org/2005/Atom"> <title>Contacts</title> <link href="http://example.org/contacts/"/> <updated>2007-12-13T18:30:02Z</updated> <author> <name>Contact Manager</name> </author> <id>urn:uuid:60a76c80-d399-11d9-b91C-0003939e0af6</id> <entry> <title>Dan Diephouse</title> <link href="http://example.org/contacts/dan_diephouse“ rel="edit"/> <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id> <updated>2007-12-13T18:30:02Z</updated> <summary type="xhtml"> Dan Diephouse<br/> +1 555.555.5555 </summary> <acme:contact name="Dan Diephouse" phone="+15555555555" city="Grand Rapids"> </entry> </feed>

  36. GET /contacts <feed xmlns="http://www.w3.org/2005/Atom"> <title>Contacts</title> <link href="http://example.org/contacts/"/> <updated>2007-12-13T18:30:02Z</updated> <author> <name>Contact Manager</name> </author> <id>urn:uuid:60a76c80-d399-11d9-b91C-0003939e0af6</id> <entry> <title>Dan Diephouse</title> <link href="http://example.org/contacts/dan_diephouse“ rel="edit"/> <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id> <updated>2007-12-13T18:30:02Z</updated> <summary type="xhtml"> Dan Diephouse<br/> +1 555.555.5555 </summary> <acme:contact name="Dan Diephouse" phone="+15555555555" city="Grand Rapids"> </entry> </feed>

  37. PUT /contacts/dan_diephouse <entry> <title>Dan Dipehouse</title> <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id> <updated>2007-12-13T18:30:02Z</updated> <summary/> <acme:contact name="Dan Diephouse" phone="+10000000000" city="Grand Rapids"> </entry>

  38. Microformat <feed xmlns="http://www.w3.org/2005/Atom"> <title>Contacts</title> <link href="http://example.org/contacts/"/> <updated>2007-12-13T18:30:02Z</updated> <author> <name>Contact Manager</name> </author> <id>urn:uuid:60a76c80-d399-11d9-b91C-0003939e0af6</id> <entry> <title>Dan Diephouse</title> <link href="http://example.org/contacts/dan_diephouse“ rel="edit"/> <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id> <updated>2007-12-13T18:30:02Z</updated> <content type="xhtml"> <span class="name">Dan Diephouse</span> <span class="phone">+1 555 555 5555</span> <span class="city">Grand Rapids</span> </content> </feed>

  39. Microcontent • Microcontent can be anything to do with your application • Summary, date, link, id can provide information which is understandable by everyone • Atom servers preserve all metadata not specifically updated • Media entries may be more suitable for some applications – even if you are using XML content • Becomes searchable with things like OpenSearch & GData…

  40. OpenSearch • An XML format for describing how to query resources • Like WSDL for search…

  41. Example <OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/"> <ShortName>Contact Search</ShortName> <Description>Search the contact database.</Description> <Tags>example web</Tags> <Contact>admin@example.com</Contact> <Url type="application/atom+xml" template="http://example.com/?q={searchTerms}&amp;pw={startPage?}" /> </OpenSearchDescription>

  42. OpenSearch • Offers a way to tell people how to search your service • Several standard parameters: • searchTerms: Search criteria • count: The number of results per page • startPage: The page of results • language: The language of the results • etc.. • Define your own terms as well

  43. Example <?xml version="1.0" encoding="UTF-8"?> <feed xmlns="http://www.w3.org/2005/Atom" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"> <!-- ... ---> <link rel="search" href="http://example.com/opensearchdescription.xml" type="application/opensearchdescription+xml" title="Content Search" /> <!-- ... ---> </feed>

  44. GET /feed?q=Dan&pw=0 <feed xmlns="http://www.w3.org/2005/Atom"> ... <opensearch:totalResults>35</opensearch:totalResults> <opensearch:startIndex>1</opensearch:startIndex> <opensearch:itemsPerPage>10</opensearch:itemsPerPage> <opensearch:Queryrole="request" searchTerms="Dan" startPage="1" /> <link rel="alternate" href="...search.html?pw=1" type="text/html"/> <link rel="self" href="...?q=Dan&amp;pw=1" type="application/atom+xml"/> <link rel="first" href="...?q=Dan&amp;pw=1" type="application/atom+xml"/> <link rel="next" href="...?q=Dan&amp;pw=2" type="application/atom+xml"/> <link rel="last" href="...?q=Dan&amp;pw=4" type="application/atom+xml"/> <link rel="search" type="application/opensearchdescription+xml" href="http://example.com/opensearchdescription.xml"/> <entry> ... <acme:contactname="Dan Diephouse" phone="+15555555555" city="Grand Rapids"> </entry> </feed>

  45. What is GData? “simple standard protocol for reading and writing data on the web”

  46. What does that mean? • Standard way to query feeds • Specifies optimistic concurrency model • Way to authenticate users • Common elements for Google services • A way to do batch operations • All built on AtomPub • Used for all Google’s APIs

  47. Batch • APP doesn’t specify a way to do batch operations • GData supplies one way, but it has received a cold reception as a general purpose way to do batch things • Some things to think about: • How do you deal with errors? • Does your batch method lose the benefits of the uniform interface?

  48. GData Batch <feed> <entry> <batch:operationtype="insert"/> ... what to insert ... </entry> <entry> <batch:operationtype="update"/> ... what to update ... </entry> <entry> <batch:operationtype="delete"/> ... what to delete ... </entry> <entry> <batch:operationtype="query"/> ... what to query ... </entry> </feed>

  49. GData Batch response <feed> <entry> ... <batch:operation type="insert"/> <batch:id>itemB</batch:id> <batch:status code="201" reason="Created"/> </entry> </feed>

  50. Thoughts on GData • Weakness in APP? • Or strength because its extensible?

More Related