如果我有一个 URL 字符串,比如 https://localhost/users/45
,我的 Play Framework 2.3 项目中有一个看起来像这样的路由
GET/users/:id UserController.get(id:Long)
我如何验证/解析该 URL 并从中获取 ID?我实际上知道我要检查的具体路线/电话。我真正想做的是反向反向路由,像这样:
routes.UserController.get_parse(url) 匹配 {
case (id:Long) => println("使用数据")
case _ => throw Exception("Bad URL")
是否有某种机制可以做到这一点?
最佳答案
在您考虑实现 REST/超媒体 API 之前,这个请求看起来很奇怪。
假设路由文件是
GET /foo/:id/bar Foo.bar(id)
有人 POST {"data":"something", "parent": "/foo/5/bar"}
到 /foo/123/bar
。
Play 将从请求 URL /foo/123/bar
中提取 id 参数(例如,对于内部数据库 id),但是您可以为解析 /foo 做同样的事情吗/5/条
?
简短的回答
不,你不能为此使用路由文件。
长答案
Play从路由文件生成转换代码
string => 使用参数调用 Controller 方法
Controller 方法标识符 + 参数 => 字符串
你想要的要么是
string => Controller 方法 + 参数
Controller 方法标识符 + 字符串 => 参数
一些缺点:
#3 不是类型安全的。
#4 含糊不清。多个路由规则可以引用同一个方法。您可以为该 Controller 方法尝试所有规则,尽管这更复杂,并且默认参数在这里可能是个问题。
无论如何,路由编译器都不会生成合适的代码。它要么不存在,要么被限制访问。
例如,路由编译器生成 target/scala-2.x/src_managed/main/routes_routing.scala
类似
private[this] lazy val Foo_bar0_route = Route(
"GET",
PathPattern(
List(
StaticPart(Routes.prefix),
StaticPart(Routes.defaultPrefix),
StaticPart("/foo/"),
DynamicPart("id", """[^/]""", true),
StaticPart("/bar")
)
)
)
这可能有帮助,但 private[this]
阻止了它。
关于playframework - 用于解析/验证 Play 框架中特定路由的 URL 的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27111763/