2017-03-29 60 views
1

所以目前我的路由文件是一系列硬編碼版本的路由。如何在Play Framework(2.4.x)的url中乾淨地處理api版本?

GET /v1/companies/$id<[-a-zA-Z0-9]+>/etwasX controllers.Company.etwasX(id:String, q: Option[String]) 
GET /v1/companies/$id<[-a-zA-Z0-9]+>/etwasY controllers.Company.etwasY(id:String, q: Option[String]) 

我有大約30條定義的路線。現在我想支持不同的版本。我以爲我可以簡單地這樣做:

GET /v<[0-9]+>/companies/$id<[-a-zA-Z0-9]+>/etwasX controllers.Company.etwasX(id:String, q: Option[String]) 

但它不工作,如果我把它定義一個$

GET /v$version<[0-9]+>/companies/$id<[-a-zA-Z0-9]+>/etwasX controllers.Company.etwasX(id:String, q: Option[String]) 

然後抱怨我沒有在一個版本參數控制器方法。除了在每個控制器方法中指定版本之外,還有其他方法嗎?

如果沒有,有沒有辦法我可以以某種方式自動生成所有受支持版本的路由(現在假設它們具有相同的定義)?

回答

2

關於HTTP(REST)API是否應該使用URL進行版本控制,使用路徑前綴(像您正在做的那樣)有很多討論。但是,如果您決定URL版本控制是您的案例的正確答案,則可以通過splitting your routes in multiple files更輕鬆地實現該目標。

這樣的話,你將有以下conf/routes文件:

# SomeController.index is an endpoint which is not versioned 
GET / controllers.SomeController.index 
->  /v1 api.Routes 

而且也,你將有一個conf/api.routes文件有以下幾點:

GET /companies/$id<[-a-zA-Z0-9]+>/etwasX controllers.Company.etwasX(id:String, q: Option[String]) 
GET /companies/$id<[-a-zA-Z0-9]+>/etwasY controllers.Company.etwasY(id:String, q: Option[String]) 

我們這裏做的是基本建立到api.routes中定義的API路徑的路徑(v1)。然後,當您決定需要v2時,您只需編輯您的子路線前綴。

+0

我無法將V2添加到相同的conf/routes文件中。 正如在這個要點:https://gist.github.com/jonandersen/4f60c47746de388dc9636a082b5ac30f 有沒有辦法在同一個應用程序中支持多個版本? –