2014-11-24 69 views
2

如果我有一個URL字符串,說https://localhost/users/45,和我在我的遊戲框架2.3項目的路線,看起來像類在Play框架中解析/驗證特定路線的URL?

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

這是一個不尋常的情況,因爲在大多數情況下,只需要解析當前請求的URL。如果有答案,它在[routes-compiler]中(https://github.com/playframework/playframework/tree/master/framework/src/routes-compiler)。 – 2014-11-24 19:10:15

回答

1

這個請求看起來很奇怪,直到你考慮實現一個REST /超媒體API。

假設路由文件是

GET /foo/:id/bar Foo.bar(id) 

有人張貼{"data":"something", "parent": "/foo/5/bar"}/foo/123/bar

播放將從請求URL /foo/123/bar中提取id參數(比如對於內部數據庫id),但是您可以對解析/foo/5/bar做同樣的事情嗎?


簡短的回答

不,你不能使用的路徑文件這一點。


長的答案

從路由文件,播放用於轉換

  1. 串=>調用一個控制器的方法與參數

  2. 控制器方法標識符生成代碼+ arguments =>字符串

你想要的是無論是

  • 串=>控制器方法+參數

  • 控制器方法標識符+串=>參數

  • 幾個缺點:

    #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]阻止它。

    0

    Play的路由器會自動驗證URL(也針對參數類型),因此您無需在您的操作中進行額外的驗證。即如果你打電話給/users/some-string它會拋出404找不到......

    +0

    我沒有驗證用戶正在呼叫的URL。用戶在POST中傳遞一個URL作爲數據的一部分,我正在驗證和解析這些數據。 – 2014-11-24 18:43:42

    +0

    好吧,現在我明白了......嗯......好點 – biesior 2014-11-24 19:14:06

    +0

    Just concept:如何使用WS API:https://www.playframework.com/documentation/2.3.x/ScalaWS來確定給定的字符串是否爲有效路由(即通過HEAD請求)? – biesior 2014-11-24 19:46:45