我有一个POST/PATCH
api,其中包含以下路由:
namespace :api, defaults: { format: 'json' } do
scope module: :v1, constraints: ApiConstraints.new(version: 1, default: true) do
resources :cars, only: [:create, :update]
end
scope module: :v2, constraints: ApiConstraints.new(version: 2) do
resources :cars, only: [:create, :update]
end
end
在api_constraints
我过滤掉了这样的请求:
class ApiConstraints
def initialize(options)
@version = options[:version]
@default = options[:default]
end
def matches?(req)
@default || req.headers['Accept'].include?("application/myname.myapp.v#{@version}")
end
end
现在我有一个旧客户端,它会在头请求中没有设置application / myname.myapp.v1而触发请求。这就是为什么我将默认请求指向v1。这适用于老客户。
但是,新客户端的请求也会由Api::V1::CarsController#create
处理,因为范围的默认设置为true:v1。我没想到这是因为在新客户端我肯定会像这样设置标题:
request['patch'](url)
.send(encodeURI(JSON.stringify(car_json)))
.set('Accept', 'application/json')
.set('Accept', 'application/myname.myapp.v2')
.set('Authorization', 'Token token=' + token)
为什么即使在ApiConstraints中我根据新标题过滤掉了新的控制器作用域,新请求也没有处理新的请求?