views:

61

answers:

4

Suppose you are working on an API, and you want nice URLs. For example, you want to provide the ability to query articles based on author, perhaps with sorting.

Standard:

GET http://example.com/articles.php?author=5&sort=desc

I imagine a RESTful way of doing this might be:

GET http://example.com/aritcles/all/author/5/sort/desc

Am I correct? Or have I got this REST thing all wrong?

+2  A: 

You are mostly right. The thing with REST api's is to focus on the nouns.

What does the noun all do in this case? Wouldn't you expect your API to always return all articles, unless you filter it?

I would make sort a query string parameters, further, I would make any and all filtering query string parameters. If you look at how Stack is implemented when you click on the "Newest" questions link, you get a query string to filter the questions.

So perhaps something like:

GET http://example.com/aritcles/authors/5?sort=desc

But also think about what happens with each URL:

GET http://example.com/aritcles/ might return all current articles

GET http://example.com/aritcles/authors/ What does this url do? does it return all authors of all articles, or does it return all the articles for all authors (which is essentially the same functionality of the URL above.)

GET http://example.com/aritcles/authors/5/ might return all articles by author 5, or does it return author 5's information?

I would maybe change it to:

http://example.com/aritcles returns all articles
http://example.com/aritcles/5 returns all articles from author 5
http://example.com/authors returns all authors
http://example.com/authors/5 returns information for author 5

Alan
`http://example.com/aritcles` might be a better URI for a collection resource than `http://example.com/aritcles/`.
PartlyCloudy
The important thing to focus on with REST apis is the media-types, their content and the links between the content.
Darrel Miller
`all` is a perfectly good noun. I'd expect a page worth of data. Just like google doesn't download the entire internet if I <a href="http://www.google.com/search?q=the">search for the word "The"</a> :-)
mogsie
+2  A: 

Hello,

Alan is mostly right but his URLs are misleading. I believe the correct routes / urls should reflect the following behavior:

[GET] http://domain.com/articles #=> returns all articles (index action)
[GET] http://domain.com/articles/5 #=> returns article ID 5 (show action)
[GET] http://domain.com/authors/#=&gt; returns all authors (index action)
[GET] http://domain.com/authors/5 #=> returns author ID 5 (show action)
[GET] http://domain.com/authors/5/articles OR http://domain.com/articles/authors/5 #=> depending on the hierarchy of your routes (both belong to the index action)

Best regards, DBA

DBA
Can we qualify this answer and say these are the "correct urls" for serving representations from Rails? REST, the architectural style, provides has no such constraints.
Darrel Miller
My answer had rails in mind, in line with the question's tag list.
DBA
ILL SHOW YOU WHO IS MISLEADING WHO!
Alan
jk. +1 for the RoR specific answer.
Alan
+4  A: 

I'm afraid your question really misses the point of REST. From a purely theoretical perspective there is absolutely no advantage or disadvantage to either of those urls from a REST perspective. In practice, those urls may behave differently with different caches, and certainly server frameworks are going to parse them differently. Despite what you hear from the framework developers, there is no such thing as a RESTful URL.

From the perspective of REST those two URLs are simply identifiers that can be dereferenced. If you want to start building REST apis that will benefit from the characteristics described in the dissertation, you need to start thinking in terms of content that is returned when you dereference the URL and how that content is linked together using URLs embedded in the content.

I realize this does not help you much in trying to resolve what you consider to be your problem. What I can tell you is that one of the major intents of REST is to allow your URLs to be completely under the control of the server and can change without impacting your client applications. Therefore, my recommendation is to pick whatever url structure works most easily with the framework you are using to serve the resource representations. Certainly do not look to the REST dissertation to tell you what is the right and wrong way of formatting your URLs and anyone who tells you that your URLs are not RESTful is confused. Probably what they are telling you is the server framework, they are used to using for creating RESTful interfaces, requires URLs to be structured this way.

It's not what your URI looks like that matters, it is what you do with it that matters.

Darrel Miller
+1 great points, but, they more "intuitive" your URLs are, the easier it is for clients to consume them.
Alan
In a feel good, documentation kind of way I agree. However, clients should really be looking at the link relation, not the URL to decide which URI to follow.
Darrel Miller
+1 Key take-away from the REST philosophy
bjg
+2  A: 

Using a query string is not more or less RESTful than using path components. The URI Generic Syntax (RFC 3986, January 2005) defines that they're just as important in identifying the resource. So yes, as others point out, it's not important to REST. (Note that in the obsoleted-by-RFC-3986 RFC 2396, the query string was not defined to be identifying the resource, but rather a string of information to be interpreted by the resource.)

However, URI design is important, because as an owner of a URI namespace (i.e. the holder of the domain name where the URIs will live) you want the URIs to be long lived. As wise men have stated earlier: Cool URIs don't change!

The choice of using query strings vs path components depends on how your resources are identified, and how they will be identified in years to come. If there's a hierarchy that stands out, then it might be that this should be reflected in the URI, at least if that hierarchy is relatively permanent, and that things don't move around all the time.

It's also important to note that the actual URIs are only meaningful to two parties:

  • Servers, who need to forge and parse URIs
  • Human beings who might see a URI in passing might learn things from the URI.

By contrast, client applications are usually not allowed to do URI introspection. So your choice of query strings vs path components boils down to what you think you can live with ten (or 100) years from now.

mogsie
My answer to a different question has some insight wrt putting stuff into URIs, e.g. database primary keys:http://stackoverflow.com/questions/3251986/what-are-recommended-programming-patterns-for-passing-identifiers-keys-between-se/3259286#3259286
mogsie