要在Play框架中解析/验证特定路由的URL的类?

时间:2014-11-24 18:33:07

标签: playframework playframework-2.3

如果我有一个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")

有没有这样做的机制?

2 个答案:

答案 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会生成转换代码

  1. string =>调用带参数的控制器方法

  2. controller method identifier + arguments =>串

  3. 你想要的是

    1. string =>控制器方法+参数

    2. controller method identifier + string =>参数

    3. 一些缺点:

      #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 ...