Skip to content

Instantly share code, notes, and snippets.

@oisin
Created May 2, 2011 23:36
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save oisin/952572 to your computer and use it in GitHub Desktop.
Save oisin/952572 to your computer and use it in GitHub Desktop.
API version checking using Sinatra's before filter
require 'sinatra'
# Set the version of the API being run here
#
MAJOR_VERSION = 1
MINOR_VERSION = 0
helpers do
def version_compatible?(nums)
return MAJOR_VERSION == nums[0].to_i && MINOR_VERSION >= nums[1].to_i
end
end
# Enforce compatibility before the call. Rewrite the
# URL in the request to remove the API versioning stuff
#
before %r{/api/v(\d)\.(\d)} do
if version_compatible?(params[:captures])
target = request.fullpath.split('/').last
request.path_info = "/#{target}"
else
halt 400, "Version not compatible with this server"
end
end
# Reach this route using
# http://localhost:4567/api/vX.Y/hello
#
get '/hello' do
"Hello there, compatible client."
end
@leereilly
Copy link

Thanks for this. I had problems further down the resource chain i.e. http://localhost:4567/api/people/ would work using this code, but http://localhost:4567/api/people/1/phones/23/ would not. I put a small fix together @ https://gist.github.com/987094 that allows for nested resources.

@oisin
Copy link
Author

oisin commented May 23, 2011 via email

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment