我目前在一個新的網站設計版本API的過程。我瞭解如何命名空間的路線,但我堅持在模型中實現版本化方法的最佳方式。API版本
下面的代碼樣品使用Rails框架,但問題的原則應該是大多數Web框架保持一致。
的路線目前看起來是這樣的:
MyApp::Application.routes.draw do
namespace :api do
namespace :v1 do
resources :products, :only => [:index, :show]
end
end
end
而且控制器:
class Api::V1::ProductsController < V1Controller
respond_to :json, :xml
def index
respond_with @products = Product.scoped
end
def show
respond_with @product = Product.find(params[:id])
end
end
所以,很顯然,我們只是暴露可在這裏的產品屬性,此解決方案,如果你的偉大工程」只會有一個版本的API。當你想要發佈V2和V2需要重新實現產品名稱的顯示方式時(在保持與V1的向後兼容性的同時 - 至少在短期內),會發生什麼?
據我看到它,你有兩個選擇......爲V1
- 拖放支持立即處理的後果(最壞可能的解決方案)
- 你開始重寫to_ [格式]的方法(我敢肯定你附上as_ at [格式]做到這一點,但是這是題外話),包括一個新的屬性...
name_2
- 這似乎也同樣愚蠢 - 執行某種代理類是隻負責曝光我們之後的方法
- 個讓視圖來處理建立某種哈希的版本控制器,並呼籲
to[format]
...
三,四都是我倒認爲唯一的使得任何形式的感...三個看起來會如:
# model
class Api::V1::Product < Struct.new(:product)
def to_json
attributes.to_json
end
def to_xml
attributes.to_xml
end
private
def attributes
{:name => product.name} # add all the attributes you want to expose
end
end
# Controller
class Api::V1::ProductsController < V1Controller
respond_to :json, :xml
def show
respond_with @product = Api::V1::Product.new(Product.find(params[:id]))
end
end
過去有其他人做過什麼?
這是一個非常好的解決方案 - 我沒有想到... – Coop