How are REST APIs versioned?

矫情吗;* 2022-08-05 02:43 260阅读 0赞

How are REST APIs versioned?

Posted on March 12, 2012, Modified on September 15, 2014

I am currently working on a REST API, and the question was raised, how are, and how should, REST APIs be versioned? Here are the results of my research.

It seems that there are a number of people recommending using Content-Negotiation (the HTTP “Accept:” header) for API versioning. However, none of the big public REST APIs I have looked at seem to be using this approach. They almost exclusively put the API version number in the URI, with the odd exception using a custom HTTP header. I am at somewhat of a loss to explain this disconnect.

Versioning strategies in discussions





















































































POST VERSIONING
Stack Overflow 1 URI
Stack Overflow 2 Content Negotiation
blog post by Jeremy Content Negotiation
ycombinator discussion some opinions both ways
Stack Overflow 3 Content Negotiation
Stack Overflow 4 Content Negotiation
notmessenger blog post URI (against all headers)
Peter Williams Content Negotiation (strongly against URIs)  
Apigee Blog post on API versioning URI (some discussion)
Mark Nottingham REST versioning Recommending essentially versionless extensibility with a HATEOS approach
Nick Berardi on REST versioning URI
Restify “Accept-Version” header
Tom Maguire on REST versioning Content Negotiation
Nicholas Zakas on Rest Versioning URI
Steve Klabnik on Rest Versioning Content Negotiation + HATEOS
Luis Rei on Rest Versioning Content Negotiation with (;version=1.0)
kohana forum discussion on REST versioning Many Opinions
Troy Hunt on REST versioning Accept Header but also support custom header and URL
Paul Gear REST versioning Recommending essentially versionless extensibility with a HATEOS approach




























































































































































































API NAME VERSIONING EXAMPLE
Twillo date in URI  
Twitter URI  
Atlassian URI  
Google Search URI  
Github API URI/Media Type in v3 Intention is to remove versioning in favour of hypermedia – current application/vnd.github.v3
Azure Custom Header x-ms-version: 2011-08-18
Facebook URI/optional versioning graph.facebook.com/v1.0/me
Bing Maps URI  
Google maps unknown/strange  
Netflix URI parameter http://api.netflix.com/catalog/titles/series/70023522?v=1.5
Salesforce URI with version introspection {
“label”:”Winter ’10”
“version”:”20.0″,
“url”:”/services/data/v20.0″,
}
Google data API (youtube/spreadsheets/others) URI parameter or custom header “GData-Version: X.0″ or “v=X.0″
Flickr No versioning?  
Digg URI http://services.digg.com/2.0/comment.bury
Delicious URI https://api.del.icio.us/v1/posts/update
Last FM URI http://ws.audioscrobbler.com/2.0/
LinkedIn URI http://api.linkedin.com/v1/people/~/connections
Foursquare URI https://api.foursquare.com/v2/venues/40a55d80f964a52020f31ee3?oauth_token=XXX&v=YYYYMMDD
Freebase URI https://www.googleapis.com/freebase/v1/search?query=nirvana&indent=true
paypal parameter &VERSION=XX.0
Twitpic URI http://api.twitpic.com/2/upload.format
Etsy URI http://openapi.etsy.com/v2
Tropo URI https://api.tropo.com/1.0/sessions
Tumblr URI api.tumblr.com/v2/user/
openstreetmap URI and response body http://server/api/0.6/changeset/create
Ebay URI (I think) http://open.api.ebay.com/shopping?version=713
Reddit No versioning?  
Groupon URI http://api.groupon.com/v2/channels//deals{.json|.xml}
Geonames    
Wikipedia no versioning I think?  
Bitly URI https://api-ssl.bitly.com/v3/shorten
Disqus URI https://disqus.com/api/3.0/posts/remove.json
Yammer URI /api/v1
Drop Box URI https://api.dropbox.com/1/oauth/request_token
Amazon Simple Queue Service (Soap) URI Parameter and WSDL URI &Version=2011-10-01
Youtube data API versioning URI https://www.googleapis.com/youtube/v3


















LIBRARY NAME VERSIONING EXAMPLE
node-restify semver versioning in an accept-Version header accept-version: ~3
Jersey description of how to do Accept: header versioning in Jersey Accept: application/vnd.musicstore-v1+json

SHARE THIS:

  • Share on Facebook
  • Click to share on Google+
  • Click to share on Twitter
  • Click to print
  • More

No related posts.

This entry was posted in Uncategorized by Tim Wood. Bookmark the permalink.

23 THOUGHTS ON “HOW ARE REST APIS VERSIONED?”

  1. Larry on April 16, 2012 at 7:50 pm said:

    The version of GitHub’s API that you link to is deprecated. The new version v3 does its versioning via content negotiation whereas the old one had it in the URI. The new approach is documented here: http://developer.github.com/v3/mime/

    BTW, I found this very useful. Thanks!

    Reply ↓

  2. Pingback: How are REST APIs versioned? | Lexical Scope | nodeJS and Web APIs | Scoop.it
  3. Pingback: How are REST APIs versioned? | Lexical Scope | Modern web development | Scoop.it
  4. Pingback: How are REST APIs versioned?
  5. John (@strife25) on November 15, 2012 at 2:57 pm said:

    Great list! I’ve also found the following article to be useful for API versioning strategies: http://blog.apigee.com/detail/restful_api_design_tips_for_versioning/

    Reply ↓

  6. Pingback: REST Fundamentals | planetgeek.ch
  7. Mizuki Oshiro on November 27, 2012 at 12:53 pm said:

    This is usually due to header-mangling and stripping. Mobile ISPs, proxy servers, some regular ISPs – they actually strip out headers from HTTP requests. So while content negotiation is a principally sound and proper way to do it, the realities of the world we live in require putting the version in the URI.

    Reply ↓

    • Tim Woodon November 29, 2012 at 12:41 pm said:

      Do you think it also has anything to do with people wanting to browse REST services in an ordinary web browser? I wondered if the difficultly of configuring the content-negotiation in most web-browsers might contribute to this.

      Reply ↓

      • Ionuț Tiberiu Stanon May 17, 2013 at 1:22 pm said:

        Think about API requests from JS (end user browser).

        Reply ↓

        • Tim Woodon May 17, 2013 at 1:49 pm said:

          I’m not sure I follow you. Are you saying it is easier to do it one way or the other from JS?

          Reply ↓

  8. Pingback: Revealing KijiREST: Resources | Kiji Community - Build Real-Time Scalable Data Applications on Apache HBase
  9. abhishek on June 12, 2013 at 6:52 am said:

    another reason why URI based versioning isnt right…

    http://bit.ly/14Vr4jc

    http://abhishek.pamecha.me/blogs/versioning-in-web-services/

    Reply ↓

  10. David Roncancio on June 21, 2013 at 5:13 pm said:

    I think another reason is an implementation reason, because its easier and cleaner to have some web server work as a proxy to take /v1/ -> v1 service implementation instead of handling it in the service itself with a buch of ifs, like if(version==1) -> v1 of the service implementation

    Reply ↓

  11. Pingback: REST Fundamentals | bbv Blog
  12. Owen Rubel on March 13, 2014 at 2:11 am said:

    Dont get bogged down by purists. Do what is simple, scalable and practical. Just because it may not fit a spec doesn’t mean it’s not better for your needs or your clients needs. After all, the biggest API users are using URI after all and they serve MILLIONs a day

    Reply ↓

  13. Ricardo Ruiz López on March 17, 2014 at 12:36 pm said:

    Hello!
    When an API is obsoleted, what do you do normally when you want to block an older version? What mechanism do you use?
    Thanks.

    Reply ↓

    • Fred Flintstoneon August 2, 2014 at 2:44 am said:

      you are talking about deprecation and you need to version both the api form and the api function; in other words, you need to do versioning on the api application as well as on the apiObject that establishes how the api request/response is handled for each related uri.

      Reply ↓

  14. Pingback: Decoupling API Versions From Codebase Versions | Haddad’s Journal
  15. Owen Rubel on June 25, 2014 at 3:30 am said:

    Found out after much reading that there is a good reason not to do versioning in header. forwards will not send header information properly and so it will often get lost. This is why alot of people after evaluation have stayed with versioning in the URI

    Reply ↓

    • BeosFreakon May 15, 2015 at 1:24 pm said:

      If that is the case then the forward is not being performed correctly. You would lose authorization, language, media types, etc.. Version belongs in the accept header. i.e. I accept this media type and this version.

      Reply ↓

  16. Pingback: El mekki anouar | API Versioning – Different Approaches to API Versioning (1)
  17. Pingback: RESTful APIs | LibreNMS development blog
  18. Pingback: Designer une API REST | OCTO talks !

Leave a Reply

发表评论

表情:
评论列表 (有 0 条评论,260人围观)

还没有评论,来说两句吧...

相关阅读

    相关 How(5) are(2) you(0)

    > 故事里有好人也有坏人 > 故事里有好事也有坏事 > 故事里有多少是是非非 > 故事里有多少非非是是 > 故事里的事说是就是不是也是 > 故事里的事说不是

    相关 restful api

    RESTful目前只知道有这样一种提法,没见有强制性的要求什么样的才叫RESTful。也没见有什么框架帮你来实现RESTful(刚才搜一下,好像有框架,轻量级框架,没用过),我

    相关 restful api

    简介 一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实