Putting the version in the URI is a "variant" resource just like adding .xml or .json . If you want the ability to get to a specific representation in a browser (as opposed to a custom client) you can't rely on content negotiation because browsers hard code their accepts clause.

REST is media type centric and so I agree that the preferred way for a client to get a version it understands should be via content negotiation against unversioned permalinks. I recommend representations generally use unversioned URIs in most links for this purpose. I use rel=bookmark to explicitly mean the unversioned permalink of a resource. It's really easy to write a client this way: the client should look at the version info document and determine the media types the API requires and create client code for those media types and form a static accepts clause for all the media types it supports and navigate around the unversioned links.

Browsers can't do this, though. If that's all you do, a developer can't manually inspect payloads in a browser. The versioned variants exist mainly for this purpose. We should STRONGLY discourage clients from persisting versioned links as they will all break over the long haul if we EOL older versions of things.

Jorge & company have solved how to implement this easily using Repose. It basically rewrites requests, so the service only implements it one way, but you get both for free.

On 10/11/2011 08:14 AM, George Reese wrote:
Versioning should not be included in the URI. It belongs in the headers. A URI 
should be a persistent reference to a resource. As such, versioning always 
breaks that persistent reference.

-George

On Oct 11, 2011, at 1:40 PM, Brian Waldon wrote:

I'm all for exposing only the major version in the URI (/v1). We have fallen 
into a trap with v1.0 and v1.1 as they are not backckwards-compatible specs 
while their versioning implies they are. I think we can have a whole separate 
discussion on how to solve that problem, so like I said earlier, I would like 
to get buy-in on my original proposal before we move on to spec-specific 
details.

Thanks for the great input, guys!

Waldon


On Oct 11, 2011, at 2:12 AM, Bryan Taylor wrote:

On 10/11/2011 12:26 AM, Mark Nottingham wrote:
Where would these versions show up? In URLs? In documentation? In
response payloads?

If they show up in URLs, then every backwards-compatible change would
be made into a backwards-incompatible change. E.g., if you had

http://www.example.com/v1.2.3/foo

as a resource, and adding a new resource .../bar bumps it to v1.2.4,
then that backwards-compatible change (because it doesn't break old
clients) now causes everybody to break.

Right. This is a trap to be avoided.

The only sensible thing to put in URIs is a major version identifier
that indicates backwards-incompatible changes (i.e., the slate is wiped
clean, it's a different URL tree). E.g.,

http://www.example.com/v1/

Of course, that can be any arbitrary string, whether it be "v1" or
"v1.1" or "essex". However, putting "v1.1" in there is going to confuse
people, because most people believe that a minor release is, by nature,
backwards compatible.

I like just plain old v1 as it's short and sweet.

If we want to just use them in documentation, there's no harm, of
course. Likewise, the client could query the server to find out what it
supports, but something more descriptive than a linear version number
would be useful; e.g., some sort of linked capability catalogue format.

We are usually putting a version info resource at the version root, eg:
http://www.example.com/v1/

See here for how compute is doing it:
<http://docs.openstack.org/trunk/openstack-compute/developer/openstack-compute-api-1.0/content/ch03s09.html>

Unfortunately the example uses "v1.0" and is confusing as you noted above.

An idea I've dabbled with is putting the major and minor version number
in the WADL filename. It'd be a good addition to WADL to allow it to express 
what
version it is in its conent.


_______________________________________________
Mailing list: https://launchpad.net/~openstack
Post to     : openstack@lists.launchpad.net
Unsubscribe : https://launchpad.net/~openstack
More help   : https://help.launchpad.net/ListHelp
This email may include confidential information. If you received it in error, 
please delete it.




--------------------------------------
Brian Waldon
Cloud Software Developer
Rackspace Hosting



_______________________________________________
Mailing list: https://launchpad.net/~openstack
Post to     : openstack@lists.launchpad.net
Unsubscribe : https://launchpad.net/~openstack
More help   : https://help.launchpad.net/ListHelp

--
George Reese - Chief Technology Officer, enStratus
e: george.re...@enstratus.com    t: @GeorgeReese    p: +1.207.956.0217    f: 
+1.612.338.5041
enStratus: Governance for Public, Private, and Hybrid Clouds - @enStratus - 
http://www.enstratus.com
To schedule a meeting with me: http://tungle.me/GeorgeReese


This email may include confidential information. If you received it in error, 
please delete it.


_______________________________________________
Mailing list: https://launchpad.net/~openstack
Post to     : openstack@lists.launchpad.net
Unsubscribe : https://launchpad.net/~openstack
More help   : https://help.launchpad.net/ListHelp

Reply via email to