Zim*_*oot 5 scala url-routing playframework
我正在重构一个使用Play Framework而不是Scalatra的项目,并且遇到包含分号的查询参数时出现问题,例如/ url?filter = filter1:val1; filter2:val2被映射到filter ="filter1:val1; filter2:val2 "在Scalatra中,但在Play Framework中被映射到filter ="filter1:val1".我发现的唯一解决方案,Escape分号路由playframework 2.0.2,建议使用正则表达式捕获整个参数,但这似乎只适用于路径参数而不是查询参数 - 我的要求之一就是我可以不改变前端调用api的方式,即我不能将查询参数更改为路径参数.
如何告诉Play不要在查询参数中解析分号,即返回"filter1; filter2"而不是"filter1"?
我可以使用"request.rawQueryString"上的正则表达式手动解析查询参数,但如果可能的话我宁愿避免这种情况.
我们采用的解决方案是使用隐式类解析查询参数,这并不像我想象的那么繁重
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
}
Run Code Online (Sandbox Code Playgroud)