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

Playframework 类来解析/验证Play框架中特定路由的URL?,playframework,playframework-2.3,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)匹配{ 案例(id:Long)=>println(“使用数据”) 大小写=>抛出异常(“错误U

如果我有一个URL字符串,说
https://localhost/users/45
,我的Play Framework 2.3项目中有一条路径

GET/users/:id UserController.GET(id:Long)

如何验证/解析该URL并从中获取ID?我确实知道我要核对的具体路线/电话。我真正想做的是反向路由,类似这样:

routes.UserController.get_parse(url)匹配{
案例(id:Long)=>println(“使用数据”)
大小写=>抛出异常(“错误URL”)


是否有这样做的机制?

Play的路由器将自动验证URL(也针对参数类型)因此,你不需要在你的动作中做额外的验证。也就是说,如果你调用一个<代码> /用户/某个字符串< /代码>,它将抛出404个未找到…

< p>这个请求看起来很奇怪,直到你考虑实现一个REST/超媒体API。 假设路由文件是

GET /foo/:id/bar Foo.bar(id)
有人将
{“数据”:“某物”,“父项”:“/foo/5/bar”}
发布到
/foo/123/bar

Play将从请求URL
/foo/123/bar
中提取id参数(例如,用于内部数据库id),但您是否可以对解析
/foo/5/bar
执行相同的操作


简短的回答

不,您不能为此使用路由文件


长答案

从routes文件中,Play生成用于转换的代码

  • string=>使用参数调用控制器方法

  • 控制器方法标识符+参数=>字符串

  • 你想要的是

  • string=>controller方法+参数

  • 控制器方法标识符+字符串=>参数

  • 有几个缺点:

    #3不是类型安全的

    #4是不明确的。多个路由规则可以引用同一个方法。您可以尝试该控制器方法的所有规则,尽管这更复杂,并且默认参数可能会在这里出现问题

    在任何情况下,routes编译器都不会生成合适的代码。它要么不在那里,要么被限制访问

    例如,routes编译器生成
    target/scala-2.x/src\u managed/main/routes\u 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]
    会阻止它。

    我不是在验证用户正在调用的URL。用户正在将URL作为POST中数据的一部分传入,我正在验证和解析该数据。只是概念:使用WS-API如何:确定给定字符串是否为有效路由(即通过HEAD请求)?这是一个有点不寻常的情况,因为在大多数情况下,人们只想解析当前请求的URL。如果有一个答案,它就在。