David Chappell posits that
the "war" between REST and WS-* is over.
The evidence for this is that platforms such as .NET and Java that have
traditionally had strong support for WS-* are now providing better tools for
working with REST architectures.
The War
Is the war over? I think it we are getting towards
the end of the first battle. WS-* proponents who see no value in REST are now
a minority, even if some of those who accept REST's value are only beginning to
understand it (both REST, and its value). Moreover, I think that this will in
the long run be seen as a battle between Object-Orientation and REST. That
battle will be fought along similar lines to the battle between Structured
Programming and Object-Orientation.
In the end, both Object-Orientation and Structured Programming were right for
their particular use case. Object-Orientation came to encapsulate structured
programming, allowing bigger and better programs to be written. We still see
structured programming in the methods of our objects. The loops and conditionals
are still there. However, objects carve up the state of an application into
manageable and well-controlled parts.
My view is that the REST vs Object-Orientation battle will end in the same
way. I believe that REST architecture will be the successful style in large
information systems consisting of separately-upgradable parts.
I take the existing Web as evidence of this. It is already the way large-scale
software architecture works. REST accommodates the fact that different parts
of this architecture are controlled by different people and agencies. It deals
with very old software and very new software exist in the same architecture.
It codifies a combination of human and technical factors that make large-scale
machine cooperation possible.
The place for Object-Orientation
We will still use Object-Orientation at the small scale, specifically
to build components of REST architecture. Behind the REST facade we will build
up components that can be upgraded as a consistent whole.
Object-Orientation has been an excellent tool for building
up complex applications when a whole-application upgrade is possible. Like
traditional relational database technology, it is a near perfect solution where
the problem domain can be mapped out as a well-understood whole.
Hard-edged Object-Orientation with its crinkly domain-specific methods finds it
hard to work between domains, and nearly impossible to work across heterogeneous
environments where interacting with unexpected versions of unexpected
applications is the norm. Like Structured Programming before it, the
Object-Orientated abstraction can only take us so far. An architectural style
like REST is required to build much larger systems with better information
hiding.
Conclusion
To me, the "war" is over. REST wins on the big scale. Object-Orientation
and RDBMS win at the small scale. The remaining battlefield is the area between
these extremes. Do we create distributed technology based on Object-Oriented
principles using technology like Corba or WS-*, or do we construct it along REST
lines?
Like David, I see the case for both. Small well-controlled systems may
benefit from taking the Object-Oriented abstraction across language, thread,
process, and host boundaries. However, I see the ultimate value of this approach
as limited. I think the reasons for moving to a distributed environment often
relate to the benefits which REST delivers at this scale, but Object-Orientation
does not.
Addendum
Mark Baker picks up on a specific point in David's article. David says that
REST is fine for CRUD-like applications. Mark essentially counters with
"incorporate POST into your repertoire".
This is where I have to disagree. I think that any operation that is sensible
to do across a network can be mapped to PUT, DELETE, GET, or SUBSCRIBE on an
appropriate resource. I see the argument that POST can be used to do
interesting things as flawed. It is an unsafe method with undesirable
characteristics for communication over an unreliable network.
My CRUD mapping is:
- C or U
- PUT
- R
- GET
- D
- DELETE
I then add trigger support as SUBSCRIBE.
Mark's example is the placement of a purchase order. I would frame this
request as PUT https://example.com/purchase-order/1000 my-purchase-order. This
request is idempotent. My order will be placed once, no matter how many times I
execute it. All that is needed is for the server to tell me which URL to use
before I make my request, or for us to share a convention on how to select new
URLs for particular kinds of resources. Using POST for this kind of thing also
has the unfortunate effect of creating multiple ways to say the same thing,
something that should be avoided in any architecture based on agreement between
many individuals and groups.
In my view, the main problem with the CRUD analogy is that it implies some
kind of dumb server. REST isn't like this. While your PUT interaction may do
something as simple as create a file, it will be much more common for it to
initiate a business process. This doesn't require a huge horizontal shift for
the average developer. They end up with the same number of url+method
combinations as they would have if they implemented a non-standard interface.
All they have to do is replace their "do this" functions with "make your state
this" PUT requests to an appropriate url. REST doesn't change what happens
behind the scenes in your RDBMS or Object-Orientated implementation domain.
Benjamin