如果我有一个URL字符串,请说https://localhost/users/45
,并且我在Play Framework 2.3项目中有一个类似于
GET /users/:id UserController.get(id:Long)
如何验证/解析该URL并从中获取ID?我实际上知道我要检查的特定路线/呼叫。我真正想做的是反向反向路由,如下所示:
routes.UserController.get_parse(url) match {
case (id:Long) => println("Use the data")
case _ => throw Exception("Bad URL")
有没有这样做的机制?
答案 0 :(得分:2)
在您考虑实施REST /超媒体API之前,请求似乎很奇怪。
假设路线文件是
GET /foo/:id/bar Foo.bar(id)
有人将{"data":"something", "parent": "/foo/5/bar"}
张贴到/foo/123/bar
。
Play会从请求网址/foo/123/bar
中提取id参数(例如,对于内部数据库ID),但是您可以为解析/foo/5/bar
做同样的事情吗?
简短回答
不,你不能使用routes文件。
答案很长
在路线文件中,Play会生成转换代码
string =>调用带参数的控制器方法
controller method identifier + arguments =>串
你想要的是
string =>控制器方法+参数
controller method identifier + string =>参数
一些缺点:
#3不是类型安全的。
#4含糊不清。多个路由规则可以引用相同的方法。您可以尝试该控制器方法的所有规则,虽然这更复杂,默认参数可能是一个问题。
在任何情况下,路由编译器都不会生成合适的代码。它要么不存在,要么限制访问。
例如,routes-compiler使用
之类的东西生成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]
会阻止它。
答案 1 :(得分:0)
Play的路由器会自动验证网址(也是针对参数类型),因此您不需要在操作中进行额外的验证。即如果你打电话给/users/some-string
它会抛出404 Not found ...