关于scala:Play框架路由中的非捕获通配符

 2021-04-26 

Non-capturing wildcards in Play Framework routes

我正在通过Play公开一个HTTP API,并且为了管理破坏兼容性的更改,URL包含版本号。目前,它如下所示:

1
GET   /api/v1/someMethod       com.foo.Api.someMethod()

当我对其中一种方法的输出进行更改时,我想支持v2。尽管对于大多数方法而言,其行为是相同的,所以我不在乎使用哪个版本。我试图将上面的行修改为:

1
GET   /api/v:version/someMethod       com.foo.Api.someMethod()

但是Play无法编译它,错误为Missing parameter in call definition: version

我知道我没有在通话中使用version参数-因为我不需要!是否有一种明智的方式来实现我的目标,或者让Play跳过此检查,或者将通配符放在未被捕获为参数的路由中?

(我想如果不能的话,可以将参数添加到方法定义中,然后将其忽略。但是如果可能的话,我宁愿避免这样做。)


试着解决这个问题已经有一段时间了,我怀疑这是不可能的。

最大的症结是反向布线。 Play希望我能够在模板中使用@routes.com.foo.Api.someMethod,并将其解析为将调用该方法的URL。 (实际上,我是在我的API文档中做到这一点的)。如果我的上述建议中的任何一个都被接受,则与该方法相对应的实际URL是任意的。

我想我真正想要的是该方法具有规范的URL,但对于其他类似的模式也应视为匹配项。我接受Play不提供此功能作为相对简单的routes文件语法的一部分,并且我必须自己完成此操作(例如,通过使用两种模式,最终使用通配符,但不直接调用相同的方法)。 >