2016-08-10 78 views
2

我們目前正在Play 2.5.x上工作播放框架路由不區分大小寫

我們希望實現不區分大小寫的路由。例如說

GET /經/ V1 /組織http.organizationApi()

在URL我們想才達到

http://localhost:9000/abc/v1/organizations

http://localhost:9000/ABC/V1/OrganIZations

是否使用正則表達式來實現此bu的一種方法?有人能指出一個例子嗎?

+0

http://stackoverflow.com/questions/22015902/play-framework-2-2-1-case-insensitive-routing – MipH

+0

@MipH看到帖子較早。我正在尋找一些正則表達式來處理這個問題。可能是我可以提出我究竟需要什麼的問題。謝謝 – Prakash

+0

我想你可能有興趣閱讀:https://jazzy.id.au/2013/05/08/advanced_routing_in_play_framework.html –

回答

2

您可以定義請求處理程序以使URL不區分大小寫。在這種情況下,下面的處理程序將只是URL轉換爲小寫,所以在你的路由的網址應該以小寫定義:

import javax.inject.Inject 

import play.api.http._ 
import play.api.mvc.RequestHeader 
import play.api.routing.Router 

class MyReqHandler @Inject() (router: Router, errorHandler: HttpErrorHandler, 
        configuration: HttpConfiguration, filters: HttpFilters 
     ) extends DefaultHttpRequestHandler(router, errorHandler, configuration, filters) { 

    override def routeRequest(request: RequestHeader) = { 
    val newpath = request.path.toLowerCase 
    val copyReq = request.copy(path = newpath) 
    router.handlerFor(copyReq) 
    } 
} 

而且在application.conf參考它使用:

# This supposes MyReqHandler.scala is in your project app folder 
# If it is in another place reference it using the correct package name 
# ex: app/handlers/MyReqHandler.scala --> "handlers.MyReqHandler" 
play.http.requestHandler = "MyReqHandler" 

現在,如果你有一個路線定義爲「/人/製造」,任何情況下,組合將工作(例如:「/人/創建」)

有,雖然兩個警告:

  • 你只能在Scala動作中使用它。如果你的路由文件引用一個Java控制器的方法,你會得到一個奇怪的例外:

    [error] p.c.s.n.PlayRequestHandler - Exception caught in Netty 
    scala.MatchError: Right((play.core.routing.[email protected]22d56da6,[email protected])) (of class scala.util.Right) 
    

    如果您遇到這種情況,你可以找到更多信息here

  • 如果您的網址有參數,這些也將是轉化。舉例來說,如果你有這樣

    GET /persons/:name/greet  ctrl.Persons.greet(name: String) 
    

    呼叫路由到「/人/ JOHNDOE /打招呼」將轉化爲「/人/人johndoe /打招呼」,和你的greet方法會收到「爲johndoe」而不是「JohnDoe」作爲參數。請注意,這不適用於查詢字符串參數。 根據您的使用情況,這可能會有問題。