【问题标题】:Play framework parsing semicolons in query parameters播放框架解析查询参数中的分号
【发布时间】:2013-11-20 17:13:31
【问题描述】:

我正在重构一个项目以使用 Play Framework 而不是 Scalatra,并且遇到了包含分号的查询参数的问题,例如 /url?filter=filter1:val1;filter2:val2 在 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”上的正则表达式手动解析查询参数,但如果可能的话,我宁愿避免这样做。

【问题讨论】:

  • 您找到解决方案了吗?我们遇到了完全相同的问题。
  • @cdeszaq 在下面查看我的答案

标签: scala playframework url-routing


【解决方案1】:

我们采用的解决方案是使用隐式类解析查询参数,这并不像我想象的那么繁琐

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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多