I don’t know why I always had this picture in my mind. When I think of SOAP, I would think of a typical public company and its IT department in a never-ending integration dilemma. When I think of REST, I would mistakenly visualize some recently hacked social networking site or web2.0 application surviving on Google ads. I don’t know where that image came from, and but I know its not fair and not always true.
SOAP wasn’t the easiest or the best, but there wasn’t anything better - up until REST emerged, when suddenly people started typecasting SOAP as bulky and over-engineered for most problems. I went with the crowd. If SOAP WS was the protocol of the Enterprise, REST brought a new set of developers to the game. REST was the protocol of the get-it-done and we-will-see believers.
While I have been consuming RESTful web services for a couple of years now, I hadn’t actually designed and implemented one yet. But I knew HTTP, so I thought I knew REST. Just represent a resource in the URL and let different actions be invoked on it. If you use REST, you probably are using Rails or Grails or Django or the likes. That makes it even easier. Just make your domain object addressable through the URL, and thats all. We will address the other concerns in future iterations.
But once I started writing one myself, I started digging into books and articles and discussions looking for technical details of the RESTful world. But all I saw was a mostly bewildered crowd and a small creative bunch that has already embraced REST. And all advices and guidelines I could read was purists and fanatics who stamp this is Low REST, this is High REST, this is POX (Plain Old XML), this is unRESTfully REST, this is RESTfully unREST. I don’t understand why RESTful Quotient is so overemphasized. Who the hell do you think anyone cares what Roy Fielding meant by REST in 2000? We just care about RESTful web services over HTTP, with an emphasis on every word except REST. For me RESTful services means a way where I can expose some functionality through the URL. Whether I want to be disciplined about what I call resources is my design, but REST as an architecture style would have to answer me my enterprise concerns.
For me, a webservice - whether it is RPC or SOAP or REST, should have to answer the same enterprise concerns. The difference is only how they approach it:
1. Simple: Ok, REST is simple. REST is simple if you are talking about the barest minimum it takes to get it up and running.
2. Secure: There are new Standards like OAuth, and HMAC-based Authentication, that makes REST a little too complex but they solve only a limited set of problems and scenarios. How do you secure your resource? If you are POSTing or PUTing an XML file, how do you secure it? How can you keep talking about REST without talking about authentication mechanism for XML or any data exchange format for that matter? That takes us back to the SOAP envelope and WS Security or something similar, doesn’t it?
Developers work on tight deadlines, since security isn’t a builtin aspect of REST, developers tend to sacrifice it to meet deadlines, just like they used to do with JUnit. That makes a REST security practically a nice to have. The few of the REST services that I have used all dealt with critical information, but one of them didn’t even have a basic authentication, one had Basic and at the most it had Basic over SSL.
3. Transactional: Is a resource the correct unit of transaction? What if you need to deal with transactions across multiple resources? Do you handle that on the serverside or let the client handle it? If I make a convenience API to deal with transactions and expose it as URL, would you blame me for breaching the RESTful contract? How important is being truly RESTful? Does REST even want to address transactions or is PUT and POST on a resource enough?
4. Efficient: How can it be efficient without support for complex transactions? Whether it is REST or not, webservices are to provide the clients an appropiate control to their assets, and it should be reasonably fast. Again, is providing the necessary functionality important or is being RESTful important? How do I CRUD on a collection of resources? Most of the RESTful public APIs that I have used either provide me too much (they are painfully slow) or provide me too less. What I need is information, and it could be across multiple resources.
Is RESTful service anything more than pretty URLs taking and returning XML/JSON? Does it really make sense when I need information and action across resources? Is it still fine if there is no API definition and keeps changing? Is it still fine if it only does the happy path well? How many developers know enough about REST to ensure that the standards that should have been specified and enforced by the architecture are met? Its scary that too many critical web services have already been written in REST just for the sake of ease, without putting too much thoughts on it.
I probably will never have to go back to SOAP again(its not my decision though), but the day REST has answered the important questions, it will look like some sort of SOAP WS stack - back to where we started.
Until then, REST is like fastfood. SOAP WS is a little tedious to cook, but you won’t regret it.