Играть фреймворк парсинг точек с запятой в параметрах запроса


Я рефакторингую проект, чтобы использовать Play Framework вместо Scalatra, и у меня возникли проблемы с параметрами запроса, содержащими точки с запятой, например / url?filter=filter1: val1; filter2: val2 получает сопоставление с filter = "filter1: val1;filter2:val2" в Scalatra, но получает сопоставление с filter = "filter1: val1" в Play Framework. Единственное решение, которое я нашел, Escape semicolon route playframework 2.0.2, предлагает использовать регулярное выражение для захвата всего параметра, но это, похоже, только применимо к параметрам пути, а не к параметрам запроса - одно из моих требований заключается в том, что я не могу изменить способ, которым интерфейс вызывает api, т. е. я не могу изменить параметр запроса в параметр пути.

Как я могу сказать Play, чтобы он не разбирал точки с запятой в параметрах запроса, т. е. возвращал "filter1;filter2 "вместо " filter1"?

Я могу вручную проанализировать параметры запроса, используя регулярное выражение на " request.rawQueryString", но я предпочел бы избежать этого, если это возможно.

1 5

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
}