2013-11-20 28 views
5

我正在重構項目以使用Play Framework而不是Scalatra,並且遇到包含分號的查詢參數時遇到問題,例如,在Scalatra中映射到filter =「filter1:val1; filter2:val2」,但在Play Framework中映射到filter =「filter1:val1」。我發現的唯一解決方案Escape semicolon route playframework 2.0.2建議使用正則表達式來捕獲整個參數,但這似乎只適用於路徑參數而不適用於查詢參數 - 我的一個要求是我無法改變前端調用API,即我不能將查詢參數更改爲路徑參數。在查詢參數中播放框架解析分號

我該如何判斷Play不要解析查詢參數中的分號,即返回「filter1; filter2」而不是「filter1」?

我可以使用「request.rawQueryString」上的正則表達式手動解析出查詢參數,但我寧願避免這種情況發生。

+0

你有沒有找到一個解決這個?我們遇到了完全相同的問題。 – cdeszaq

+0

@cdeszaq請參閱下面的答案 –

回答

3

與我們使用一個隱含的類,因爲我認爲這是不作爲繁重解析出查詢參數去該解決方案將是

implicit class ParsedRawQueryString[+T](req: Request[T]) { 

    import java.net.URLDecoder.decode 

    def parsedRawQueryString = (for { 
    s <- decode(req.rawQueryString, "UTF-8").split('&') if s.contains('=') 
    } yield { 
    val index = s.indexOf('=') 
    s.substring(0, index) -> s.substring(index + 1) 
    }).toMap 
} 

def route = Action { 
    request => 
    val queryParams = request.parsedRawQueryString 
}