<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?xml-stylesheet href="http://duncan-cragg.org/css/atom.css" type="text/css" ?>
<!-- Copyright (c) 2006 Duncan Cragg -->

<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-gb">
    <id>http://duncan-cragg.org/blog/</id>
    <title>What Not How - Posts tagged 'dialogue'</title>
    <subtitle>Duncan Cragg on Declarative Architectures</subtitle>
    <author><name>Duncan Cragg</name></author>
    <logo>/favicon.gif</logo>
    <icon>/favicon.ico</icon>
    <rights>All content including photos and images by Duncan Cragg. Copyright (c) Duncan Cragg, your rights preserved: see /CXL.html</rights>
    <generator uri="http://www.djangoproject.com">A Django Production.</generator>
    <link rel="alternate" type="text/html" href="http://duncan-cragg.org/blog/" title="What Not How" />
    <link rel="self" type="application/atom+xml" href="http://duncan-cragg.org/blog/atom/dialogue/" />

    <updated>2009-10-09T17:14:00Z</updated>


    <entry>
        <id>http://duncan-cragg.org/blog/post/forest-get-only-rest-integration-pattern/</id>
        <title>FOREST: a GET-only REST Integration Pattern</title>
        <published>2009-10-09T17:14:00Z</published>
        
        <updated>2009-10-11T11:46:00Z</updated>
        
        <link rel="alternate" type="text/html" href="http://duncan-cragg.org/blog/post/forest-get-only-rest-integration-pattern/" title="FOREST: a GET-only REST Integration Pattern" />
        
        <category term="architecture" />
        
        <category term="app" />
        
        <category term="dialogue" />
        
        <category term="rest" />
        
        <category term="rest-observer" />
        
        <category term="forest" />
        
        <summary type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">

<p>

Since the day in 2006 that our
<a href="http://duncan-cragg.org/blog/post/getting-data-rest-dialogues/">dialogue</a>
took place with <i>an imaginary eBay Architect</i>, he has been promoted to <i>imaginary
Enterprise Architect</i> in an investment bank!  Convinced by the merits of REST, he took
his enthusiasm for it into his new job and embarked on architecting a trading system
using REST or ROA as an alternative to SOA.
</p><p>
Now, he hit upon a snag: he had a REST &quot;bank server&quot; generating bids on an instrument
and POSTing them into that instrument&#39;s REST &quot;market server&quot;. But then <i>he had two
copies of his bid</i>! One held by the bank server on one URI, and the other in a &quot;bid
collection&quot; held by the market server&#39;s instrument - on another URI.
</p><p>
He asked himself: &quot;Which URI is the real one? Which host &#39;owns&#39; the bid? Is the market&#39;s
copy just a cache? If so, why does it have a new URI? Why doesn&#39;t the market host know
the URI of the bank&#39;s original bid? <i>Why can&#39;t servers become clients and just GET the
data that their own data depends upon?</i>&quot; The server seemed to be dominating the 
conversation, not letting its &#39;client&#39; server have a say in things.
</p><p>
Our worried Enterprise Architect noticed that such Service-Orientation permeated REST
practice: there were &quot;REST APIs&quot; to Web sites, or &quot;Web services&quot; with a small &#39;s&#39;. Even
AtomPub had a &quot;service document&quot;!  Some patterns, like AtomPub, offered just simple
read/write data services through the full HTTP method set. Some simply used such a
read/write interface as a wrapper around more complex service functions.
</p><p>
He wondered: &quot;Where&#39;s the Web in REST integration? The Web works great without PUT and
DELETE: isn&#39;t using GET on its own RESTful enough?&quot;
</p><p>
So, remembering something I said about &quot;Symmetric REST&quot;, he contacted me again...
 &#160; ...
</p>

            </div>
        </summary>
        <content type="xhtml" xml:space="preserve">
            <div xmlns="http://www.w3.org/1999/xhtml">

<p>
</p><div class="summary"><p>
Since the day in 2006 that our
<a href="http://duncan-cragg.org/blog/post/getting-data-rest-dialogues/">dialogue</a>
took place with <i>an imaginary eBay Architect</i>, he has been promoted to <i>imaginary
Enterprise Architect</i> in an investment bank!  Convinced by the merits of REST, he took
his enthusiasm for it into his new job and embarked on architecting a trading system
using REST or ROA as an alternative to SOA.
</p><p>
Now, he hit upon a snag: he had a REST &quot;bank server&quot; generating bids on an instrument
and POSTing them into that instrument&#39;s REST &quot;market server&quot;. But then <i>he had two
copies of his bid</i>! One held by the bank server on one URI, and the other in a &quot;bid
collection&quot; held by the market server&#39;s instrument - on another URI.
</p><p>
He asked himself: &quot;Which URI is the real one? Which host &#39;owns&#39; the bid? Is the market&#39;s
copy just a cache? If so, why does it have a new URI? Why doesn&#39;t the market host know
the URI of the bank&#39;s original bid? <i>Why can&#39;t servers become clients and just GET the
data that their own data depends upon?</i>&quot; The server seemed to be dominating the 
conversation, not letting its &#39;client&#39; server have a say in things.
</p><p>
Our worried Enterprise Architect noticed that such Service-Orientation permeated REST
practice: there were &quot;REST APIs&quot; to Web sites, or &quot;Web services&quot; with a small &#39;s&#39;. Even
AtomPub had a &quot;service document&quot;!  Some patterns, like AtomPub, offered just simple
read/write data services through the full HTTP method set. Some simply used such a
read/write interface as a wrapper around more complex service functions.
</p><p>
He wondered: &quot;Where&#39;s the Web in REST integration? The Web works great without PUT and
DELETE: isn&#39;t using GET on its own RESTful enough?&quot;
</p><p>
So, remembering something I said about &quot;Symmetric REST&quot;, he contacted me again...
</p></div><p>
</p><p>
<b>Enterprise Architect:</b> I see we made it into Appendix A of
<a href="http://oreilly.com/catalog/9780596529260/">the REST book</a>
by Richardson and Ruby!
</p><p>
<b>Duncan Cragg:</b> Indeed - even though I hadn&#39;t finished writing up our chat when it was
published...
</p><p>
<b>EA:</b> So why <i>did</i> it take you so long to write it up?
</p><p>
<b>DC:</b> Well, I, er, got distracted by
<a href="http://www2007.org/prog-Developers.php#saturday">Web 2.0</a> and
<a href="http://the-u-web.org/">Mobile 2.0</a>!
</p><p>
But I&#39;m back now, intending to focus more on ROA&#39;s advantages over SOA.
</p><p>
<b>EA:</b> Great! Because I wanted to talk to you about that.
</p><p>
Where I now work, we are looking at REST or ROA as an alternative to SOA. However, all the
available REST patterns still seem to see the world through Service-Oriented eyes.
</p><p>
I want to do REST like the Web does: to have different servers just publishing stuff that&#39;s
all linked up. And &quot;mashed up&quot;: to have that stuff, that data, &quot;over here&quot; depend on
that data &quot;over there&quot;: meaning that servers can be clients and vice-versa.
</p><p>
<b>DC:</b> Hyperdata that depends on someone else&#39;s hyperdata!  Maybe rewrite rules over
interlinked XHTML. 
</p><p>
I called it &quot;REST Observer&quot; back then, but
<a href="http://tech.groups.yahoo.com/group/rest-discuss/message/13266">recent events</a>
on the rest-discuss mailing list have left me very wary of using the word &#39;REST&#39; so
openly in the name of something!
</p><p>
So I decided to hide it within a different word: 
&#39;<a href="http://duncan-cragg.org/blog/post/forest-functional-observer-rest/">FOREST</a>&#39;!
</p><p>
Here is a 
<a href="http://tech.groups.yahoo.com/group/rest-discuss/message/13765">posting</a>
about FOREST that I recently made to the rest-discuss mailing list:
</p><p>&#160;</p><p>
<b>FOREST</b>
</p><p>
FOREST is a GET-only REST Integration Pattern defined simply as:
</p><p>
</p><blockquote class="others-content"><div><p>
A resource&#39;s state depends on the state of other resources that it links to.
</p></div></blockquote><p>
</p><p>
This means that resource servers must also be clients in order to see those dependencies.
</p><p>&#160;</p><p>
<b>Common Web Pattern</b>
</p><p>
FOREST is a REST Pattern derived from GET-only or polling Web use-cases, including mashups:
</p><p>
</p><ul>
<li>feed aggregators or filters</li>
<li>search index results pages</li>
<li>pages that depend on a search</li>
<li>Google&#39;s mobile versions of pages</li>
<li>sites that create summaries of other Web pages</li>
<li>sites that create feeds from Web pages</li>
<li>creating pages or feeds from REST &#39;APIs&#39; (GET only)</li>
<li>Yahoo Pipes</li>
</ul><p>
</p><p>&#160;</p><p>
<b>Going Enterprisey</b>
</p><p>
FOREST is a REST Pattern for building &quot;Enterprise Mashups&quot; in an ROA / WOA / SOA.
</p><p>
OK - those of you without Dion Hinchcliffe in your feed reader may be feeling a little
queasy at this point, but I&#39;d encourage you to read on ... Actually, I quite like the
phrase &quot;Enterprise Mashup&quot; since it lightens the gravity of that &#39;Enterprise&#39; word.
</p><p>
<a href="http://www.openmashup.org/omadocs/v1.0/emml/createMashupScript.html">Enterprise Mashup Markup Language</a>
is the nearest thing to this that I know about, but FOREST is quite different: it is
much simpler and is /only/ a REST Pattern.
</p><p>&#160;</p><p>
<b>Patterns can be implemented in frameworks...</b>
</p><p>
A FOREST implementation would inevitably be over HTTP. It would initially be just XHTML
or Atom. I imagine fetching XHTML resources within which are expected to be links to
more such documents. Any XHTML could depend on any other, and they&#39;re all interlinked.
If you depend on another resource, you must have found it directly or indirectly through
links in your body. Alternative discovery: a resource could be told that it is being
watched using an HTTP header in the GET request listing the URIs of the resources that
depend on it - then it could watch and link back.  Etag would be used for an
automatically incremented version number.
</p><p>&#160;</p><p>
<b>Rough Consensus and Working Code</b>
</p><p>
I would ideally see this work towards a formal description via &quot;rough consensus and
working code&quot;. I intend to knock up a prototype of FOREST in a Jetty servlet and post it
to GitHub; if that code works, I may get rough consensus...
</p><p>
What a FOREST XHTML/HTTP formalisation would specify: <i>Updated</i>
</p><p>
</p><ul>
<li>use of HTTP headers (Etag, Cache-Control, Content-Location, Referer*)</li>
<li>API*: doc builder, XPath body set/get*, callbacks (observed, notified*)</li>
</ul><p>
Notes (*):
</p><ul>
<li>&#39;Referer&#39; is a possible header for the URIs of dependent resources</li>
<li>the API would be language-independent, but probably Java-like</li>
<li>the XPath &#39;get&#39; would be extended to jump links from doc to doc</li>
<li>every doc jumped to gets observed</li>
<li>&#39;notified&#39; means being told when the GET returns with the observed state</li>
</ul><p>
</p><p>&#160;</p><p>
What a FOREST Java servlet and client library would implement &#39;under&#39; these specs:
</p><p>
</p><ul>
<li>a driver module loader: drivers animate resources through the API</li>
<li>a document cache - in memory and maybe saved to disk or database</li>
</ul><p>
</p><p>
Resource animation would either be by the application of business rules driving the API,
or by adapting between external state and the API.
</p><p>&#160;</p><p>
<b>Amazing</b>
</p><p>
<b>EA:</b> Wow! That&#39;s amazing! Can I help build it?
</p><p>
<b>DC:</b> Of course you can. Know any Java?
</p><p>

</p>

            </div>
        </content>
    </entry>
    
    <entry>
        <id>http://duncan-cragg.org/blog/post/web-objects-ask-they-never-tell-rest-dialogues/</id>
        <title>Web Objects Ask, They Never Tell | The REST Dialogues</title>
        <published>2009-08-13T11:43:00Z</published>
        
        <updated>2009-08-13T11:43:00Z</updated>
        
        <link rel="alternate" type="text/html" href="http://duncan-cragg.org/blog/post/web-objects-ask-they-never-tell-rest-dialogues/" title="Web Objects Ask, They Never Tell | The REST Dialogues" />
        
        <category term="semanticweb" />
        
        <category term="architecture" />
        
        <category term="declarative" />
        
        <category term="publishsubscribe" />
        
        <category term="p2p" />
        
        <category term="app" />
        
        <category term="microformats" />
        
        <category term="dialogue" />
        
        <category term="event-driven" />
        
        <category term="rest" />
        
        <category term="scalability" />
        
        <category term="rest-observer" />
        
        <summary type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">

<p>

In an exclusive nine-part dialogue with <i>an imaginary eBay
Architect</i>, we present an accessible discussion of the 
REST vs. SOA issue.
</p><p>
Although eBay have what they call a &#39;REST&#39; interface, it is, in
fact, a 
<a href="http://duncan-cragg.org/blog/post/strest-service-trampled-rest-will-break-web-20/">STREST</a>
interface, and only works for a few of the many function calls
that they make available via SOAP.
</p><p>
In this <a href="http://duncan-cragg.org/blog/post/getting-data-rest-dialogues/">dialogue series</a>,
I argue the case for eBay to adopt a truly REST approach to
their integration API. 
</p><p>
<b>Part 9: Web Objects Ask, They Never Tell</b>
 &#160; ...
</p>

            </div>
        </summary>
        <content type="xhtml" xml:space="preserve">
            <div xmlns="http://www.w3.org/1999/xhtml">

<p>
</p><div class="summary"><p>
In an exclusive nine-part dialogue with <i>an imaginary eBay
Architect</i>, we present an accessible discussion of the 
REST vs. SOA issue.
</p><p>
Although eBay have what they call a &#39;REST&#39; interface, it is, in
fact, a 
<a href="http://duncan-cragg.org/blog/post/strest-service-trampled-rest-will-break-web-20/">STREST</a>
interface, and only works for a few of the many function calls
that they make available via SOAP.
</p><p>
In this <a href="http://duncan-cragg.org/blog/post/getting-data-rest-dialogues/">dialogue series</a>,
I argue the case for eBay to adopt a truly REST approach to
their integration API. 
</p><p>
<b>Part 9: Web Objects Ask, They Never Tell</b>
</p></div><p>
</p><p>
<b>eBay Architect:</b> You&#39;ve pushed a lot of responsibility up to the business logic and
away from the distribution technologies - away from the HTTP level.
</p><p>
As I understand it, you only want to use HTTP to implement a distributed Observer
Pattern, where clients can become servers?
</p><p>
<b>Duncan Cragg:</b> Indeed. REST can be symmetric when used in integration outside of the
Web. Further, these server-clients can have resources that do their <i>own</i> GET-ing,
with POST <i>callbacks</i>, in order to Observe other resources. I&#39;ve given many examples
of this style.
</p><p>
<b>eA:</b> So how do you program such a distributed system at the business logic level?
</p><p>
<b>DC:</b> Well you need to be able to easily express that the state of a resource depends
on the latest state - the intentions and declarations - of other resources it is Observing.
</p><p>
My vision is that you would express this business logic in a simple, powerful and
expressive declarative language.
</p><p>
<b>eA:</b> Hmmm.. Just try getting all declarative on someone who just wants his share prices
on time!  No-one in business understands such abstract concepts.
</p><p>
<b>DC:</b> Oh no? The favourite programming tool of business is the spreadsheet! 
</p><p>
And HTML is a form of declarative programming: imagine if you had to 
<a href="http://duncan-cragg.org/blog/post/right-way-to-do-ajax-is-declaratively/#comment-507">build your DOM</a>
from the top using Javascript! Or if you had to set all your styles in Javascript
instead of using declarative CSS!
</p><p>
<b>eA:</b> Well I&#39;ve seen some pretty ghastly examples of <i>those</i> two crafts! 
</p><p>
And many failed attempts to allow non-programmers or business analysts to program
directly.
</p><p>
<b>DC:</b> True, but that doesn&#39;t change the fact that most non-programmers can only 
think declaratively - they know What they want, but they haven&#39;t got much of a clue How
to get it.
</p><p>
Business people talk business rules and business data.
</p><p>
<b>eA:</b> We just can&#39;t program with them!
</p><p>
<b>DC:</b> Well, perhaps we just haven&#39;t found the best discipline of pragmatic formalisms
and methodology that will allow those rules to easily become programs.
</p><p>
It&#39;s a 
<a href="http://duncan-cragg.org/blog/post/right-way-to-do-ajax-is-declaratively/">well-supported claim</a>,
though, that declarative programming is simpler, clearer and more productive than imperative.
</p><p>
<b>eA:</b> OK - so how would you actually define these business rules?
</p><p>
<b>DC:</b> You could use a rules engine, or a DSL engine, or even XSLT - if that works for
you. There are 
<a href="http://en.wikipedia.org/wiki/XML_transformation_language">many ways to transform XML</a>.
</p><p>
<b>eA:</b> How would <i>you</i> do it?
</p><p>
<b>DC:</b> I would like to have an XML rewriting and templating system: &quot;if this XPath
or XML template matches Observed XML resource A, this one matches resource B and this
one matches myself, rewrite this and that bit of myself with these bits from A and B&quot;.
</p><p>&#160;</p><p>
<b>Web Objects Ask, They Never Tell</b>
</p><p>
<b>eA:</b> So you want to go around re-creating huge XML documents all the time?
</p><p>
<b>DC:</b> Who said anything about huge? This is another Web thing that doesn&#39;t necessarily
apply to us in REST integration: we don&#39;t need the equivalent of the giant, monolithic
HTML page. We can work in much smaller chunks.
</p><p>
I&#39;d even just call them &#39;objects&#39; rather than resources. Or &#39;Web objects&#39;, if you like. 
</p><p>
They could be little 
<a href="http://duncan-cragg.org/blog/post/content-types-and-uris-rest-dialogues/">XHTML carriers of Microformats</a>.
</p><p>
<b>eA:</b> I thought we&#39;d given up on distributing fine-grained objects back in the 
CORBA days?
</p><p>
<b>DC:</b> Ah, but this isn&#39;t trying to transparently distribute zillions of method 
calls in an RPC model. 
</p><p>
This is about optimising state transfer. Only send what you need, cache where you can,
push when something changes. Separate your data by rate of change, timeliness, cacheability.
</p><p>
<b>eA:</b> So these Web objects don&#39;t have any methods?  Because that would be RPC when
distributed?
</p><p>
<b>DC:</b> Exactly. In REST integration, the Web objects Ask, they never Tell! These Web
objects are reactive: Asking for public state, not Telling each other what to do.
</p><p>
<b>eA:</b> You mean the opposite of
<a href="http://www.pragprog.com/articles/tell-dont-ask">Tell Don&#39;t Ask</a>?
</p><p>
<b>DC:</b> Yes. As an object, you don&#39;t Tell another object How to do something, you Ask for
What you want by either simply Observing its public state or by it Observing yours, then
letting it decide How to evolve by itself. You then watch it and react or interact.
</p><p>
It&#39;s the &quot;imperative to declarative inversion&quot;: everything is turned upside-down or
inside-out when you distribute things this way!
</p><p>
<b>eA:</b> Oh yes, your &quot;inevitable inversion&quot; thing.
</p><p>
<b>DC:</b> Another indication of this inversion from the imperative object-oriented world
to the declarative ROA world is how the derided &#39;train wrecks&#39; of object-orientation now
become the essential XPaths of the object Web. 
</p><p>
You could say we have no methods, only &#39;getters&#39;, and XPath &#39;train wrecks&#39; are encouraged!
</p><p>
<b>eA:</b> Doesn&#39;t sound too safe to me - it breaks encapsulation, doesn&#39;t it?
</p><p>
<b>DC:</b> Well, it&#39;s actually safe to dig around, since the data is held in shape by a
stable, open, public schema.  You&#39;re expected to go traversing the tree.
</p><p>
And you get excellent encapsulation since Web objects are total masters of their own
destiny: they privately control the evolution of that public state. 
</p><p>
You very much retain the value of &#39;What not How&#39;; in fact, in a much better-defined way
since it&#39;s fundamentally baked in to the programming model.
</p><p>&#160;</p><p>
<b>Hyperdata as the Engine of Object State</b>
</p><p>
<b>eA:</b> But when you write &#39;train wrecks&#39; you often end up jumping from object to
object. How do your object Web XPaths do that, assuming they want to?
</p><p>
<b>DC:</b> <a href="http://en.wikipedia.org/wiki/Hyperdata">Hyperdata</a> of course! Links to links
around the Web. Objects can have their opaque UUIDs or GUID object handles encoded into
their URIs. Then objects can be wired up with XHTML links.
</p><p>
<b>eA:</b> So now your XPath transparently jumps these links?!
</p><p>
<b>DC:</b> Actually, yes! That would then allow us to dynamically break up data into more
manageable chunks without breaking the XPaths that traverse it.  
</p><p>
Also, with this approach, you still get to drill down to data like in transparent URI
paths, but you now use XPaths that are properly a part of the content layer, jumping
transparently <i>over</i> those opaque inter-object URIs.
</p><p>
<b>eA:</b> Would you use these &#39;jumping XPaths&#39; in the rewrite rules you said you wanted?
</p><p>
<b>DC:</b> Of course. Either linear XPaths, or XPath-like XML tree templates on the
left-hand side of a rewrite rule. 
</p><p>
You&#39;d start a template match on yourself, then continue on to match other objects by
jumping over links, then on and on from object to object.
</p><p>
<b>eA:</b> So I suppose any such jump to another object means you then need to start
Observing it, right?
</p><p>
<b>DC:</b> Exactly. And if hyperlinks are the only way you can find other objects to
Observe, it brings us to the following:
</p><p>
<i>Your object&#39;s next public state depends only on its current public state and the states
of those objects that are visible to it through hyperlinks.</i>
</p><p>
<b>eA:</b> Sounds a bit like the &quot;Hypertext As The Engine Of Application State&quot; constraint
of REST.
</p><p>
<b>DC:</b> Exactly! Except now that we&#39;re doing REST symmetrically - now that clients can
be servers, too - client Application State can have its own URIs!
</p><p>
<b>eA:</b> So you could re-phrase this as the even more intimidating: &quot;Hyper<i>data</i> As The
Engine Of Application <i>Resource</i> State&quot;!
</p><p>
<b>DC:</b> Well - how about just &quot;Hyperdata As The Engine Of Object State&quot;?!
</p><p>
<b>eA:</b> So do I have to wait for this link-jumping XML rewrite engine of yours to
express my business logic, in order to get &quot;Hyperdata As The Engine Of Object State&quot;?
</p><p>
<b>DC:</b> No, of course not! Use a nice, dynamic, XML-talking language, like Scala, and
follow the same principle, perhaps using a DSL.
</p><p>
<b>eA:</b> Can&#39;t you have objects that <i>aren&#39;t</i> entirely dependent on others? Like those
that represent external state?
</p><p>
<b>DC:</b> Of course. That&#39;s normal Web stuff. It&#39;s probably best to keep these &#39;pure&#39;: to
have either fully-interdependent objects driven by Hyperdata, or fully externally-driven
ones.
</p><p>&#160;</p><p>
<b>Class, Extension, Instance and Behaviour</b>
</p><p>
<b>eA:</b> Right, so we&#39;ve got these little Web-mapped XHTML Microformat objects all linked
up and watching each other in an Observer Pattern. This object&#39;s state depends on that
linked object&#39;s state according to rewrite rules or a DSL.
</p><p>
So taking this mapping to objects one last step, I presume object &#39;class&#39; maps onto an XML
schema, XHTML Microformat specification or other content type?
</p><p>
<b>DC:</b> Yes. A public grammar in some form. Domain or business classes only, of course,
not low-level classes.
</p><p>
<b>eA:</b> So, does each standard Web object class or type have a standard set of rules
guiding its evolution or behaviour?
</p><p>
<b>DC:</b> Yes. If you see something and recognise its type, you can attempt to interact
with it according to its public specification, and it should, but needn&#39;t, react.
</p><p>
The public specification can define the expected behaviour in the RFC language of MUST
and SHOULD, like AtomPub. Or it can define it in rewrite rules!
</p><p>
<b>eA:</b> So then, how do I add my own business rules to a content type or &#39;class&#39;, if its
behaviour is standardised and meant to be stable and predictable?
</p><p>
<b>DC:</b> There are two ways you can make use of a generic standard, and both are forms of
layering or abstraction: 
</p><p>
You can &#39;mash up&#39; standard component instances with declarative configuration - just
using them as they are for your domain.
</p><p>
Alternatively, you can extend or subclass their standard structures and behaviour to
become themselves more domain-specific.  For example, rules can be overridden or their
right-hand sides merged.
</p><p>
Again, think of how AtomPub can be <i>used</i> in any domain that looks like time-ordered lists
of content; and how you can <i>extend</i> AtomPub without breaking unextended clients or servers.
</p><p>&#160;</p><p>
<b>The REST Observer Pattern</b>
</p><p>
<b>eA:</b> I think you need a memorable name for your symmetric-REST, &quot;Hyperdata As The
Engine Of Object State&quot; architectural style!
</p><p>
<b>DC:</b> How about the &quot;REST Observer Pattern&quot;?
</p><p>
<b>eA:</b> But a Pattern has to be a retro-fit to existing behaviour, and &quot;REST Observer&quot;
is quite new.
</p><p>
<b>DC:</b> I mean REST .. [<i>DC does double bunnie ears</i>] &quot;Observer Pattern&quot;!
</p><p>
<b>eA:</b> Have you got any worked examples of the REST Observer Pattern?
</p><p>
<b>DC:</b> Will have soon...
</p><p>
<i>(c) 2006-2009 Duncan Cragg</i>
</p><p>&#160;</p><p>
Coming soon: Worked examples of the REST Observer Pattern.
</p><p>
<i>Note that the opinions of our imaginary eBay Architect don&#39;t
necessarily represent or reflect in any way the official
opinions of eBay or the opinions of anyone at eBay.</i>
</p><p>
<i>Indeed, I can&#39;t guarantee that the opinions of our real blogger
necessarily represent or reflect in any way the official
opinions of Roy Fielding...</i>

</p>

            </div>
        </content>
    </entry>
    
    <entry>
        <id>http://duncan-cragg.org/blog/post/ws-are-you-sure-rest-dialogues/</id>
        <title>WS-Are-You-Sure | The REST Dialogues</title>
        <published>2009-07-16T16:16:00Z</published>
        
        <updated>2009-07-16T16:16:00Z</updated>
        
        <link rel="alternate" type="text/html" href="http://duncan-cragg.org/blog/post/ws-are-you-sure-rest-dialogues/" title="WS-Are-You-Sure | The REST Dialogues" />
        
        <category term="architecture" />
        
        <category term="declarative" />
        
        <category term="publishsubscribe" />
        
        <category term="p2p" />
        
        <category term="app" />
        
        <category term="dialogue" />
        
        <category term="event-driven" />
        
        <category term="rest" />
        
        <category term="atom" />
        
        <summary type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">

<p>

In an exclusive nine-part dialogue with <i>an imaginary eBay
Architect</i>, we present an accessible discussion of the 
REST vs. SOA issue.
</p><p>
Although eBay have what they call a &#39;REST&#39; interface, it is, in
fact, a 
<a href="http://duncan-cragg.org/blog/post/strest-service-trampled-rest-will-break-web-20/">STREST</a>
interface, and only works for a few of the many function calls
that they make available via SOAP.
</p><p>
In this <a href="http://duncan-cragg.org/blog/post/getting-data-rest-dialogues/">dialogue series</a>,
I argue the case for eBay to adopt a truly REST approach to
their integration API. 
</p><p>
<b>Part 8: WS-Are-You-Sure (Security, Reliable Messaging and Transactions)</b>
 &#160; ...
</p>

            </div>
        </summary>
        <content type="xhtml" xml:space="preserve">
            <div xmlns="http://www.w3.org/1999/xhtml">

<p>
</p><div class="summary"><p>
In an exclusive nine-part dialogue with <i>an imaginary eBay
Architect</i>, we present an accessible discussion of the 
REST vs. SOA issue.
</p><p>
Although eBay have what they call a &#39;REST&#39; interface, it is, in
fact, a 
<a href="http://duncan-cragg.org/blog/post/strest-service-trampled-rest-will-break-web-20/">STREST</a>
interface, and only works for a few of the many function calls
that they make available via SOAP.
</p><p>
In this <a href="http://duncan-cragg.org/blog/post/getting-data-rest-dialogues/">dialogue series</a>,
I argue the case for eBay to adopt a truly REST approach to
their integration API. 
</p><p>
<b>Part 8: WS-Are-You-Sure (Security, Reliable Messaging and Transactions)</b>
</p></div><p>
</p><p>
<b>Duncan Cragg:</b> So, back to your list of Enterprise functions. We&#39;re on to what I&#39;m
going to call the &#39;WS-Are-You-Sure&#39;: Security, Reliable Messaging and Transactions.
</p><p>
Let&#39;s attack these <a href="http://www.coactus.com/blog/2007/01/starting-with-the-web/">Starting with the Web</a>!
</p><p>
<b>eBay Architect:</b> We could start with Security: authentication, authorisation and
encryption.  For example, you have to keep some information secret on eBay.  Like
Invoices, Offer details. Reserve price on an Item. And you have to ensure only the
owners of data can change it.
</p><p>
<b>DC:</b> The simplest pattern for read security is to use 
<a href="http://tools.ietf.org/html/rfc2617">HTTP Basic Authentication</a> over 
<a href="http://tools.ietf.org/html/rfc2246">TLS</a> - following 
<a href="http://tools.ietf.org/html/rfc2818">HTTPS</a>.  Simple, but well-supported
and usually good enough. 
</p><p>
But with HTTPS you lose some of the benefits of using intermediaries, such as cacheing.
If those intermediaries are untrustworthy, then you can use message-level rather than
transport-level security: encrypt the resource state being transferred.
</p><p>
<b>eA:</b> Can&#39;t I use WS-Security for this?
</p><p>
<b>DC:</b> <a href="http://www.isecpartners.com/files/iSEC_HILL_AttackingXMLSecurity_bh07.pdf">Possibly</a>(PDF)!
However, the benefits of cacheing may be lost in the time taken to package and unpackage
each resource in turn. You may prefer a
<a href="http://www.wanderingbarque.com/nonintersecting/?year=2007&amp;monthnum=05&amp;day=25&amp;name=message-level-security-and-rest">more lightweight approach</a>
as suggested in the <a href="http://tools.ietf.org/html/rfc4287">Atom</a>
and <a href="http://tools.ietf.org/html/rfc5023">AtomPub</a> specs.
</p><p>
<b>eA:</b> How does REST handle authorisation: such as read and write permissions?
</p><p>
<b>DC:</b> As I keep saying, REST is about much more than simple data read/write services.
In REST we don&#39;t have the generic concept of authorisation on a specific process
execution, such as a command that could cause state change. 
</p><p>
REST infrastructure is about state transfer, which is thus really only about &#39;read permissions&#39;.
</p><p>
Everything else is business logic: it&#39;s up to the target resource to manage its reaction
to incoming non-GETs and to decide if or how it should change in response, according to
internal integrity constraints and the identity of the source.  Resources are masters of
their own destiny and must be aware of the identity of interacting parties at that level.
</p><p>
<b>eA:</b> What <i>can</i> you do to secure the infrastructure level below the business logic?
</p><p>
<b>DC:</b> The department managing the infrastructure can see data going either out (GET)
or in (POST), and can see the target URIs. They can thus do both server- (URI) and
client- (request header) based security and partitioning.
</p><p>
For read permission, it&#39;s possible to implement a low-level lookup from the identity
in the request header to whatever URIs they can GET.  They can enforce simple rules at
that level like &#39;only GETs are allowed on these URIs unless the client is in this list&#39;.
They can groom more and less sensitive traffic to different servers.
</p><p>
<b>eA:</b> Any more Security advice?
</p><p>
<b>DC:</b>  Paul Prescod has written some
<a href="http://www.prescod.net/rest/security.html">notes on REST security</a>.
</p><p>
Finally, remember to keep sensitive data out of those highly-propagatable unencrypted
URIs by using POST instead of GET when submitting queries; another reason to use URIs
that are literally opaque, not just treated as opaque operationally.
</p><p>&#160;</p><p>
<b>Reliable Messaging</b>
</p><p>
<b>eA:</b> Another of the WS-* specifications deals with Reliable Messaging. How does REST
give me the assurances I need that an important message - such as a new Offer on an Item
or a ResponseToBestOffer, or an Invoice - will be delivered? In the right order? I can&#39;t
just rely on POST, as you suggested before, if I really care about this.
</p><p>
<b>DC:</b> In REST, there are no command messages that have to make it through. There&#39;s
only state that may or may not need to be reliably transferred - or that may or may not
need to be notified in a timely manner.
</p><p>
In the eBay example, as I 
<a href="http://duncan-cragg.org/blog/post/business-functions-rest-dialogues/">described it before</a>,
&quot;if you keep re-POSTing the same Invoice, or Item or Offer, it only gets created once&quot;.
</p><p>
<b>eA:</b> Ah! Define &#39;same&#39;!
</p><p>
<b>DC:</b> If, as in this eBay example, the successful POST creates a server-side copy with
its own new URI, then the Item, Invoice, etc, must have some uniquely identifying
information on it. It could perhaps have a
<a href="http://devhawk.net/2007/12/05/Durable+And+RESTful.aspx">Message-ID header</a> or
get <a href="http://www.prescod.net/reliable_http.html">cheap, unique URIs minted for it</a>
from the server in advance.  Alternatively, when the POSTed resource already has a URI
itself on the &#39;client&#39;, then it&#39;s obviously the same each time it&#39;s POSTed.
</p><p>
When used as state notification, POST must be idempotent; repeatable.
</p><p>
So if the initial POST fails, just keep POSTing until you can see the appropriate
response, whatever that may be in business terms. On the pull or poll side, keep GETing
until you see what you expect.
</p><p>
<b>eA:</b> So that&#39;s another issue you&#39;re side-stepping by dumping it into the business
logic?!
</p><p>
<b>DC:</b> Only the business logic knows the following things: what signifies receipt of
the notification; if it matters that the state didn&#39;t get through; how frequently to
push or poll; whether it matters that state is out of date and by how much; and when to
give up and tell someone.
</p><p>
Set the push or pull frequency and total number according to the business logic&#39;s view
of the importance of that state transfer.  Set cache control according to your domain&#39;s
tolerance of stale data.
</p><p>
It&#39;s just like in real life: if something I sent doesn&#39;t get a response - in a form that
is completely dependent on the type of recipient - then, after a time - which is also
completely dependent on the type of recipient - I&#39;ll chase it up.
</p><p>
<b>eA:</b> Can&#39;t REST give any support here at all?
</p><p>
<b>DC:</b> Well, it would be easy enough to write a REST support library that implemented a
simple API for specifying your constraints on a successful state transfer.
</p><p>&#160;</p><p>
<b>Transactions</b>
</p><p>
<b>eA:</b> Now, when you&#39;re a site like eBay, dealing with money all the time, you need the
assurance that transactions give you. You need to make sure accounts are always
consistent. But I suppose, like
<a href="http://duncan-cragg.org/blog/post/inter-enterprise-rest-integration-rest-dialogues/">before</a>,
you&#39;re going to tell me that it&#39;ll all be fine in the end, right?
</p><p>
<b>DC:</b> Hold on. Let&#39;s not mix up financial transactions and database transactions!
We&#39;ll first talk about the need for atomic units of work.  Then see how to support
financial transaction business logic. 
</p><p>
Also, we&#39;re talking about units of work in public view, not hidden behind resources.
Inside, it&#39;s up to a resource to ensure that its integrity and consistency are
maintained through its interactions with others, and it&#39;s free to use transactions to 
achieve that internally if it wants, without exposing that to its clients.
</p><p>
<b>eA:</b> OK - so now say that it&#39;ll all be fine in the end!
</p><p>
<b>DC:</b> In a distributed system, you have to decide on what to give up out of 
<a href="http://queue.acm.org/detail.cfm?id=1394128">Consistency, Availability and Partition Tolerance</a>.
</p><p>
I have to say that eBay are actually fully clued here: that was a paper about &#39;BASE&#39; by
<a href="http://www.addsimplicity.com/">Dan Pritchett</a>, Technical Fellow at eBay, in which he
discusses the benefits of
<a href="http://www.infoq.com/news/2008/01/consistency-vs-availability">Eventual Consistency</a> - 
i.e., knowing that it&#39;ll all be fine in the end! Especially if you
<a href="http://glinden.blogspot.com/2006/12/talk-on-ebay-architecture.html">tidy things up eventually</a>.
</p><p>
<b>eA:</b> Gah! Ya got me there!
</p><p>
<b>DC:</b> Essentially, the rule of thumb is, use ACID internally, use BASE externally.
</p><p>
We&#39;re back to the inevitable inversion from internal imperative thinking to external
declarative thinking.  
</p><p>
As an imperative programmer you&#39;re inclined to want to take your internal programming
style out into the distributed world - to think single-thread, central control: &#39;begin - do
work - commit&#39;.
</p><p>
But the importance of Availability and Partition Tolerance in distributed systems
usually outweighs the importance of Consistency, leading the wise architect to a more
relaxed, less imperative, more declarative approach.
</p><p>
<b>eA:</b> Such as REST.
</p><p>
<b>DC:</b> Indeed. REST without
<a href="http://www.jboss.org/community/wiki/TransactionalsupportforJAXRSbasedapplications">transaction support</a>.
</p><p>
REST isn&#39;t a database model: in the same way REST doesn&#39;t imply simple read/write
services, it also doesn&#39;t imply inert data that needs locking. And resources in REST
should model active domain data, not low-level, domain-independent 
<a href="http://www.rgoarchitects.com/nblog/2009/06/15/TransactionsAreBadForREST.aspx">transaction paraphenalia</a>.
</p><p>
<b>eA:</b> How does REST without transactions work, BASE-ically, then?
</p><p>
<b>DC:</b> A handy phrase that sums it up is <i>intention puts the system in tension</i>.
</p><p>
You start by declaring your intention that some state be true, which puts the system in
tension - a tension that can only be resolved by the application of business logic
constraints over each player in parallel, until the whole system settles or resolves
into a new, consistent state.
</p><p>
<b>eA:</b> Examples, please!
</p><p>
<b>DC:</b> Think about how you&#39;d do the classic transfer of funds between accounts, in the
real world of loosely interacting, self-determined parties. Say inside a big company 
before computers came along, between an office that handles one account and an office
that handles the other.  
</p><p>
Your key resource is a signed declaration (the intention) by the payer that they are
happy to have funds passed to the payee. As long as this fact doesn&#39;t appear in one
account or the other, you have work to do (there is tension in the business rules). 
</p><p>
<b>eA:</b> You&#39;ve got to run around real quick with a piece of paper.
</p><p>
<b>DC:</b> It doesn&#39;t even need to happen all at the same time: you can visit one office,
check the funds are available and deduct the amount, then wander over to the other
office and tell them to increase the payee&#39;s balance. If you get waylaid and the
auditors come, there is always the signed declaration and the account history available
to resolve the situation.
</p><p>
You can enforce the constraint that no money appears to be in two places with the
business rule that the payee account is only increased if the payer&#39;s account has an
entry corresponding to the signed declaration.
</p><p>
<b>eA:</b> Mmm. Sounds a bit too loosely coupled to me.
</p><p>
<b>DC:</b> It&#39;s life outside of Central Control. 
</p><p>
Consider hotel and flight booking: you don&#39;t lock the hotel and the flight while telling
them all in a two-phase commit what your itinerary will be. You do &#39;optimistic locking&#39;
with compensation: if things don&#39;t work out, you cancel a booking. A system may tell you
something is available, but when it comes to booking it may have just been taken.
</p><p>
The real, distributed, reactive world doesn&#39;t work in a lock-step fashion, so our
distributed, reactive systems don&#39;t need to work that way to model it. Reality is much
more like optimistic locking with the possibility of compensation or merge on conflict
that, again, can only be defined at the business level.
</p><p>
<b>eA:</b> Why not do your optimistic locking below that? HTTP has support for it, right?
</p><p>
<b>DC:</b> In the same way that REST can support read permissions but is at the wrong level
for write permissions, which are a business level concern, there is an asymmetry in read
versioning versus write versioning.
</p><p>
While using Etags is great for optimising the reading and cacheing of data, I wouldn&#39;t
use them in the optimistic locking pattern for writes that is supported by HTTP.  The
proper place for handling a mismatch of versions in an interaction is not in the HTTP
headers.  
</p><p>
REST should be about state declaration and intention, not absolute write commands. Only
the business logic governing the evolution of a resource knows if, for example, it can
go ahead and respond anyway to an edit request, even though it&#39;s possible that the sender
has an out-of-date copy of it.
</p><p>
<i>(c) 2006-2009 Duncan Cragg</i>
</p><p>&#160;</p><p>
In Part 9: <a href="http://duncan-cragg.org/blog/post/web-objects-ask-they-never-tell-rest-dialogues/">Web Objects Ask, They Never Tell</a>
</p><p>
<i>Note that the opinions of our imaginary eBay Architect don&#39;t
necessarily represent or reflect in any way the official
opinions of eBay or the opinions of anyone at eBay.</i>
</p><p>
<i>Indeed, I can&#39;t guarantee that the opinions of our real blogger
necessarily represent or reflect in any way the official
opinions of Roy Fielding...</i>

</p>

            </div>
        </content>
    </entry>
    
    <entry>
        <id>http://duncan-cragg.org/blog/post/business-conversations-rest-dialogues/</id>
        <title>Business Conversations | The REST Dialogues</title>
        <published>2008-12-11T11:45:00Z</published>
        
        <updated>2008-12-11T11:45:00Z</updated>
        
        <link rel="alternate" type="text/html" href="http://duncan-cragg.org/blog/post/business-conversations-rest-dialogues/" title="Business Conversations | The REST Dialogues" />
        
        <category term="architecture" />
        
        <category term="declarative" />
        
        <category term="strest" />
        
        <category term="app" />
        
        <category term="dialogue" />
        
        <category term="event-driven" />
        
        <category term="rest" />
        
        <summary type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">

<p>

In an exclusive nine-part dialogue with <i>an imaginary eBay
Architect</i>, we present an accessible discussion of the 
REST vs. SOA issue.
</p><p>
Although eBay have what they call a &#39;REST&#39; interface, it is, in
fact, a 
<a href="http://duncan-cragg.org/blog/post/strest-service-trampled-rest-will-break-web-20/">STREST</a>
interface, and only works for a few of the many function calls
that they make available via SOAP.
</p><p>
In this <a href="http://duncan-cragg.org/blog/post/getting-data-rest-dialogues/">dialogue series</a>,
I argue the case for eBay to adopt a truly REST approach to
their integration API. 
</p><p>
<b>Part 7: Business Conversations</b>
 &#160; ...
</p>

            </div>
        </summary>
        <content type="xhtml" xml:space="preserve">
            <div xmlns="http://www.w3.org/1999/xhtml">

<p>
</p><div class="summary"><p>
In an exclusive nine-part dialogue with <i>an imaginary eBay
Architect</i>, we present an accessible discussion of the 
REST vs. SOA issue.
</p><p>
Although eBay have what they call a &#39;REST&#39; interface, it is, in
fact, a 
<a href="http://duncan-cragg.org/blog/post/strest-service-trampled-rest-will-break-web-20/">STREST</a>
interface, and only works for a few of the many function calls
that they make available via SOAP.
</p><p>
In this <a href="http://duncan-cragg.org/blog/post/getting-data-rest-dialogues/">dialogue series</a>,
I argue the case for eBay to adopt a truly REST approach to
their integration API. 
</p><p>
<b>Part 7: Business Conversations</b>
</p></div><p>
</p><p>
<b>eBay Architect:</b> Now, I have a few more questions about the areas where REST is
generally considered to be weaker than SOA.  I&#39;ll start with a big list, then we can go
through each one. 
</p><p>
<b>Duncan Cragg:</b> OK, go ahead!
</p><p>
<b>eA:</b> Right - it&#39;s basically the list of techniques you need to architect complex
distributed applications: Service Discovery, Service Description, Client/Server Session
State, Business Process Coordination, Workflow, Orchestration, Choreography; Security,
Reliable Messaging and Transactions.
</p><p>
<b>DC:</b> Phew! Well, some of these 
<a href="http://en.wikipedia.org/wiki/Begging_the_question">beg the question</a>;
by assuming you need them, you end up concluding that you need SOA!
</p><p>
Also, seeing WS-standards for these things, some people think that SOA has them covered
and that their work is done.  But you still have to design and architect your system on
top of these standards, to meet the business need.
</p><p>
In REST or ROA, we&#39;re talking about a different way of seeing distributed
systems that requires a break from Service- (and even Object-)
Oriented thinking and an embrace of Resource-Oriented thinking. 
</p><p>
<b>eA:</b> So what&#39;s the REST way of approaching my list?
</p><p>
<b>DC:</b> Do things the REST way and there are three possibilities: (a) that it&#39;s easy to
implement these functions in REST; (b) that you don&#39;t need these things anyway, or (c)
that it&#39;s already your job to do them as an application architect; it&#39;s part of your
business process, so you do work that you needed to do anyway in SOA, but do it in a
simpler and more powerful way.
</p><p>
<b>eA:</b> Already my job?
</p><p>
<b>DC:</b> It&#39;s your job while you&#39;re designing your resource interactions at the
application level: the resource-type or business level. Or maybe while you&#39;re making use
of some existing resource types and &#39;resource-animating&#39; code that does your business
logic for you.  Having WS-* only clouds and complicates this task.
</p><p>
<b>eA:</b> You&#39;ve just hand-waved away a billion-dollar standardisation and tooling
industry!
</p><p>
<b>DC:</b> Standards and tools are essential - we need them.  But simple standards and
tools are best. HTTP, URI, XML and standard schemas are perfectly good enough standards
to get started with, guided by the REST or ROA mind-set.
</p><p>
I&#39;ll grant that we do need some extra help to support RESTful resource interaction in
our domains and applications.  I would like a few more standards and tools, over and
above HTTP and XML, to help me build these complex distributed applications. Some help
configuring and programming the way an application&#39;s resources interact at a business level.
</p><p>
<b>eA:</b> What exact support would you like for REST integration?
</p><p>
<b>DC:</b> We would benefit from standards, tools and frameworks that help define resource
URIs, mapping to GETable and POSTable URIs, easy cache control, easy support for various
response codes, HTTP Auth-based and URI-based identity, inter-resource links,
collections, content types, Microformat support, useful schemas, structures, sets of
simple default behaviours, APP libraries, business rule engines, etc.
</p><p>
It is still early days for the adoption of REST - an adoption that&#39;s undoubtedly been
slowed by the industry&#39;s obsession with SOA. We do have Restlet and the 
<a href="https://jsr311.dev.java.net/nonav/releases/1.0/spec/index.html">JSR 311</a>
work, as well as some help from Microsoft in WCF and the ADO.NET Data 
Services Framework, but there is still much more that could be done.
</p><p>
<b>eA:</b> Indeed. There&#39;s lots of work to do to catch up with all the SOA standards, tools
and frameworks!
</p><p>
<b>DC:</b> I really don&#39;t want ROA to compete with SOA in bureaucracy and vendor
in-fighting! But REST needs much less than SOA. Some things are simply part of REST: you
discover stuff by following links; you know what something can do for you because of its
content type or schema - we went over this sort of thing before.
</p><p>&#160;</p><p>
<b>Service Discovery and Description</b>
</p><p>
<b>eA:</b> So, following links and seeing content types cover REST &#39;Service Discovery&#39; and
&#39;Service Description&#39;?
</p><p>
<b>DC:</b> Yes. When you start thinking in terms of resources not actions, it all becomes
much clearer:
</p><p>
In real life you might walk up the street, ask someone where the nearest shoe shop is or
consult a directory, then see a likely shop, decide it may have what you want, then go
in to investigate. Inside, you may consult more directories or just wander around. You
see the cues around you (shoes on offer, checkout desk), and act or react accordingly.  
</p><p>
You engage at a chosen level of understanding: there is a generic concept of street
layout, then generic shop and shop assistant understanding, then an understanding of how
to view and interact in shoe shops in particular.
</p><p>
<b>eA:</b> And in &#39;virtual life&#39;?
</p><p>
<b>DC:</b> The Web is exactly the same: you explore through links or by asking a search
engine, see what you want, enter the online shop, follow the cues, etc. It&#39;s no accident
that the cyberspace metaphor is often applied to the flat, 2D Web.
</p><p>
<b>eA:</b> And in REST integration?
</p><p>
<b>DC:</b> In REST integration, the metaphor can be extended for machine interaction: get a
list of items by direct reference or by query, go through them finding something that
matches, interact according to standard business types and follow links between business
resources. 
</p><p>
<b>eA:</b> So no service contracts for you, then, just exploring and hoping for the best.
Sounds a bit sloppy!
</p><p>
<b>DC:</b> You can do anything with anything in computing, it&#39;s just a matter of what
metaphor is the most powerful or expressive.
</p><p>
You <i>can</i> design your &#39;machine cyberspace&#39; to include contracts if that&#39;s what you need,
just like in real life, and just like we went over with the 
<a href="http://duncan-cragg.org/blog/post/inter-enterprise-rest-integration-rest-dialogues/">eBay/gBay example</a>.
</p><p>
But in general - especially when building distributed systems - it&#39;s best to start with
loose arrangements and established conventions; adding constraints, contracts and
Central Control only where absolutely necessary. Ensure central control only over
schemas.
</p><p>
Make your Enterprise &#39;mashable&#39; and everyone will thank you.  Expose the UUIDs and GUIDs
of your data in URLs. Transform and enrich your data within standard content types. Link
it all up with your own data and data from elsewhere. Allow two-way interaction. Then
publish it for future generations to discover and re-use!
</p><p>&#160;</p><p>
<b>Client State and Sessions</b>
</p><p>
<b>eA:</b> Right, now how do you model complex state transitions, state evolution and
conversations within a changing context, in a supposedly stateless architecture?
</p><p>
<b>DC:</b> There&#39;s a common misunderstanding about REST that its statelessness should
extend above the protocol (e.g., HTTP) into the application. On the contrary - once
above HTTP and into a Resource-Oriented application, it&#39;s <i>all</i> about state - as long
as that state has a URI!
</p><p>
All the stateless requirement is saying in practical terms is that each HTTP request and
response exchange is a one-off as far as HTTP is concerned. It means that you don&#39;t need
to tie successive exchanges together at the protocol level, which makes implementing
HTTP easier. HTTP just wants a URI to be a URI, and the content there to be manageable
via headers; and HTTP doesn&#39;t and shouldn&#39;t introspect either the URI or the content.
</p><p>
<b>eA:</b> So where do you keep the conversation state, then?
</p><p>
<b>DC:</b> Above HTTP in the world of URI-tagged state. You can have an ongoing
&#39;conversation&#39; between a client and a server resource - as long as those resources are
linkable and fetchable. 
</p><p>
You don&#39;t need sessions below the resource level; below the business level. If your
application truly demands the concept of a sequence of interactions with a start point
and an end point, then go ahead and implement it - at the application or domain level,
not at the framework level.
</p><p>
Most applications can use <i>ad hoc</i>, asynchronous interactions, where the client
identifies itself each time with Authorization headers.
</p><p>
<b>eA:</b> Can each client machine have assigned to it dedicated server resources as part
of this conversation, sort of like an explicit session state?
</p><p>
<b>DC:</b> Yes.  Cacheability and linkability are clearly affected, but if it truly makes
sense in your domain model to have client-specific resources, then just do it - by
definition their scalability and findability is limited to that client!  The client can
still cache its own view, as in a browser, and even intermediate proxies can, although
it&#39;s of benefit to only one client.
</p><p>
<b>eA:</b> Presumably it&#39;s a bad idea to put client state in a Cookie header?
</p><p>
<b>DC:</b> Yup: it&#39;s not got a URI, so its state is hidden. Put it on a URI in a server.
</p><p>
Hidden state is a red flag.
</p><p>
You know you&#39;re on the right track as long as you are exposing your statefulness
in URIs. It should always be obvious where things stand from inspecting public state
alone, to know what is possible and what will happen next.
</p><p>
If you find yourself hiding state in sessions and cookies, or returning different data
dedicated to that client from the same URI by setting no-cache, or if you tie up
successive interactions through sessions, you are going down the wrong track.
</p><p>
<b>eA:</b> Are cookies always bad?
</p><p>
<b>DC:</b> A Cookie header should be used only to identify the client, not a session. You&#39;d
probably use the Authorization header in REST integration anyway.  Just use Cookie
headers along with an auth scheme if you need a more elaborate, perhaps multi-layered
or proxied, authentication system.
</p><p>
<b>eA:</b> What about the Vary response header and its use with Authorization or Cookie
request headers?
</p><p>
<b>DC:</b> Mechanically, from the cache perspective, adding Vary on client-identifying headers
like these is the same as using per-client URIs; setting the Vary header to allow the URI to
be cached on a per-client basis is a hidden way of effectively adding the identifying
data from the Authorization or Cookie header to the URI itself.
</p><p>
Actual per-client resources are explicit; these Vary&#39;d resources are implicit. You
choose which to use at the application level based on the importance of the resources
being identified in your domain model. Either way, the identity of the requestor can be
used to determine read permissions.
</p><p>
The explicit way means you can pass links to your personal resources to others, modulo
read permissions. A client may or may not be able to or want to pass the link to its
dedicated resources to other players - it probably isn&#39;t a link they want anyway - 
but they can still pass around general jumping-off links, that make sense for other
recipients.
</p><p>
<b>eA:</b> To be honest, I just don&#39;t like the idea of the server saving and distributing a
ton of this client-specific resource data!
</p><p>
<b>DC:</b> There are two answers to this: firstly, now that we&#39;re using REST for business
data integration, not generating entire pages of HTML, the chunks of data can have much
finer grain. The actual amount of client-specific data can be much smaller! You can
cache and share links to all the generic chunks, and only transfer small amounts of less
cacheable and linkable per-client data.
</p><p>
Secondly, our clients in REST integration are also often servers, so can in fact expose
their <i>own</i> state. We may be better off just putting those client-specific resources on the
client itself, to get around this whole issue. The client isn&#39;t a browser any more! 
</p><p>
We&#39;re back to the symmetric
<a href="http://duncan-cragg.org/blog/post/distributed-observer-pattern-rest-dialogues/">Distributed Observer Pattern</a>.
</p><p>&#160;</p><p>
<b>Business Processes</b>
</p><p>
<b>eA:</b> OK, now what about Business Process Coordination, Workflow, Orchestration and
Choreography in that sloppy cyberspace of yours?
</p><p>
<b>DC:</b> We&#39;ve already discussed the auction business process, both
<a href="http://duncan-cragg.org/blog/post/business-functions-rest-dialogues/">single-site</a> and 
<a href="http://duncan-cragg.org/blog/post/inter-enterprise-rest-integration-rest-dialogues/">cross-site</a>,
which was quite a good example that covers a number of business activities.
</p><p>
Another good feature of REST is the way it naturally maps onto declarative business
rules. When you switch from process-thinking to resource-thinking, you also switch from
imperative thinking to declarative. This manifests as inter-resource dependency and
transformation.
</p><p>
<b>eA:</b> Eh?
</p><p>
<b>DC:</b> A spreadsheet is an example of this style, where you declare the way cells
depend on each other and then let the hidden magic take care of satisfying your
constraints. We&#39;ve discussed this style of programming before.
</p><p>
Again, tools will be essential to help with this.  Managing and testing event-driven
business rules over shared and distributed state is somewhat new territory, even to most
REST integrators!
</p><p>
<b>eA:</b> Business Processes and Business Rules seem like different things to me.
</p><p>
<b>DC:</b> Well, as we saw, the business process of an auction can emerge from the local
application of business rules. The thing is to let go of the myth that you benefit from
specifying and controlling some over-arching vision of your business processes - that it
makes sense to centralise control of what actually works best when delegated and
decentralised. 
</p><p>
Just write the local What, not the global How, and let the process emerge!
</p><p>
<b>eA:</b> Might be a hard sell to control freaks.
</p><p>
<b>DC:</b> Yeah, true enough. But it more closely maps onto the reality of the way
businesses operate and interoperate. It&#39;s more about the actual peer-to-peer business
interactions and visible state evolution, and less about central controllers that know
the intimate, inscrutable details of the Web Services involved.
</p><p>
Instead of coordinating the import and export of data from one hand-coded interface to
another, you can just link it all up and expect everyone to dereference and recognise
your data. Instead of coordinating sessions with implicit state, you can just react to
standard, public data types.
</p><p>
<i>(c) 2006-2009 Duncan Cragg</i>
</p><p>&#160;</p><p>
In Part 8: <a href="http://duncan-cragg.org/blog/post/ws-are-you-sure-rest-dialogues/">WS-Are-You-Sure</a> (Security, Reliable Messaging and Transactions).
</p><p>
<i>Note that the opinions of our imaginary eBay Architect don&#39;t
necessarily represent or reflect in any way the official
opinions of eBay or the opinions of anyone at eBay.</i>
</p><p>
<i>Indeed, I can&#39;t guarantee that the opinions of our real blogger
necessarily represent or reflect in any way the official
opinions of Roy Fielding...</i>

</p>

            </div>
        </content>
    </entry>
    
    <entry>
        <id>http://duncan-cragg.org/blog/post/content-types-and-uris-rest-dialogues/</id>
        <title>Content-Types and URIs | The REST Dialogues</title>
        <published>2008-02-16T23:44:00Z</published>
        
        <updated>2008-02-16T23:44:00Z</updated>
        
        <link rel="alternate" type="text/html" href="http://duncan-cragg.org/blog/post/content-types-and-uris-rest-dialogues/" title="Content-Types and URIs | The REST Dialogues" />
        
        <category term="architecture" />
        
        <category term="declarative" />
        
        <category term="strest" />
        
        <category term="microformats" />
        
        <category term="dialogue" />
        
        <category term="rest" />
        
        <category term="atom" />
        
        <summary type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">

<p>

In an exclusive nine-part dialogue with <i>an imaginary eBay
Architect</i>, we present an accessible discussion of the 
REST vs. SOA issue.
</p><p>
Although eBay have what they call a &#39;REST&#39; interface, it is, in
fact, a 
<a href="http://duncan-cragg.org/blog/post/strest-service-trampled-rest-will-break-web-20/">STREST</a>
interface, and only works for a few of the many function calls
that they make available via SOAP (GetSearchResults, GetItem,
GetCategoryListings, etc).
</p><p>
In this <a href="http://duncan-cragg.org/blog/post/getting-data-rest-dialogues/">dialogue series</a>,
I argue the case for eBay to adopt a truly REST approach to
their integration API. 
</p><p>
<b>Part 6: Content-Types and URIs</b>
 &#160; ...
</p>

            </div>
        </summary>
        <content type="xhtml" xml:space="preserve">
            <div xmlns="http://www.w3.org/1999/xhtml">

<p>
</p><div class="summary"><p>
In an exclusive nine-part dialogue with <i>an imaginary eBay
Architect</i>, we present an accessible discussion of the 
REST vs. SOA issue.
</p><p>
Although eBay have what they call a &#39;REST&#39; interface, it is, in
fact, a 
<a href="http://duncan-cragg.org/blog/post/strest-service-trampled-rest-will-break-web-20/">STREST</a>
interface, and only works for a few of the many function calls
that they make available via SOAP (GetSearchResults, GetItem,
GetCategoryListings, etc).
</p><p>
In this <a href="http://duncan-cragg.org/blog/post/getting-data-rest-dialogues/">dialogue series</a>,
I argue the case for eBay to adopt a truly REST approach to
their integration API. 
</p><p>
<b>Part 6: Content-Types and URIs</b>
</p></div><p>
</p><p>
<b>eBay Architect:</b> OK, enough fancy REST or ROA interaction
patterns!  Let&#39;s get back to REST basics.
</p><p>
<b>Duncan Cragg:</b> That&#39;ll be content types and URIs, then.
</p><p>
<b>eA:</b> OK - I&#39;ve a question about your standard content types.
In particular, about Microformats.
</p><p>
<b>DC:</b> Go on.
</p><p>
<b>eA:</b> You keep on mentioning Microformats when offering examples
of content type standardisation. But Microformats are always
embedded into HTML (or, preferably XHTML). 
</p><p>
Are you suggesting somehow taking them out and using them
separately? Or do we have to always use them through a, possibly
inappropriate, document model schema?
</p><p>
<b>DC:</b> Microformats currently &#39;tunnel&#39; through mechanisms in XHTML
such as the class attribute. They themselves have distinct
model schemas, that ride on the document model schema.
</p><p>
<b>eA:</b> So can you use them apart from HTML?
</p><p>
<b>DC:</b> No, not really, although you can carry a single Microformat
in a single document carrier, then squeeze out any document model
content that isn&#39;t supporting the Microformat, perhaps leaving
enough that it still renders sensibly in a browser if anyone looks.
</p><p>
The Microformats people won&#39;t like you doing it, I&#39;m quite sure, but
if you and I want to exchange a pure hCard, hCalendar, hResume or
hReview, and nothing else, then we can use the minimal document 
model carrier, and have just one Microformat per resource.
</p><p>
<b>eA:</b> But why not use the original data schema, before it was
Microformatted?  Why not just use vCard and vCalendar?
</p><p>
<b>DC:</b> Or use Atom instead of hAtom! Of course, if vCard has an
XML representation, you could use that - as long as the constituency
of your clients is the right one and is big enough. There may be 
more code out there that &#39;gets&#39; hCard than an XML vCard. And some
Microformats - such as hResume and hReview - don&#39;t have an original
schema and are based on abstracting from common or prior behaviour.
</p><p>
This is REST integration we&#39;re talking about, where data, not
documents, are native, and we aim to search out the most popular
and most widely understood data schemas - even if carried over
documents - to maximise interoperability.
</p><p>
<b>eA:</b> OK, that seems fine. Although I&#39;d point out that REST doesn&#39;t
have the monopoly on interoperability. SOA does that too.
</p><p>
<b>DC:</b> Interoperability is best acheived by sharing millions of
URIs dereferencing to a handful of standard content types, with
interlinks across the Web of resources.  ROAs (Resource-Oriented
Architectures) do that. SOA doesn&#39;t.
</p><p>
<b>eA:</b> REST APIs don&#39;t always have to do it. In the previous
example you went through, eBay and gBay could offer REST interfaces
but not talk the same schemas and not allow cross-linking in the way
you described. Or talk the same schemas but not recognise each
other&#39;s Items and Offers.
</p><p>
<b>DC:</b> That would be walled-garden, silo-thinking. It&#39;s also &#39;API&#39; 
thinking. Just opening up a port to your application, even one with
correct use of GET and POST on well-organised domain URIs, isn&#39;t in
the spirit of REST, and certainly isn&#39;t good enough for REST
integration. 
</p><p>
In REST we always aim to adopt the same schemas, to aim explicitly
for interoperability. And linking between those resources, even
cross-site, is fundamental to the REST way of thinking.  If someone
offers you a &#39;REST API&#39; that uses unnecessary proprietary schemas
that miss obvious interlinking opportunities, especially across to
other sites, run away!
</p><p>
<b>eA:</b> Are there any real-world examples?
</p><p>
<b>DC:</b> A good, and ironic, example of this is Google&#39;s
<a href="http://code.google.com/apis/opensocial/">Open Social</a>, 
at least in its earlier releases, which fails to achieve true
cross-site openness even with a 
&#39;<a href="http://code.google.com/apis/opensocial/docs/dataapis.html">REST API</a>&#39;
and shared schemas, because sites don&#39;t cross-link or actually allow
data sharing. Also, the schemas are a 
<a href="http://code.google.com/apis/opensocial/docs/gdata/people/reference.html#Elements">strange extension of Atom</a>,
rather than using, for example, vCard as the basis for &#39;People Data&#39;.
</p><p>
This hopefully will be fixed as the &#39;REST API&#39; evolves and with the
work going on in groups such as 
<a href="http://www.dataportability.org">DataPortability</a>,
with agreement from the major operators.
</p><p>
<b>eA:</b> So much for the interoperability of <i>that</i> REST
interface.
</p><p>
<b>DC:</b> The heart of good REST interoperability is the acceptance of
standardised data at a &#39;foreign&#39; URI, and the re-publishing of that
foreign URI in your own standardised resources. It happens on the
Web all the time, of course.  We just need to copy the model for
REST integration.
</p><p>
Hypermedia and (more importantly, here) &#39;hyperdata&#39; is baked into
REST, but is an afterthought in SOA. ROAs create an interlinked
hyperdata landscape across sites and domains. I&#39;m using &#39;hyperdata&#39;
here in the sense of interlinked data resources in REST integration,
by analogy with hypermedia, not in its Semantic Web sense.
</p><p>
<b>eA:</b> Ah! But how do your little pure Microformat resources link
up into this hyperdata landscape? Microformats can&#39;t link to each
other, can they?
</p><p>
<b>DC:</b> It&#39;s true you may have to go and get involved in the
Microformats movement in order to help define how to link an
hCalendar event to a list of hCards of people attending. Or the
hCard of a company to a list of hCards of its board members. Or
an hReview to the hCalendar event being reviewed and the hCard
of its author. Or to include the XFN list of links to friends&#39;
hCards inside a person&#39;s own hCard.
</p><p>
One indication that there&#39;s something not ideal in Microformats is
the fact that you have to write someone&#39;s hCard out again and again
for every page or site they appear on. If you could just link to a
single hCard for that person it would be more efficient.
</p><p>
<b>eA:</b> But Microformats have a narrow charter: to decorate the
document model with semantics. Any links are just part of the 
hypertext Web. It sounds like you&#39;re trying to make some kind of
domain model out of them, with their <i>own</i> interlinks!
</p><p>
<b>DC:</b> Yup. When you start to think the data of REST integration,
the document carrier of Microformats and it&#39;s often superfluous
links can be a distraction. If the document links <i>are</i> relevant to
the Microformat, of if people would use links <i>within</i> the
Microformat if they were told what value it has, it would be worth
pulling them out into the Microformat definition itself. Then
enhancing in-browser Microformat parsers to follow links will
greatly enhance their utility.
</p><p>
All you have to do is find real-world examples, and 
<a href="http://microformats.org/discuss/mail/microformats-discuss/2007-September/010769.html">propose it</a>
on the
<a href="http://microformats.org/discuss/mail/microformats-discuss/2007-October/010833.html">Microformat lists</a>!
Meantime, reuse the schemas and keep all your extensions public and
backwards-compatible.
</p><p>
<b>eA:</b> What about all those &#39;rel-&#39; decorations? You know, rel-tag,
XFN, etc.
</p><p>
<b>DC:</b> Well, hAtom is the only Microformat that specifies nested
rel-links: rel-tag, rel-bookmark and rel-enclosure. Otherwise, each
Microformat is independent, and the rel-links are independent. Like
I said, it may be worth going to the Microformat community and
suggesting more such rel-links beyond hAtom.
</p><p>&#160;</p><p>
</p><p>
<b>URI Opacity</b>
</p><p>
<b>eA:</b> So this RESTful data landscape of data wired up with URIs:
it sounds a bit <i>hard</i>-wired: where do URIs as queries (and URI
templates) fit into that tight mesh?
</p><p>
<b>DC:</b> URI templates fall into exactly the same category as
standardised content types and schemas in terms of their level of
abstraction and location in the stack. In other words, the right
thing to do, if it&#39;s transparent URIs you want, is to standardise
search URI templates across sites of a type.
</p><p>
<b>eA:</b> This is getting complicated. It&#39;s hard enough to get 
agreement on the content types of resources, never mind on URI
formats as well!
</p><p>
<b>DC:</b> Indeed, and in fact, I believe that URIs should be opaque:
they already are to HTTP, but also in our data landscape, a URI
should point to a single, predictable resource.
</p><p>
<i>The mechanism of querying that dataspace should be separated out
from the mechanism of linking it up</i>.
</p><p>
<b>eA:</b> A bit like GUIDs?
</p><p>
<b>DC:</b> Exactly. In Enterprise applications, you often see GUIDs
(globally unique ids) being used, and never see them mixed up with
search strings!
</p><p>
Transparent, query or template URIs are either used to be helpful or
decorative, or are an acceptable optimisation, as long as you know
that it&#39;s tunnelling through or hijacking the URI for a quick query
string.
</p><p>
<b>eA:</b> Tunnelling? Hijacking? You&#39;ve dismissed a long-standing
convention, in the Web at least! How else do you do query fetches?
</p><p>
<b>DC:</b> A better solution is the query-POST-redirect pattern:
the client POSTs their query, then the server redirects them to a
linkable results resource on an opaque URI.
</p><p>
The POST query schema can then be properly standardised in a content
type, or &#39;templated&#39; in the REST integration equivalent of an HTML form.
</p><p>
It&#39;s an extra round trip, but only one IP packet in each direction;
a redirect or a GET can fit into a single IP packet - the cost is
only in the connection latency.
</p><p>
<b>eA:</b> Why not just return the state of the resource you&#39;re
redirecting to in the body of the redirect, to save even this
round-trip?
</p><p>
<b>DC:</b> Yes, you could do that. It&#39;s not something seen in the
hypermedia Web as far as I know, but this is REST integration, where
we&#39;re able to come up with new sub-protocols like this - where HTTP
response codes are often given much thought.
</p><p>
Further, the server can offer the option to snapshot this results
resource, so that it&#39;s still exactly the same whenever the link is
dereferenced - something you can&#39;t do with a query URI.
</p><p>
<b>eA:</b> What would Tim Berners-Lee say about this? Is it in the
spirit or letter of his vision for how HTTP and URIs should be
used?
</p><p>
<b>DC:</b> <a href="http://www.w3.org/DesignIssues/Axioms.html">I&#39;ve no idea</a>!
However, in my opinion, when Tim didn&#39;t separate the concepts of a
globally unique identifier returning exactly one resource from a
query string returning maybe none, one or many resources (in a
list), he started a good deal of unnecessary confusion, even if
non-fatal in practical terms.
</p><p>
The phrase &#39;hackable URIs&#39; sums up the situation.  We may have been
forced into creating slightly better user interfaces if the URI
textbox were taken away from browsers.
</p><p>
Make your interface your <i>content</i> and have good search and
information architecture to allow your (opaque) links to be
discovered. If you know that human users - or search engines - will
be interested in reading some links at the top of your information
architecture, then go ahead and use just a few simple, meaningful
addresses.
</p><p>
<b>eA:</b> You&#39;re venturing into controversy again! I&#39;m sure I keep
reading about designing nice URLs being good practice.
</p><p>
<b>DC:</b> There was a time when transparent URLs were 
<a href="http://www.useit.com/alertbox/990321.html">considered important</a>,
but now
<a href="http://franticindustries.com/blog/2007/01/28/google-is-the-new-http/">everyone just uses Google</a>!
All the energy that&#39;s put into 
<a href="http://blog.welldesignedurls.org/">URL good manners</a>
and systems of URI templating and naming is just a distraction from
the bigger effort of standardising content and defining schemas.
</p><p>
Opaque URIs keep content in the body where it can be given a
Content-Type, instead of the headers - the URL line.
</p><p>
This is related to my preference to put &#39;write methods&#39; such
as PUT and DELETE into the body instead of the URL line.
</p><p>
<b>eA:</b> How exactly?
</p><p>
<b>DC:</b> The URL line should have a definite target - an opaque,
globally-unique URI - and a content transfer direction - GET or
POST. 
</p><p>
The rest of the <i>application-level</i> interaction, including
anything that will affect state and any searching and querying,
should be in transferred bodies with standardised content types.
</p><p>
<i>(c) 2006-2008 Duncan Cragg</i>
</p><p>&#160;</p><p>
In Part 7: <a href="http://duncan-cragg.org/blog/post/business-conversations-rest-dialogues/">Business Conversations</a>.
</p><p>
<i>Note that the opinions of our imaginary eBay Architect don&#39;t
necessarily represent or reflect in any way the official
opinions of eBay or the opinions of anyone at eBay.</i>
</p><p>
<i>Indeed, I can&#39;t guarantee that the opinions of our real blogger
necessarily represent or reflect in any way the official
opinions of Roy Fielding...</i>
</p><p>

</p>

            </div>
        </content>
    </entry>
    
    <entry>
        <id>http://duncan-cragg.org/blog/post/distributed-observer-pattern-rest-dialogues/</id>
        <title>The Distributed Observer Pattern | The REST Dialogues</title>
        <published>2007-06-20T22:42:00Z</published>
        
        <updated>2007-06-20T22:42:00Z</updated>
        
        <link rel="alternate" type="text/html" href="http://duncan-cragg.org/blog/post/distributed-observer-pattern-rest-dialogues/" title="The Distributed Observer Pattern | The REST Dialogues" />
        
        <category term="architecture" />
        
        <category term="declarative" />
        
        <category term="strest" />
        
        <category term="publishsubscribe" />
        
        <category term="app" />
        
        <category term="microformats" />
        
        <category term="dialogue" />
        
        <category term="event-driven" />
        
        <category term="rest" />
        
        <category term="atom" />
        
        <summary type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">

<p>

In an exclusive nine-part dialogue with <i>an imaginary eBay
Architect</i>, we present an accessible discussion of the 
REST vs. SOA issue.
</p><p>
Although eBay have what they call a &#39;REST&#39; interface, it is, in
fact, a 
<a href="http://duncan-cragg.org/blog/post/strest-service-trampled-rest-will-break-web-20/">STREST</a>
interface, and only works for a few of the many function calls
that they make available via SOAP (GetSearchResults, GetItem,
GetCategoryListings, etc).
</p><p>
In this <a href="http://duncan-cragg.org/blog/post/getting-data-rest-dialogues/">dialogue series</a>,
I argue the case for eBay to adopt a truly REST approach to
their integration API. 
</p><p>
<b>Part 5: The Distributed Observer Pattern</b>
 &#160; ...
</p>

            </div>
        </summary>
        <content type="xhtml" xml:space="preserve">
            <div xmlns="http://www.w3.org/1999/xhtml">

<p>
</p><div class="summary"><p>
In an exclusive nine-part dialogue with <i>an imaginary eBay
Architect</i>, we present an accessible discussion of the 
REST vs. SOA issue.
</p><p>
Although eBay have what they call a &#39;REST&#39; interface, it is, in
fact, a 
<a href="http://duncan-cragg.org/blog/post/strest-service-trampled-rest-will-break-web-20/">STREST</a>
interface, and only works for a few of the many function calls
that they make available via SOAP (GetSearchResults, GetItem,
GetCategoryListings, etc).
</p><p>
In this <a href="http://duncan-cragg.org/blog/post/getting-data-rest-dialogues/">dialogue series</a>,
I argue the case for eBay to adopt a truly REST approach to
their integration API. 
</p><p>
<b>Part 5: The Distributed Observer Pattern</b>
</p></div><p>
</p><p>
<b>eBay Architect:</b> So, can you summarise your argument that &#39;REST
isn&#39;t just about reading and writing data&#39;, and explain your
view on RESTful business logic?
</p><p>
<b>Duncan Cragg:</b> OK. The whole collection of related resources
determines where things stand at any given time. 
</p><p>
Resources are masters of their own destiny - guided by rules
declared in the standard to which their content type conforms.
</p><p>
These rules, or business logic, run on notification of any
declarations of the state of peer resources, or on arrival of
any state via POST. Such peer states and POSTs are <i>not</i>
commands, although it is possible to go ahead and define a 
special command or edit command content type.
</p><p>
The rules aim to satisfy the business or domain constraints on
the mutual states of these resources - updating and creating
resources accordingly and causing appropriate side-effects
outside the server, such as financial transactions and emails.
</p><p>
These transformations are state driven. Even though the
&#39;tension&#39; in unresolved rules may be <i>detected</i> by events,
that tension <i>exists</i>, not in those events as such, but in
resource state.
</p><p>
<b>eA:</b> That sounds like a core difference to SOA.
</p><p>
<b>DC:</b> Indeed. It&#39;s a Resource-Oriented Architecture. And ROAs
are declarative, not imperative like SOAs.
</p><p>
We have a world of resources declaring their current state, and
resources settling into new states depending on the current
state of related resources. These state changes can be
driven by hard-coded resource animation logic, or by simpler,
clearer, more scalable, declarative state transformation rules.
</p><p>
<b>eA:</b> Remind me of those patterns for notifying state change.
</p><p>
<b>DC:</b> Resource states are either polled via GET or actively
notified via POST.  Such actively POSTed state could be from a
resource that also happens to be GETable, could be simply a link to
such a resource, or could cause such a GETable resource to be
created on the target server.  Alternatively, the POSTed state
could be considered too transient to record in a GETable
resource, but can still trigger transformation in its target
resource.
</p><p>
The above eBay examples used the pattern of &#39;server creates
GETable copy of POSTed resource&#39;, and also &#39;second server
hosts GETable copy of POST-notified resource&#39;.
</p><p>
What I have described is a general programming model because,
in general, such simple, declarative, transformational
mechanisms are Turing Complete.
</p><p>
<b>eA:</b> I&#39;m sure it&#39;s a novel perspective - even to RESTians!
Again, do you have any high-level RESTian support for this?
</p><p>
<b>DC:</b> Any web resource that is a derivative of, or is dependent
on, one or more other resources is using this approach.
</p><p>
Like I said before, there is an example of a 
<a href="http://wellformedweb.org/story/1">similar approach by Joe Gregorio</a>
on his &#39;Well-Formed Web&#39; site for alerting resources to peer
resources of mutual interest.
</p><p>
Every time you would POST some data, consider making that data
GETable and POST its URI instead, as a notification of the data
existing. 
</p><p>
<b>eA:</b> GETable POST data? You sure that&#39;s REST-compliant?
</p><p>
<b>DC:</b> In REST integration, things become more symmetric 
than in the client-server Web, or rather, the &#39;client-resource&#39;
Web. We can start to talk about the &#39;resource-resource&#39; Web!
</p><p>
But anyway, we&#39;re already halfway to the symmetric resource-resource
Web when we POST - not to a <i>service</i>, but to a <i>URI</i>. Resources
can already both issue <i>and</i> receive state, which is a pretty
symmetric state of affairs. 
</p><p>
<b>eA:</b> I never thought of it that way - I keep forgetting that
you can POST right back to a resource you just fetched.
</p><p>
<b>DC:</b> But think one step on: the POSTed data has a Content-Type
but no URI!
</p><p>
Why not close the loop and have this POSTed data be a first-class
resource (with a URI) that POSTs <i>itself</i> to the target. And it can
<i>itself</i> GET that target or be POSTed to by that target in return.
</p><p>
That really is a Resource-Oriented Architecture. Once resources are
seen as equal and active participants in RESTful integration, it
becomes irrelevant whether their state is transferred by GET or by
POST.
</p><p>
<b>eA:</b> I&#39;m still having trouble with this pattern of POST just
being a pro-active GET.
</p><p>
<b>DC:</b> Making POSTed data GETable more correctly moves the
responsibility to the target resource to fetch the incoming resource
state when its ready (rather than being bombarded by state it hasn&#39;t
asked for).
</p><p>
Once the target is interested, updates can be POSTed directly as
they happen, to prevent the target polling, or notification of
an updated URI POSTed to trigger the target to re-GET the changed
resource when it wants (thereby updating the caches).
</p><p>
<b>eA:</b> Hmm - makes clients look like servers..
</p><p>
<b>DC:</b> Since our &#39;clients&#39; in REST integration are also &#39;servers&#39;
in other contexts, it is easier to set up client-side resources than
on the browser-based Web. One objection to cookies on the Web is
that they are state or resource that has no URI. So give your
&#39;client&#39; state a URI!  And put any client-specific server resources
on your own &#39;client&#39; host.
</p><p>
<b>eA:</b> Is anyone doing this sort of thing?
</p><p>
<b>DC:</b> Well, in fact there are many examples of this
POST-notification of a GETable resource already happening
between web sites.  Like submitting a link to your site to an
indexing engine and letting it crawl (or poll) it.
</p><p>
Trackback pings are another example: POST a URI along with a
sample of your page.  And the Microformat rel-tag adds your
article to Technorati&#39;s tag index when you ping their servers
with the URI of the article.
</p><p>
Further, imagine POSTing to some new site a link to your hCard
on your own server, to save you having to type your name and
address again. And you&#39;d never need to manually update sites
when your address changes: just ping &#39;em all.
</p><p>
<b>eA:</b> Ah - but I thought all URIs should be GETable. The ping URI
you&#39;re POSTing <i>to</i> in these examples isn&#39;t always one that you
can also GET!
</p><p>
<b>DC:</b> Indeed - so think how much more powerful it would be if
we did close the loop and provide or create a GETable resource to
POST these notifications to. 
</p><p>
For example, imagine a page containing an hCalendar event. Now point
to it with a rel=&quot;attending&quot; link.  When the hCalendar discovers
your intention (using a direct POST ping of your page&#39;s URI to the
hCalendar page&#39;s URI - or perhaps through the referrer trick from
people clicking through), it adds your referring page to a list of
attendees inside the hCalendar. The hCalendar could either contain
lists of backlinks to the attendee&#39;s pages, which may in turn carry
hCards, or it could contain lists of complete hCards copied over.
</p><p>
<b>eA:</b> Sounds like a good use of Microformats.
</p><p>
<b>DC:</b> These examples make crawling and polling (even with
If-Modified-Since <i>et al</i>) look like a clumsy version of the more
proactive POST. 
</p><p>
Web Feeds and general publish-subscribe are further examples where
POST may be used to notify changes on a resource - giving the feed
consumer first-class resource status with their own URI. 
</p><p>
<b>eA:</b> I&#39;d never think of using HTTP in this way.
</p><p>
<b>DC:</b> Obviously this only applies where the feed consumer is a
visible and POSTable server and where timeliness is crucial. And
probably where the number of subscribers is relatively small, unless
asynchronous I/O and an event-driven architecture are employed, and
you don&#39;t wait for the response to each POST.
</p><p>
This isn&#39;t done now simply because of the asymmetry of the current
Web, <i>an asymmetry which we are free of in REST integration</i>.
</p><p>
<b>eA:</b> What about all those REST rules about idempotent and unsafe
methods?
</p><p>
<b>DC:</b> We&#39;re not mixing GET and POST in that sense, just turning
the tables on the asymmetric Web.  GET is still cacheable, and we
can POST a link to cause a cached GET.
</p><p>
I believe this is a more-constrained REST style, not disjoint to
REST. It is at least an ROA! It may fall foul of REST&#39;s
client-server constraint, since we&#39;re now in server-server territory
with integration applications.  Also, the concept of &#39;Hypertext as
the Engine of Application State&#39; is something that may take some
refitting to the mutual state dependency model. However, I believe
it&#39;s most important to focus on maintaining the benefits of REST
and its key elements of standard content types at URIs.
</p><p>
I call this symmetric REST integration style the &#39;Distributed
Observer Pattern&#39;.
</p><p>
<b>eA:</b> Quickly summarise the &#39;Distributed Observer Pattern&#39;.
</p><p>
<b>DC:</b> OK, the Distributed Observer Pattern is &#39;symmetric REST&#39;. A
resource subscribes to a peer resource via a GET that supplies its
own URI, and is notified of subsequent state changes in that
resource through a POST back.
</p><p>
<b>eA:</b> That was <i>too</i> quick. Tell me the details!
</p><p>
<b>DC:</b> OK, here are four. First, a POST can be either the whole
new state or the fact of the change, allowing the subscriber to
GET the resource when it&#39;s ready (and thereby fill any caches).
</p><p>
Secondly, you can use either the Referer header or perhaps the
Content-Location header in POST and GET requests to indicate the
origin POSTer or GETter URI. Alternatively, you can send this origin
resource URI using the Cookie header, echoing its use in the normal
browser client-server case to identify the pseudo-resource of a
browser user.
</p><p>
POSTed state notifications may be unsolicited by a prior GET
subscription, when the POST target is clearly open to them (as in
the ping notification examples).  These can be seen as &#39;subscribe to
anyone&#39;, and may be combined with a corresponding &#39;GET anyone&#39;
crawling process, without explicit subscription.
</p><p>
Finally, POST notifications may be targetted to single resources to
ask them to update: the Distributed Observer Pattern way of
achieving the client-server editing function.  These now become
&#39;edit suggestions&#39; of the POSTer resource - putting the target back
in control of its own destiny and integrity.
</p><p>
<b>eA:</b> And why should I use the Distributed Observer Pattern?
</p><p>
<b>DC:</b> The Distributed Observer Pattern supports the programming model
of inter-dependent resources whose own state is a function of their
peers&#39; state, driven by declarative rules. It&#39;s a very general ROA
programming model.
</p><p>
<i>(c) 2006-2007 Duncan Cragg</i>
</p><p>&#160;</p><p>
In Part 6: <a href="http://duncan-cragg.org/blog/post/content-types-and-uris-rest-dialogues/">Content-Types and URIs</a>.
</p><p>
<i>Note that the opinions of our imaginary eBay Architect don&#39;t
necessarily represent or reflect in any way the official
opinions of eBay or the opinions of anyone at eBay.</i>
</p><p>
<i>Indeed, I can&#39;t guarantee that the opinions of our real blogger
necessarily represent or reflect in any way the official
opinions of Roy Fielding...</i>
</p><p>

</p>

            </div>
        </content>
    </entry>
    
    <entry>
        <id>http://duncan-cragg.org/blog/post/inter-enterprise-rest-integration-rest-dialogues/</id>
        <title>Inter-Enterprise REST Integration | The REST Dialogues</title>
        <published>2007-04-08T13:38:00Z</published>
        
        <updated>2007-04-08T13:38:00Z</updated>
        
        <link rel="alternate" type="text/html" href="http://duncan-cragg.org/blog/post/inter-enterprise-rest-integration-rest-dialogues/" title="Inter-Enterprise REST Integration | The REST Dialogues" />
        
        <category term="architecture" />
        
        <category term="declarative" />
        
        <category term="strest" />
        
        <category term="p2p" />
        
        <category term="app" />
        
        <category term="dialogue" />
        
        <category term="event-driven" />
        
        <category term="rest" />
        
        <category term="atom" />
        
        <category term="scalability" />
        
        <summary type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">

<p>

In an exclusive nine-part dialogue with <i>an imaginary eBay
Architect</i>, we present an accessible discussion of the 
REST vs. SOA issue.
</p><p>
Although eBay have what they call a &#39;REST&#39; interface, it is, in
fact, a 
<a href="http://duncan-cragg.org/blog/post/strest-service-trampled-rest-will-break-web-20/">STREST</a>
interface, and only works for a few of the many function calls
that they make available via SOAP (GetSearchResults, GetItem,
GetCategoryListings, etc).
</p><p>
In this <a href="http://duncan-cragg.org/blog/post/getting-data-rest-dialogues/">dialogue series</a>,
I argue the case for eBay to adopt a truly REST approach to
their integration API. 
</p><p>
<b>Part 4: Inter-Enterprise REST Integration</b>
 &#160; ...
</p>

            </div>
        </summary>
        <content type="xhtml" xml:space="preserve">
            <div xmlns="http://www.w3.org/1999/xhtml">

<p>
</p><div class="summary"><p>
In an exclusive nine-part dialogue with <i>an imaginary eBay
Architect</i>, we present an accessible discussion of the 
REST vs. SOA issue.
</p><p>
Although eBay have what they call a &#39;REST&#39; interface, it is, in
fact, a 
<a href="http://duncan-cragg.org/blog/post/strest-service-trampled-rest-will-break-web-20/">STREST</a>
interface, and only works for a few of the many function calls
that they make available via SOAP (GetSearchResults, GetItem,
GetCategoryListings, etc).
</p><p>
In this <a href="http://duncan-cragg.org/blog/post/getting-data-rest-dialogues/">dialogue series</a>,
I argue the case for eBay to adopt a truly REST approach to
their integration API. 
</p><p>
<b>Part 4: Inter-Enterprise REST Integration</b>
</p></div><p>
</p><p>
<b>Duncan Cragg:</b> OK - I&#39;ve demonstrated how you can replace
imperative, function-call API-driving with a clean, declarative,
RESTful interaction, driven by simple business rules. 
</p><p>
We had servers run by eBay and clients run by the public, in the
same way your SOAP API is used.
</p><p>
<b>eBay Architect:</b> Ah: that&#39;s something SOA has that REST doesn&#39;t!
</p><p>
<b>DC:</b> What? What&#39;s that?
</p><p>
<b>eA:</b> Services are all about Enterprise Integration: about
servers talking to servers. In REST you&#39;re all about clients
talking to servers. The Web is essentially only browser clients
talking to Web servers. With Web Services, you can do more serious
Enterprise Integration.
</p><p>
<b>DC:</b> You never give up do you? So you want &#39;serious&#39; integration.
Is that within or between enterprises?
</p><p>
<b>eA:</b> Let&#39;s say between.
</p><p>
<b>DC:</b> Fine. We&#39;ll use the same example as before: it&#39;s just a
variation on the Patterns used.  
</p><p>
We can standardise a more general version of the eBay schemas for
Items, Offers, ResponseToBestOffers and so on. Anyone can put their
own Items, Offers, etc. up on their own servers, or on some public
auction service site.  Everyone can do auctions with eBay and with
anyone else who decides to set up. 
</p><p>
Even, say, a new Google auction site: let&#39;s call it &#39;gBay&#39;!
</p><p>
<b>eA:</b> Ha! OK, let&#39;s go through this slowly: you have eBay and
&#39;gBay&#39; sites, with sets of users on each. Now Ernie wants to sell
his old laptop on eBay, so creates a new Item for it.  Gordon is
registered to gBay and needs a cheap laptop.
</p><p>
<b>DC:</b> Great - well the first thing is search. As an interoperable
site, gBay offers a broad search across both gBay sale Items and
eBay ones - cached and indexed internally. The gBay search database
would be filled by crawling eBay URIs and even by running queries on
eBay.
</p><p>
<b>eA:</b> Mm. Have to check the T&#39;s &amp; C&#39;s...
</p><p>
<b>DC:</b> So Gordon on gBay finds Ernie&#39;s laptop on eBay. The
presentation of this eBay sale item will be given the gBay
style, but calling out directly to the eBay data and images.
</p><p>
<b>eA:</b> OK, now let&#39;s say Gordon decides to make an offer.
</p><p>
<b>DC:</b> So an Offer resource is created on <i>gBay</i> referring to the
laptop on eBay. Then through a notification, the Item on eBay is
alerted to this Offer.
</p><p>
<b>eA:</b> What&#39;s notified, to where?
</p><p>
<b>DC:</b> There&#39;s a number of possible patterns.  Before, we had the
pattern of POSTing a resource to a server that then creates the
GETable version.
</p><p>
However, now gBay is hosting the Offer, so the internal mechanisms
for notification are no longer available. 
</p><p>
So gBay could suggest an update through APP or a simpler POST to a
collection of Offer entries within the eBay Item to point to this,
now remote, Offer.
</p><p>
Perhaps the gBay Offer can simply be POSTed wholesale to the eBay
Item. 
</p><p>
Or just a link to it.
</p><p>
Or eBay may poll, read a feed or search gBay for new Offer URIs,
putting them into Offer lists as they come up. 
</p><p>
An unusual approach (thanks to 
<a href="http://wellformedweb.org/story/1">Joe Gregorio</a>)
would be for gBay to GET the eBay Item, with the Offer marked in a
Referer: header.
</p><p>
<b>eA:</b> Plenty of patterns to choose from. So there are some Offers
on eBay, some on gBay. The Item lists its Offers in a rank as before,
as they appear through this notification.
</p><p>
Now, let&#39;s say Ernie wants to accept Gordon&#39;s Offer on gBay. 
</p><p>
<b>DC:</b> OK, assuming he can see the Offers the same regardless of
host, he just chooses Gordon&#39;s Offer on the offer listing for his
Item and accepts it.
</p><p>
<b>eA:</b> So we need to create a ResponseToBestOffer on eBay.
</p><p>
<b>DC:</b> Yes. Now the patterns are reversed, because eBay needs to
notify gBay this time - of its ResponseToBestOffer. 
</p><p>&#160;</p><p>
</p><p>
<b>Pub-Sub and Observer Pattern</b>
</p><p>
<b>DC:</b> Again, it can do this by POSTing the ResponseToBestOffer to
each Offer on gBay in turn, or can POST the actual Item itself to
each Offer, where the Item has a link to the ResponseToBestOffer.
</p><p>
That would implement a logical subscription to the Item from each of
the Offers on it.
</p><p>
<b>eA:</b> It sounds to me like POSTing several times to implement this
pub-sub pattern is physically inefficient, even if it&#39;s logically
correct.  Especially when it&#39;s the same information repeated from
eBay to gBay servers.
</p><p>
<b>DC:</b> Yes, indeed: a single notification to gBay would be better,
letting gBay handle the propagation of subscription responses. This
would in effect treat gBay as a proxy cache, and the notification as
a cache invalidation event on gBay&#39;s copy of the eBay Item.
</p><p>
<b>eA:</b> What URI on gBay would you POST this eBay Item to?
</p><p>
<b>DC:</b> Something like <code> http://gbay.com/ebay.com/item/4243</code> - to a
copy of itself. You could also GET this cached copy if you wanted.
</p><p>
<b>eA:</b> OK, what next?
</p><p>
<b>DC:</b> In gBay the losing Offers get updated on receipt of this
ResponseToBestOffer state. Gordon&#39;s Offer gets set to &#39;won&#39;. In
eBay, all the losing Offers are updated to &#39;lost&#39;. The laptop Item
gets marked &#39;sold&#39;, with a link to the ResponseToBestOffer, which
links to the Offer that won.
</p><p>
It is possible to implement this internally in eBay (and that
pub-sub cache invalidation propagation in gBay) using the
<a href="http://en.wikipedia.org/wiki/Observer_pattern">Observer Pattern</a>.
and an event-driven server. 
</p><p>
<b>eA:</b> Makes sense - you mean something like 
<a href="http://www.eecs.harvard.edu/~mdw/proj/seda/">SEDA</a>?
</p><p>
<b>DC:</b> Yep.
</p><p>
So the Offers all subscribe to the Item to watch for its status
switching to &#39;sold&#39; and to see if they won.  Conversely, the Item
can subscribe to the Offers: maybe the Offers could change or be
withdrawn, and the Item needs to keep itself updated accordingly.
</p><p>
<b>eA:</b> Wow - symmetric subscription - the two-way Observer Pattern!
</p><p>
OK, what next?
</p><p>
<b>DC:</b> The eBay laptop Item resource will be further updated by its
owner with paid, shipped, refunded, etc., as it currently is within
eBay.
</p><p>
<b>eA:</b> Hold on, you&#39;re mixing patterns: you had the Observer
Pattern on the Item just now: the Item observes the Offers. 
The Offers&#39; state can be POSTed to the Item, whose own state may
then change according to its rules.
</p><p>
But you then mix patterns by allowing a POST directly to the Item
from the Item&#39;s owner, to update a couple of fields.
</p><p>
In one, the Item chooses what its state will be according to the
state of its peers, and in the other, it&#39;s told, not according to
a peer state, but some POST content type. 
</p><p>
That doesn&#39;t seem neat or symmetric.
</p><p>
<b>DC:</b> It&#39;s true that these interaction styles differ: the Observer
Pattern or pub-sub approach is peer-to-peer (resource-to-resource as
equals watching each other); and in this scenario it&#39;s also
server-to-server. 
</p><p>
The direct edit request is more a client-server pattern, where the
server resource - the Item - is considered under the control of a
client.
</p><p>
However, the Item is always in control of its own state, and can
even ignore a request by its owner if that request doesn&#39;t match its
internal integrity rules. 
</p><p>
The Item supporting both styles at the same time is absolutely fine.
</p><p>
Actually, you could see these two styles as aspects of the same
peer-to-peer pattern: introduce a resource in the client that
holds edit requests, to which the Item subscribes. It all ends up
being much the same.
</p><p>&#160;</p><p>
</p><p>
<b>Transactions, Trust</b>
</p><p>
<b>eA:</b> Right, now what if you have a race, where the
ResponseToBestOffer is created at the same time as an Offer is
changed or withdrawn?
</p><p>
Don&#39;t you need some kind of two-phase commit or distributed
transaction logic?
</p><p>
<b>DC:</b> Of course not. It&#39;s the same as in the real world: as long
as it all settles in the end and the rules are followed. The
ResponseToBestOffer cites what state of the Offer it is accepting.
If that changes for any reason, the ResponseToBestOffer is void.
</p><p>
It&#39;s about state and state consistency in REST, as opposed to the
SOA style of maintaining total control at all times.
</p><p>
There will be temporary states that trigger the rules and that need
to be resolved. That&#39;s the programming and distribution model.
Tolerance of transient states is what makes this model so robust.
</p><p>
<b>eA:</b> Surely there are some legal and contract issues?  How is
this exchange legally binding?
</p><p>
<b>DC:</b> You can digitally sign the Item, Offer and ResponseToBestOffer
resources, and each side needs to keep records of the history.  Then
it&#39;s down to agreements between eBay and gBay and the local laws in
force.
</p><p>
<b>eA:</b> What about buyer and seller ratings and feedback?
</p><p>
<b>DC:</b> Ernie in eBay and Gordon in gBay can happily publish
feedback about each other, and Ernie will be able to see Gordon&#39;s
rating via eBay&#39;s interface, or directly on gBay.  
</p><p>
As for aggregated ratings from several buyer/seller interactions: a
person&#39;s rating is a function of the ratings of all those they have
dealt with. These ratings can be fetched by GET from remote sites,
and combined with internally-held ratings, depending on the trust of
one site over another site&#39;s ratings.
</p><p>
<b>eA:</b> So how do we trust these ratings across sites?
</p><p>
<b>DC:</b> We have to trust eBay that it trusts gBay. This is one
of the basics of distributed systems. In a monolithic system
you have a single trust domain: all parts can trust each other.
</p><p>
Split the application up across multiple trust domains and you need
authentication and crypto.  You can&#39;t get way from needing peer trust
structures built up explicitly through crypto, agreement and
contract and/or implicitly through past successful experience.
</p><p>
<b>eA:</b> Can you be more specific?
</p><p>
<b>DC:</b> Normally, a GET for a resource or a POST of some data comes
with a header identifying the GETer or POSTer. The resource can also
be signed by a user on a site or by the site itself as a proxy. 
</p><p>
Or, if you have an agreement with the site, you just need to use
https to ensure you&#39;ve got a secure connection with that site, 
then needn&#39;t have individual signatures.
</p><p>
<b>eA:</b> Where&#39;s the Single Sign On and Identity in all this?
We&#39;ve got users working across multiple sites.
</p><p>
<b>DC:</b> Well, gBay is the holder of the Gordon identity or persona -
and it manages his world view. Gordon on gBay needs his identity to
mean something on eBay, but we don&#39;t want him to have to create an
account on eBay or to have to tell gBay his eBay login details to
work on both sites. So he expects gBay and eBay to have come to
some agreements about technology and policy.
</p><p>
In REST, we don&#39;t have sessions and logins - we have identity,
which implies asymmetric (private/public key) crypto for signatures
and security. We have a number of tools available to us, including
OpenID and https, as well as resource signing.
</p><p>
<b>eA:</b> Here&#39;s a question for you: how would you manage a single
shopping trolley for Gordon on gBay, containing and allowing payment
for eBay goods?
</p><p>
<b>DC:</b> ShoppingTrolley resource, links to eBay and gBay items.  At
checkout, smaller eBay-Items-only ShoppingTrolley resource POSTed to
eBay along with CreditCard resource (again, you can sign the
ShoppingTrolley and encrypt the data).
</p><p>
<b>eA:</b> So, as eBay, why should we integrate the seller ratings of
someone on gBay? Or get gBay&#39;s for-sale items coming up in our
searches? Or accept Offers and ShoppingTrolleys from gBay? We don&#39;t
control or trust them, and don&#39;t want to send traffic or business
over to them.
</p><p>
<b>DC:</b> Fair enough, for now. I&#39;m only describing what&#39;s technically
possible. Like I said before, you may revisit your stance on
interoperability and mutual agreements one day soon. 
</p><p>
Also, what if your business decides this year to set up a commercial
partnership with another similar business and the managers come to
you asking how it&#39;s all going to work together internally?
</p><p>
You&#39;ll find having good REST interoperability already in place a
huge asset for internal integration! You&#39;ll also find that an
interop-friendly approach makes developing internal &#39;mashups&#39; much
easier.
</p><p>&#160;</p><p>
</p><p>
<b>Better Than SOA</b>
</p><p>
<b>eA:</b> I still can&#39;t see why all this is better than our SOAP
approach, though: it just seems like the same things are
happening at the end of the day - that it&#39;s only a change of 
perspective.
</p><p>
<b>DC:</b> Well, a minute ago, you were challenging using REST for
anything other than simple data manipulation. Now I&#39;ve shown 
you the power of a REST approach can be easily extended to a
clean, simple, scalable, interoperable, general, declarative
programming model. And you&#39;re still not satisfied!
</p><p>
<b>eA:</b> Ha! OK. So tell me why this programming model is so
scalable and interoperable compared with the SOAP API and 
normal function calls.
</p><p>
<b>DC:</b> It&#39;s scalable because of all the reasons I mentioned
before: the cacheability of the basic data operations and their
parallelisability through URI partitioning.  <i>updated - I meant 
data partitions not operation partitions!</i>
</p><p>
Plus now we have parallelisability of the application of the
business rules. There&#39;s nothing more parallelisable than a
declarative system.
</p><p>
<b>eA:</b> If you say so! OK, perhaps you could elaborate on that;
it sounds like a new point.
</p><p>
<b>DC:</b> It is: when you&#39;re leading the computer step-by-step
through a process, you have to handle concurrency yourself.
That&#39;s the &#39;How&#39; of &#39;What not How&#39;. 
</p><p>
Conversely, when you simply declare &#39;What&#39; the rules are, the
computer is free to go off and do things as concurrently as the
rules and the data separation allow.
</p><p>
<b>eA:</b> Mm. OK. Interoperability?
</p><p>
<b>DC:</b> It&#39;s interoperable again for the reasons I mentioned
before. Firstly, the power of the URI; this scenario is a full
player in the Web: you can share links to Items around and go
fetch your Offers and Feedbacks with a simple HTTP GET. You can
make things happen by POSTing to the relevant URI, given its
content type.
</p><p>
There&#39;s also the expectation of standard Content-Types,
sub-types and schemas in GET and POST, rather than custom
eBay WSDLs and schemas, that I mentioned before. 
</p><p>
<b>eA:</b> Like you said, you already mentioned these things.
Anything to add now that we&#39;re doing business rules?
</p><p>
<b>DC:</b> Yes; when data is your interface and resource
transformation your basic programming model, resource data
types become part of your &#39;programming language&#39;.  As such,
there is great benefit in sharing data types to <i>allow such
programming across multiple domain boundaries</i>. 
</p><p>
SOA, on the other hand, encourages inventing your own
&#39;programming language&#39; every time. It&#39;s a much more brittle
model and mind-set.
</p><p>
You can&#39;t GET your RespondToBestOffer function call, but I
can GET the ResponseToBestOffer!  It&#39;s basically a more
mashable approach to distributed programming.
</p><p>
<i>(c) 2006-2007 Duncan Cragg</i>
</p><p>&#160;</p><p>
In Part 5: <a href="http://duncan-cragg.org/blog/post/distributed-observer-pattern-rest-dialogues/">The Distributed Observer Pattern</a>.
</p><p>
<i>Note that the opinions of our imaginary eBay Architect don&#39;t
necessarily represent or reflect in any way the official
opinions of eBay or the opinions of anyone at eBay.</i>
</p><p>
<i>Indeed, I can&#39;t guarantee that the opinions of our real blogger
necessarily represent or reflect in any way the official
opinions of Roy Fielding...</i>
</p><p>

</p>

            </div>
        </content>
    </entry>
    
</feed>

