Building services with AtomPub

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

description

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 MuleSource . Topic Map. - PowerPoint PPT Presentation

Transcript of Building services with AtomPub

Page 1: Building services with AtomPub

Building services with AtomPub

An exploration of Atom, AtomPub, REST, and HTTP

Page 2: Building services with AtomPub

About me Open Source: Mule, CXF/XFire, Abdera,

Apache-* Exploring how to make building

distributed services more powerful/approachable/scalable/etc

<plug>MuleSource</plug>

Page 3: Building services with AtomPub

Topic Map

Page 4: Building services with AtomPub

The model and the protocol

Page 5: Building services with AtomPub

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

Page 6: Building services with AtomPub

Atom Feed Structure (roughly) Feed

ID Author Link Title Updated * Entry

ID Updated Link Summary Content *

Page 7: Building services with AtomPub

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>

Page 8: Building services with AtomPub

Atom Publishing Protocol Model

Page 9: Building services with AtomPub

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>

Page 10: Building services with AtomPub

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

Page 11: Building services with AtomPub

AtomPub Resources Description

Page 12: Building services with AtomPub

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>

Page 13: Building services with AtomPub

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>

Page 14: Building services with AtomPub

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>

Page 15: Building services with AtomPub

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

Page 16: Building services with AtomPub

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>

Page 17: Building services with AtomPub

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>

Page 18: Building services with AtomPub

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>

Page 19: Building services with AtomPub

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>

Page 20: Building services with AtomPub

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>

Page 21: Building services with AtomPub

DELETE /blog/feed/patterns200 OK

Page 22: Building services with AtomPub

ServerClient

Client Server

ETag ExampleHTTP/1.1 200 OK Date: …ETag: "3e86-410-3596fbbc" Content-Length: 1040 Content-Type: text/html…

HTTP/1.1 304 Not ModifiedDate: …ETag: "3e86-410-3596fbbc" Content-Length: 0…

GET /blog/feedHost: netzooid.com…

GET /blog/feedIf-None-Match: "3e86-410-3596fbbc"Host: netzooid.com…

Page 23: Building services with AtomPub

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

Page 24: Building services with AtomPub

Media Resources Description

Page 25: Building services with AtomPub

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>

Page 26: Building services with AtomPub

POST /pics/ (request)Content-Type: image/pngSlug: Dan Rambles

… binary data …

Page 27: Building services with AtomPub

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>

Page 28: Building services with AtomPub

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…

Page 29: Building services with AtomPub

Why oh why?

Page 30: Building services with AtomPub

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

Page 31: Building services with AtomPub

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

Page 32: Building services with AtomPub

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

Page 33: Building services with AtomPub

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

Page 34: Building services with AtomPub

Microcontent Embed your own extensions inside

Atom entries Extensions become your model Examples:

Contacts Calendars Event Monitoring Purchase Orders Anything…

Page 35: Building services with AtomPub

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>

Page 36: Building services with AtomPub

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>

Page 37: Building services with AtomPub

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>

Page 38: Building services with AtomPub

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>

Page 39: Building services with AtomPub

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…

Page 40: Building services with AtomPub

OpenSearch An XML format for describing how to

query resources Like WSDL for search…

Page 41: Building services with AtomPub

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>[email protected]</Contact> <Url type="application/atom+xml" template="http://example.com/?q={searchTerms}&amp;pw={startPage?}" /></OpenSearchDescription>

Page 42: Building services with AtomPub

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

Page 43: Building services with AtomPub

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>

Page 44: Building services with AtomPub

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:Query role="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:contact name="Dan Diephouse" phone="+15555555555" city="Grand Rapids"> </entry>

</feed>

Page 45: Building services with AtomPub

What is GData?

“simple standard protocol for reading and writing data on the web”

Page 46: Building services with AtomPub

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

Page 47: Building services with AtomPub

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?

Page 48: Building services with AtomPub

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

Page 49: Building services with AtomPub

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

Page 50: Building services with AtomPub

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

Page 51: Building services with AtomPub

Hierarchies How do I model collections of

collections/trees/hierarchies? Example:

1 : N

1 : N

Page 52: Building services with AtomPub

Hierarchical data with Atom<entry> <title>Customer: Acme Inc.</title> <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-xxxxxxxxxxxx</id> <updated>2007-11-07T18:30:02Z</updated> <summary>Acme Inc.</summary> <collection href="http://example.com/customers/purchaseOrders"> <atom:title>Purchase Orders</atom:title> </collection></entry>

Page 53: Building services with AtomPub

Hierarchical data with Atom<entry> <title>Customer: Acme Inc.</title> <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-xxxxxxxxxxxx</id> <updated>2007-11-07T18:30:02Z</updated> <summary>Acme Inc.</summary> <collection href="http://example.com/customers/purchaseOrders" rel="purchase-orders"> <atom:title>Purchase Orders</atom:title> </collection> <collection href="http://example.com/customers/contacts" rel="contacts"> <atom:title>Contacts</atom:title> </collection></entry>

Page 54: Building services with AtomPub

Thoughts on Hierarchies It works! But is ugly: Clients do not inherently

understand hierarchies Multiple collections require “rel”

attribute, which makes the relationships even less clear

Page 55: Building services with AtomPub

Eventing Publish and consume entries which map to

events Application level events

Exceptions/fault monitoring Business level events

A expense over $1000 was registered Use query parameters to narrow down the

criteria Works with any client which understands

Atom Powerful combination with opensearch

Page 56: Building services with AtomPub

Security Goals?

Privacy, Integrity, authentication, authorization

SSL HTTP Auth WSSE Google Auth XML Signature & Encryption

Page 57: Building services with AtomPub

Why not?

Page 58: Building services with AtomPub

Why not AtomPub? More appropriately when not Data is not time indexed Universality does not yield any benefits Batch Performance Messaging may be a more appropriate

model Hierarchy kinda sucks Transactions

Page 59: Building services with AtomPub

Contrasts and Comparisons

A possibly pointless comparison to WS-*

Page 60: Building services with AtomPub

Comparing to WS-*: scaling

AtomPub WS-* Builds on HTTP’s

scalability Stateless ETags Caching

No inherent caching/etags

Can be stateless or stateful

A message oriented approach which may be more suited to some applications (there is also Atom

over XMPP)

Page 61: Building services with AtomPub

Comparisons: feature applicability

AtomPub WS-* Constraints in format

bring universality, but also limit use cases

Covers many of the security, reliability use cases

Requires dev to know HTTP ins and outs

Provides useful things like: Message ordering WS-Trust WS-Policy

Of course it also provides things like: WSDL Interop problems Complexity

Page 62: Building services with AtomPub

Comparisons: interoperability

AtomPub WS-* Atom format is widely

understood Avoids interop

problems by not trying to support everything WS-* supports

Proprietary extensions are still liable to have interop problems just like WS-*

Core (SOAP/WSDL/Schema) is highly interoperable now

WS-* is interoperable to various degrees, mainly on Java/.NET

Page 63: Building services with AtomPub

Comparisons: developers

AtomPub WS-* Currently a pain to

muck with many HTTP libraries and Atom parsers

Improving with future releases of APP frameworks

Simple and understandable

Can write a .NET/Java interop application within a couple minutes

Must understand WSDL, XML-Schema, SOAP, WS-I BP, etc, etc

Page 64: Building services with AtomPub

The one true protocol? No, but… AtomPub can be applied to a wide

variety of business applications Universality can be powerful Hypertext model is powerful AtomPub is a great example of how to

build a RESTful protocol

Page 65: Building services with AtomPub

Questions? Blog: http://netzooid.com/blog Email: [email protected] Some stuff I’ve been working on:

http://incubator.apache.org/abdera http://www.mulesource.org/display/ABDERA