web service design with atompub

61
Web Service Design with AtomPub Ben Ramsey Code Works

Upload: ben-ramsey

Post on 09-May-2015

5.689 views

Category:

Technology


1 download

DESCRIPTION

The Web is transforming into a platform for distributed applications where rich clients connect to web services to retrieve and store data, but these services need a common language. The Atom Publishing Protocol provides is one such language. Since 2003, the Atom format has been used as yet another feed format like RSS, but the Atom protocol opens the door to far more uses of Atom as both a means for distribution and publication. Ben Ramsey introduces the Atom format and protocol, explaining how these can form the foundation of any service for publication and distribution of content.

TRANSCRIPT

Page 1: Web Service Design with AtomPub

Web Service Design with AtomPubBen Ramsey ■ Code Works

Page 2: Web Service Design with AtomPub

Atom & AtomPub?

Page 3: Web Service Design with AtomPub

What’s the difference?

Page 4: Web Service Design with AtomPub

Atom:RFC 4287

Page 5: Web Service Design with AtomPub

Atom is an XML language.

Page 6: Web Service Design with AtomPub

AtomPub:RFC 5023

Page 7: Web Service Design with AtomPub

AtomPub is a publishing protocol.

Page 8: Web Service Design with AtomPub

What about RSS?

Page 9: Web Service Design with AtomPub

Content types

■ RSS allows only for plain text and escaped HTML content types

■ Atom provides for plain text, escaped HTML, XHTML, XML, and Base64-encoded binary data

Page 10: Web Service Design with AtomPub

Internationalization

■ RSS may have a language set for a feed, but doesn’t have a way to indicate language for items in the feed

■ Atom uses the xml:lang attribute to specify language on a per-element basis

■ Atom uses IRIs, which allow the usage of characters in identifiers outside of ASCII

Page 11: Web Service Design with AtomPub

Modularity

■ RSS vocabulary elements aren’t reusable in other XML vocabularies

■ Atom was designed to allow its vocabulary to be mixed with other XML vocabularies

■ Namespaces! Atom has one; RSS does not

Page 12: Web Service Design with AtomPub

Other things

■ RSS has no schema; Atom has a RelaxNG schema

■ RSS defines no mechanism for handling relative URIs; Atom uses xml:base

■ Various implementations in RSS leads to interoperability problems

■ No standard protocol for publishing

Page 13: Web Service Design with AtomPub

Atom was created to solve the RSS problems.

Page 14: Web Service Design with AtomPub

Atom profile

■ Atom Syndication Format

■ An XML-based web content and metadata syndication format

■ Defined by IETF RFC 4287

■ Fixes the “problems” of RSS

■ XML namespace: http://www.w3.org/2005/Atom

Page 15: Web Service Design with AtomPub

AtomPub profile

■ Atom Publishing Protocol

■ A protocol for publishing and editing web resources using HTTP and XML

■ Defined by IETF RFC 5023

■ Uses Atom as it’s XML syntax

■ XML namespace: http://www.w3.org/2007/app

Page 16: Web Service Design with AtomPub

AtomPub basics

■ Each resource has a unique identifier

■ The resources are well-connected

■ Resources share the same interface

■ There is no state; requests are atomic

■ Follows a resource-oriented architecture

Page 17: Web Service Design with AtomPub

Some terms…

■ Entry

■ Feed/Collection

■ Category Document

■ Service Document

Page 18: Web Service Design with AtomPub

Content types…

■ Entry: application/atom+xml;type=entry

■ Feed/Collection:application/atom+xml

■ Category Document:application/atomcat+xml

■ Service Document:application/atomsvc+xml

Page 19: Web Service Design with AtomPub

Designing an AtomPub service

Page 20: Web Service Design with AtomPub

What will our service do?

■ Expose users

■ Expose content

■ Allow users to manipulate content

Page 21: Web Service Design with AtomPub

1. Define our URIs

Page 22: Web Service Design with AtomPub

Users

■ /user

■ /user/ramsey

Page 23: Web Service Design with AtomPub

Content

■ /content

■ /content/1234

Page 24: Web Service Design with AtomPub

2. Define the relationships

Page 25: Web Service Design with AtomPub

■ user ⇛ content:one to many

■ content ⇛ user:one to one

Page 26: Web Service Design with AtomPub

3. Define the interface

Page 27: Web Service Design with AtomPub

Methods

GETPUTPOSTDELETE

Cut & Paste

CopyPaste OverPaste AfterCut

Page 28: Web Service Design with AtomPub

■ Retrieve user collection:GET /user

■ Create a new user:POST /user

■ Modify an existing user:PUT /user/ramsey

■ Delete a user:DELETE /user/ramsey

Page 29: Web Service Design with AtomPub

■ Retrieve content:GET /content

■ Create new content:POST /content

■ Modify content:PUT /content/1234

■ Remove content:DELETE /content/1234

Page 30: Web Service Design with AtomPub

■ Service discovery:GET /

■ Retrieve content for a particular user:GET /user/ramsey/content

Page 31: Web Service Design with AtomPub

Let’s see it in action

Page 32: Web Service Design with AtomPub

GET / HTTP/1.1Host: atom.example.org

HTTP/1.x 200 OKDate: Mon, 21 Sep 2009 16:33:45 GMTContent-Type: application/atomsvc+xml

Page 33: Web Service Design with AtomPub

<?xml version="1.0" encoding="utf-8"?><service xmlns="http://www.w3.org/2007/app" xmlns:atom="http://www.w3.org/2005/Atom" xml:base="http://atom.example.org/"> <workspace> <atom:title>Our Content Store</atom:title> <collection href="user"> <atom:title>Users</atom:title> <accept>application/atom+xml;type=entry</accept> <categories href="cat/user"/> </collection> <collection href="content"> <atom:title>Content</atom:title> <accept>application/atom+xml;type=entry</accept> <categories href="cat/content"/> </collection> </workspace></service>

Page 34: Web Service Design with AtomPub

GET /user HTTP/1.1Host: atom.example.org

HTTP/1.x 200 OKDate: Mon, 21 Sep 2009 16:34:26 GMTContent-Type: application/atom+xml

Page 35: Web Service Design with AtomPub

<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:app="http://www.w3.org/2007/app" xml:base="http://atom.example.org/"> <title>Users</title> <updated>2009-09-21T05:21:19Z</updated> <id>tag:example.org,2009-09:user</id> <app:collection href="user"> <title>Users</title> <app:accept>application/atom+xml;type=entry</app:accept> <app:categories href="cat/user"/> </app:collection> <link rel="first" href="user"/> <link rel="last" href="user?p=23"/> <link rel="next" href="user?p=2"/> <entry> ... </entry></feed>

Page 36: Web Service Design with AtomPub

Manipulate a user

Page 37: Web Service Design with AtomPub

GET /user/ramsey HTTP/1.1Host: atom.example.org

HTTP/1.x 200 OKDate: Mon, 21 Sep 2009 16:34:26 GMTContent-Type: application/atom+xml;type=entry

Page 38: Web Service Design with AtomPub

<?xml version="1.0" encoding="utf-8"?><entry xmlns="http://www.w3.org/2005/Atom" xml:base="http://atom.example.org/"> <title>ramsey</title> <author> <name>ramsey</name> </author> <link rel="self" href="user/ramsey"/> <link rel="edit" type="application/atom+xml;type=entry" href="user/ramsey"/> <link rel="related" href="user/ramsey/content"/> <id>tag:example.org,2008:user/ramsey</id> <updated>2009-09-21T13:45:00Z</updated> <published>2008-05-23T16:23:34Z</published> <content type="xhtml"> <div class="vcard"> <a class="fn">Ben Ramsey</a> <span class="tel">123-456-7890</span> </div> </content></entry>

Page 39: Web Service Design with AtomPub

Modify the entry locally

Page 40: Web Service Design with AtomPub

<?xml version="1.0" encoding="utf-8"?><entry xmlns="http://www.w3.org/2005/Atom" xml:base="http://atom.example.org/"> <title>ramsey</title> <author> <name>ramsey</name> </author> <link rel="self" href="user/ramsey"/> <link rel="edit" type="application/atom+xml;type=entry" href="user/ramsey"/> <link rel="related" href="user/ramsey/content"/> <id>tag:example.org,2008:user/ramsey</id> <updated>2009-09-22T09:14:58Z</updated> <published>2008-05-23T16:23:34Z</published> <content type="xhtml"> <div class="vcard"> <a class="fn url" href="http://benramsey.com/">Ben Ramsey</a> <span class="org">Schematic</span> <span class="tel">123-456-7890</span> </div> </content></entry>

Page 41: Web Service Design with AtomPub

PUT /user/ramsey HTTP/1.1Host: atom.example.orgContent-Type: application/atom+xml;type=entry

{body here}

HTTP/1.x 200 OKDate: Mon, 22 Sep 2009 09:14:59 GMTContent-Type: application/atom+xml;type=entry

Page 42: Web Service Design with AtomPub

Add some content

Page 43: Web Service Design with AtomPub

First, a few notes

■ You need authentication!

■ Perhaps you need encryption

■ You definitely need validation

■ And I’m not going to tell you how

Page 44: Web Service Design with AtomPub

That’s out of scope.

Page 45: Web Service Design with AtomPub

:-)

Page 46: Web Service Design with AtomPub

But I’ll show you the basics…

Page 47: Web Service Design with AtomPub

<?xml version="1.0" encoding="utf-8"?><service xmlns="http://www.w3.org/2007/app" xmlns:atom="http://www.w3.org/2005/Atom" xml:base="http://atom.example.org/"> <workspace> <atom:title>Our Content Store</atom:title> <collection href="user"> <atom:title>Users</atom:title> <accept>application/atom+xml;type=entry</accept> <categories href="cat/user"/> </collection> <collection href="content"> <atom:title>Content</atom:title> <accept>application/atom+xml;type=entry</accept> <categories href="cat/content"/> </collection> </workspace></service>

Page 48: Web Service Design with AtomPub

Get the categories

Page 49: Web Service Design with AtomPub

GET /cat/content HTTP/1.1Host: atom.example.org

HTTP/1.x 200 OKDate: Mon, 22 Sep 2009 09:39:26 GMTContent-Type: application/atomcat+xml

Page 50: Web Service Design with AtomPub

<?xml version="1.0"?><app:categories xmlns:app="http://www.w3.org/2007/app" xmlns:atom="http://www.w3.org/2005/Atom" fixed="yes" scheme="http://atom.example.com/cat/content"> <atom:category term="audio"/> <atom:category term="video"/> <atom:category term="game"/></app:categories>

Page 51: Web Service Design with AtomPub

Create the entry document locally

Page 52: Web Service Design with AtomPub

<?xml version="1.0" encoding="utf-8"?><entry xmlns="http://www.w3.org/2005/Atom" xml:base="http://atom.example.org/"> <title>Perfect</title> <author> <name>Mark Phelps</name> </author> <id>tag:example.org,2009:content/perfect</id> <published>2009-09-22T20:12:08Z</published> <category term="audio" scheme="http://atom.example.com/cat/content"/> <content type="application/mp4">TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFIHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGl... </content></entry>

Page 53: Web Service Design with AtomPub

POST /content HTTP/1.1Host: atom.example.orgContent-Type: application/atom+xml;type=entry

{body here}

HTTP/1.x 202 AcceptedDate: Mon, 22 Sep 2009 09:14:59 GMT

{body contains status indicator}

Page 54: Web Service Design with AtomPub

Authentication?

■ Atom doesn’t specify a preference

■ WSSE Username Token

■ OAuth

■ Basic authentication

■ ???

Page 55: Web Service Design with AtomPub

Did I miss anything?

Page 56: Web Service Design with AtomPub

Where’s the PHP code?

Oh, yeah.

Page 57: Web Service Design with AtomPub

■ Requires lots of parser code; either DOM or XMLReader/XMLWriter

■ No good AtomPub library that I like

■ Apache Abdera is good, but it’s in Java

■ I’m porting it to PHP:http://github.com/ramsey/AbderaPHP

Page 58: Web Service Design with AtomPub

Wrapping up…

Page 59: Web Service Design with AtomPub

■ You can extend Atom with other XML vocabularies (Dublin Core, etc.)

■ XML Digital Signature or XML Encryption may be used, or encrypt as a bag of bits

■ Use your preferred auth method

■ Use HTTP in a RESTful fashion

■ Use DOM or XMLReader/XMLWriter to parse Atom documents

Page 60: Web Service Design with AtomPub

Questions?

■ My website is benramsey.com

■ @ramsey on Twitter

■ Rate this talk at joind.in

■ Read the Atom specs attools.ietf.org/html/rfc4287tools.ietf.org/html/rfc5023

■ My company is Schematicschematic.com