如何在Play Framework(2.4.x)中的网址中干净地处理api版本?

Sof*_*fia 2 scala playframework

因此,目前我的路线文件是一系列带有硬编码版本的路线。

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])
Run Code Online (Sandbox Code Playgroud)

我定义了大约30条路线。现在,我想支持其他版本。我以为我可以这样做:

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

但是它不起作用,如果我用$定义它

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

然后它抱怨我在controller方法中没有版本参数。除了在每个控制器方法中指定版本之外,还有其他方法吗?

如果不是,是否有一种方法可以某种方式自动为所有受支持的版本生成路由(假设现在它们具有相同的定义)?

mar*_*ira 5

关于是否应该使用URL来对HTTP(REST)API进行版本控制的讨论很多,就像在使用路径前缀一样。但是,如果您确定URL版本控制是解决问题的正确答案,则可以通过将路由拆分为多个文件来更轻松地实现这一目标。

这样,您将拥有以下conf/routes文件:

# SomeController.index is an endpoint which is not versioned
GET    /      controllers.SomeController.index
->     /v1    api.Routes
Run Code Online (Sandbox Code Playgroud)

而且,您将拥有一个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])
Run Code Online (Sandbox Code Playgroud)

我们在这里所做的基本上是创建v1指向中定义的API路由的path()api.routes。然后,当您决定需要时v2,只需编辑子路由前缀。