REST, RPC, mountains, molehills, and a retraction (sort of)
Mark Baker
distobj@acm.org
Wed, 08 Aug 2001 17:49:05 -0400
8/8/2001 2:11:05 PM, Jeff Bone <jbone@jump.net> wrote:
>
>So...
>
>Over the course of the FoRKBreak, I've had several good discussions
>with various folks about this whole REST vs. RPC thing, in particular
>a great and detailed exchange with Mark Baker. (Thanks Mark!)
My pleasure Jeff. Thanks for being open minded enough to let this sink in.
> GET http://localhost/StockTicker/getStockPrice?strSymbol=MSFT
>
>The REST position is, essentially, that this an RPC, breaks the Web
>and causes all sorts of nastiness, and is very RESTless. The basic
>problem is that the method --- getStockPrice --- doesn't represent a
>resource; it's not clear what what it means to GET, PUT, and POST to
>something called "getStockPrice". However, a simple change of
>nomenclature from "getStockPrice" to "CurrentStockPrice" suffices!
>I.e., the first example below is entirely valid from a REST design
>perspective, and the second even better:
>
> GET http://localhost/StockTicker/CurrentStockPrice?strSymbol=MSFT
> GET http://localhost/StockTicker/MSFT/CurrentStockPrice
>
>Obviously, the differences between "good REST design" and "bad RPC
>design" can be quite subtle.
I dunno, I don't think that's too subtle. It may not be in-your-face obvious, granted, but most people know the
difference between a noun and a verb. 8-)
Not that I'm suggesting resources can't be verbs, since processes can have state too. But a process identified by a
URI would return the state of the process, not the result of the process. e.g. GET on /GetStockQuote could return a
representation saying "awaiting approval from manager of information services at AMEX to release information".
> Furthermore, as a design style, it's one that
>when pushed to its extreme *can* have significant costs for
>developers; rather than developing object models using traditional
>OOP design techniques and then automagically exporting them to the
>Web, developers must decompose their objects in a different fashion
>and, perhaps, even go to a phenomenal amount of trouble to explicitly
>provide the marshalling / unmarshalling / parsing of things to and
>from the request and response streams. StockTicker is much more work
>to build as a servlet, say, than as a Web-naive class that is
>automagically published to the Web via some RPC framework...
I agree that REST-friendly modelling tools would be very handy, but I'm not sure I buy the argument that implementation
is much more complex.
>WHAT'S GREAT ABOUT REST?!
>-------------------------------------
>
>It turns out that the best argument for REST is this: *there are no
>applications you can think of which cannot be made to fit into the GET
>/ PUT / POST / resources / representations model of the world!*
Well, hold on there. Didn't you get my last email? This isn't really my position, though I've used it at times to make a
point. It's true that GET/PUT/POST/DELETE are extremely powerful and suitable for what most people need. But I'm
not saying new things won't be required later. TAKE is a good example that you and I discussed; atomic
GET+DELETE.
Also, if there's a good reason to extend HTTP's method semantics that is not backwards-compatible with existing
methods, a new method may be required, ala M-* and PEP-*.
BTW, you may want to talk about security in this section (assuming you're going to be maintaining this note in some
permanent form).
>Coordination languages are elegant, simple, and powerful. Viewing
>HTTP as such a coordination language --- reconsidering your app in
>terms of the provided interfaces and semantics rather than trying to
>figure out how to subvert or extend HTTP to encompass what you think
>your application semantics are --- is a useful and powerful
>perspective.
Amen.
>Furthermore, there's a real impedance mis-match between the design
>perspectives of the OOP / IT developer communities and REST;
>RPC-over-HTTP does not have this problem. It's a *really attractive*
>proposition to the OOP / IT guys to think of taking an existing object
>model and, with no or minimal Web-specific "glue", simply exporting
>those interfaces to the Web. (The problems creep in down the road;
>Adam Bosworth's frequent comments on the implicit state transitions in
>using APIs are particularly pertinent. His solution appears to be,
>rather than use generic interfaces, extend interface descriptions to
>encompass the state transition model of the API. Ick.)
HTTP can do state transitions as a special case.
GET - find out what state I'm in
PUT - go to this state absolutely
POST - transition from current state to a subsequent state
This could be implemented as a generic container. You could,say, specify the state model with an XML document with
which the container would be instantiated.
> Now, doubtless, there's a lot of servlet and Web
>development knowledge out there; but most enterprise developers, data
>modellers, etc. I know still live in UML- and OOP-land, and this is as
>significant a change as the procedural->object transition of a decade
>or so ago.
Agreed.
>*is*, how to design to it, and why it's a good thing. On the other
>hand, the REST community should work with the Web Services community
>to ensure that things like WSDL, UDDI, etc. are sufficiently rich to
>be useful in the REST model of the world... these are two different
>design styles, informed by different needs and values, but they should
>share a technology base to the largest extent possible.
I'm doing my part to make sure in all this RPC noise, that something REST-friendly emerges, viz a vis my bitching about
the SOAP 1.2 HTTP binding.
>I'm sold; I just wish there was a larger body of literature about
>REST out there already.
You and me both. 8-)
> Would've saved some painful flaming with Roy
>and lots of interaction with Mark on my part... ;-) (Where's Dave in
>all this???)
Hopefully keeping an open mind. He's done a great job so far, putting up with me. You try him now. 8-)
MB