Играть фреймворк парсинг точек с запятой в параметрах запроса
Я рефакторингую проект, чтобы использовать 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 ответ:
Решение, с которым мы пошли, состояло в том, чтобы проанализировать параметры запроса, используя неявный класс, который не был таким обременительным, как я думал, что это будет
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 }