2012-02-08 82 views
10

我正在研究在ASP.NET MVC 3中開發應用程序,並且希望同時提供一個公共API。ASP.NET MVC應用程序的版本控制REST API

從環顧四周,似乎有兩種方法可以解決這個問題。要麼創建一個API區域並使控制器返回json/xml。或者使用動作過濾器和一組前端控制器,並根據請求頭返回json/xml/html。

我想要做的更晚,但我想知道如果你走這條路線你怎麼可以去版本化你的api?

如果你走的第一條路線,你可以很容易地創建一個v1/v2控制器,但如果你以後做,你怎麼能版本?

回答

3

您可以選擇兩條路線之一 - 您可以在路線中包含API(而不是http://app.lication/category/1,您將擁有類似http://app.lication/api/v1/category/1的東西),也可以包含custom HTTP header

兩者都將允許您區分正在調用哪個版本。

+0

關於選項1 - 你能詳細點嗎?在執行OP所要做的事時,如何做到這一點並不明顯 - 根據請求頭返回json/xml/html的一組控制器。因爲大概他不想在他的html網址中使用'/ v1'。 – 2012-02-08 17:12:39

+0

@GabeMoothart - 你會使用ASP.Net路由(http://msdn.microsoft.com/en-us/library/cc668201.aspx)來定義/提取URL參數。將API作爲路徑的一部分並不意味着您需要爲每個API都有一個控制器(如果這些API完全不同,也不排除它)。 – 48klocs 2012-02-08 18:21:07

10

版本控制是一個相當複雜的問題。以下是我之前看過的方式:

  1. URL。在這種情況下,https://api.example.com/v1/projects被假定爲與http://api.example.com/v2/projects不同的資源,儘管情況並非如此。 Basecamp似乎這樣做。遵循這種方法,假設你將永遠需要支持舊的API。
  2. 接頭。這些URL保持不變,但是,客戶端會傳遞額外的HTTP標頭,例如X-MYAPI-VERSION,每個請求都帶有一個標識要使用的API版本的值。 Google Documents List API這樣做。這種方法的一個潛在問題是HTTP頭可能被客戶端和服務器之間的中介剝離。
  3. 參數。爲了規避選項2的問題,您可以傳遞API版本以用作參數(例如https://api.example.com/projects?v=3)。
  4. 媒體類型。這裏您的URL保持不變,但是,用戶需要使用accept和content類型標題指定資源的表示形式。例如,可以使用「application/vnd.mycompany.resource [-version] [+ format]」給出您的「application/vnd.mycompany.project-v1 + json」的表示,以便爲v1 json或「 application/vnd.mycompany.project-v1 + xml「for v1 xml。當您需要新版本的項目時,MIME類型可能如下所示:「application/vnd.mycompany.project-v2 + xml」。 Github似乎支持。
  5. 有效載荷的一部分。在這種情況下,請求的有效載荷包含要使用的版本號。例如,當傳遞XML時,可以查看命名空間以確定正在使用哪個版本的API。對於JSON,您可以使用「$ version」或「_version」屬性來指定版本。
  6. 客戶端密鑰。當應用程序註冊時,它指定了它想要使用的API的版本。在對客戶端進行身份驗證時,確保您模擬要使用的版本。
  7. 沒有明確的版本總是有選擇不版本的API,並嘗試通過使各領域的可選透明地處理變化,妥善處理他們,他們丟失的情況。無論如何,你可能會這樣做,使未來版本的API與你今天開發的版本兼容。

許多建議選擇4,雖然它並不總是可行的。大多數這些選項需要額外的工作才能使用ASP.NET MVC。

+2

如果您有興趣的方法#1(我的偏好),然後看看這個NuGet包和對應的代碼/ GitHub上的例子:https://www.nuget.org/packages/VersionedRestApi/1.0.0.2 – jakejgordon 2015-11-07 15:05:28

+0

對進場# 2(我的偏好),用戶代理將是這種方法(http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.43)右頭。 「該字段可以包含多個產品標記(第3.8節)以及標識代理的註釋以及構成用戶代理的重要部分的任何子產品」 示例爲:User-Agent:YOUR_API_ID/2.0 – 2015-11-18 15:29:00

+1

我不同意使用用戶代理版本API。規範是指客戶端產品。例如,連接到HTTP服務器的瀏覽器。當客戶端的應用程序開發人員使用User-Agent指定其客戶端時,它具有更多的好處,以便我們可以從客戶端角度跟蹤API使用情況。 AppX/1.1在對MyAPI v1.1的某些調用失敗時非常有用,但AppX/1.2不支持。你會失去那種跟蹤。 – bloudraak 2015-12-06 05:54:59

相關問題