Ruby on rails Rails API的版本控制
我已经四处搜索了几天,试图弄清楚我是否对rails api进行了适当的版本控制。我还没有找到一个好的答案来帮助我适应目前的方法。因此,我决定去stackoverflow听取我的同事们的意见。让我们看一些代码: 首先,我在Ruby on rails Rails API的版本控制,ruby-on-rails,ruby,api,versioning,Ruby On Rails,Ruby,Api,Versioning,我已经四处搜索了几天,试图弄清楚我是否对rails api进行了适当的版本控制。我还没有找到一个好的答案来帮助我适应目前的方法。因此,我决定去stackoverflow听取我的同事们的意见。让我们看一些代码: 首先,我在routes.rb中向我的api添加了一个名称空间:api,其子域为“api”。我还为v1添加了一个作用域 require 'api_constraints' HostApi::Application.routes.draw do # Api Definition na
routes.rb
中向我的api添加了一个名称空间:api
,其子域为“api”。我还为v1
添加了一个作用域
require 'api_constraints'
HostApi::Application.routes.draw do
# Api Definition
namespace :api, defaults: { format: :json }, constraints: { subdomain: 'api' }, path: '/' do
# Scoping Api Version
scope module: :v1, constraints: ApiConstraints.new(version: 1, default: true) do
# resources here
end
end
end
我想让那些点击api的人返回当前的默认版本,除非他们通过标题指定不同的版本。为了处理这个问题,我在lib目录中创建了一个api\u约束
用于测试的lib/api_约束.rb
和lib/spec/api_约束.rb
class ApiConstraints
def initialize(options)
@version = options[:version]
@default = options[:default]
end
def matches?(request)
@default || request.headers["Accept"].include?("application/vnd.host_api.v#{@version}")
end
end
我的考试通过了,一切都很好。我好奇的是当我开始添加版本2,3,4时;它们的作用域是否可以与v1
的作用域相同?例如:
require 'api_constraints'
HostApi::Application.routes.draw do
# Api Definition
namespace :api, defaults: { format: :json }, constraints: { subdomain: 'api' }, path: '/' do
# Scoping Api Version
scope module: :v1, constraints: ApiConstraints.new(version: 1) do
# resources here
end
scope module: :v2, constraints: ApiConstraints.new(version: 2, default: true) do
# resources here
end
end
end
我可以想象,将v2
范围中的passing default true更改为ApiConstraints
,现在可以将其设置为默认响应(当版本未通过头请求时)。我理解正确吗?有没有比这更好的方法来处理这个版本?非常感谢您的想法、想法、意见
附带问题。我还将routes.rb
文件中的Rails.application.routes.draw
更改为HostApi::application.routes.draw
。这通常是我看到其他人所做的,但我不确定这样做的好处是什么。如果有人能帮我详细说明,我将非常感激。提前感谢所有花时间帮助我理解这一点或只是分享他们想法的人 我在我的项目中使用了相同的ApiConstraints
,当您尝试使用非默认版本而不指定Accept
标题时,它会崩溃
我在测试中添加了以下案例(导致崩溃):
我修复了ApiConstraints
:
def matches?(req)
@default ||
(req.respond_to?('headers') &&
req.headers.key?('Accept') &&
req.headers['Accept'].include?("application/vnd.host_api.v#{@version}"))
end
希望有帮助 我在我的项目中使用了相同的
ApiConstraints
,当您尝试使用非默认版本而不指定Accept
标题时,它会崩溃
我在测试中添加了以下案例(导致崩溃):
我修复了ApiConstraints:
def matches?(req)
@default ||
(req.respond_to?('headers') &&
req.headers.key?('Accept') &&
req.headers['Accept'].include?("application/vnd.host_api.v#{@version}"))
end
希望有帮助