How RESTful Are Web Frameworks That Claim REST Support?

There are plenty of web services platforms/application frameworks available today that support RESTful services to varying degrees. In a recent post Stefan Tilkov puts out a list of criteria that serves as a starting point in evaluating these frameworks and platforms.

He Proposes that, at a high level, the questions one must ask are are (the more “yes”s for the answers the closer a framework is to an ideal REST web application framework).

Does the framework respect that an HTTP message does not only consist of a URI? I.e., is dispatch done at least based on the HTTP verb, the URI, the Content-type and Accept headers?

Can I easily use the same business logic while returning different content types in the response?

Is there support for checking for conditional requests?

Are ETags calculated automatically if none are set by the backend logic?

Can I (as a framework user) easily read all HTTP request headers?

Can I easily set all HTTP response headers?

Can I use custom HTTP verbs?

Is it obvious and easy how to return correct status codes with responses, and does the framework use them correctly (if it does so at all)?

After reading Stefan's post I've had the same initiative asking around what web frameworks are really passing this test. So, far the answers I've got are:

- JAX-RS implementations- webmachine (Erlang/Basho)

While I'm not very familiar with either Django and Ruby on Rails, as far as I know both of them will have problems with at least the 1st test (and I think Django is not passing the 2nd test either, as it is more of an action based framework).

I would suggest adding HATEOS support to the list of REST framework criteria. I haven't seen a good framework yet that easily supports the idea of returning URIs to other resources without requiring you to write custom views that render your internal domain objects to "restful" responses. The Restfulie GEM in RoR is at least trying to provide an implementation but it isn't there yet.

For example, look at something like the Netflix API which appears to support HATEOS very well. I'm assuming they implemented a lot of custom code internally to get that behavior.

I just wanted to point out that RESTx is both Java and Python. Developers can write components (that can be used to create resources) in both languages and we're looking to add support for Groovy and Ruby, plus a JavaScript client.

It is still early days for the project but would love to get your feedback on it.

RESTx does support HATEAOS. It does so in two ways: First, all the components and resources on a server can be discovered just by following links. Secondly, component authors may use a built-in facility to store items, which can be viewed as a collection. If so desired, a request to this collection returns a list of all resources. When a new resource is created, the "202 Created" response is returned with a link to the new resource.