当您希望http://localhost:3000/api/users/1(例如)在不使用代理服务器程序的情况下转到 routes.rb 中定义的 api 命名空间时,下面是更简单的代理 api 代码。
在生产中,它类似于http://api.sample.com/users/1。
库/代理.rb
require 'rack-proxy'
class Proxy < Rack::Proxy
def perform_request(env)
request = Rack::Request.new(env)
if request.path =~ %r{^/api}
#do nothing
else
@app.call(env)
end
end
end
配置/应用程序.rb
config.middleware.use "Proxy"
配置/路由.rb
namespace :api, defaults: { format: :json },
constraints: { subdomain: 'api' }, path: '/' do
scope module: :v1, constraints: ApiConstraints.new(version: 1, default: true) do
resources :users, :only => [:show, :create, :update, :destroy]
end
lib/api_constraints.rb
class ApiConstraints
def initialize(options)
@version = options[:version]
@default = options[:default]
end
def matches?(req)
@default || req.headers['Accept'].include?("application/vnd.sample.v#{@version}")
end
end