Play отказывается принимать POST-запрос, когда данные являются unicode, и я получаю:
Ошибка при анализе приложения /x-www-form-urlencoded
У меня создалось впечатление, что все отлично работает, пока я не попробовал запрос с текстом на иврите вместо английского, поэтому запрос с
value=hey
работает отлично, но запрос с
value=%u05D4%u05D9%u05D9
выходит из строя.
Я нашел что-то в этом роде, но он сказал, что он сработал, изменив play/api/mvc/ContentType.scala, чего я бы хотел избежать.
Есть идеи?
Благодарю!
Я знаю, что кодировка не соответствует стандартам для application/x-www-form-urlencoded
но в том случае, когда мне нужно иметь дело, изменение клиентской стороны в настоящее время не является опцией и использует метод javascript escape
.
Я ищу решение на стороне сервера, то есть решение Play.
Было бы неплохо найти решение, которое можно реализовать в java, но на данный момент похоже, что решение состоит в том, чтобы написать собственный BodyParser (в scala).
Согласно моим исследованиям, правильный способ обработки Юникода в теле application/x-www-form-urlencoded
состоит в том, чтобы перевести Юникод в байты в кодировке по умолчанию для документа (то есть UTF-8), а затем в URL -encode байты ( т.е.% -encode).
Конечно, то, что вы сейчас делаете (с последовательностями "% uxxxx"), не является допустимым кодированием в отношении спецификаций. (Вы не можете просто вытащить вещи из воздуха, как это... и ожидать, что это сработает.)
Рекомендации:
Википедия: http://ru.wikipedia.org/wiki/Percent-encoding#The_application.2Fx-www-form-urlencoded_type
Спецификация HTML: http://www.w3.org/TR/html5/forms.html#application/x-www-form-urlencoded-encoding-algorithm. Это дает алгоритм, который должен использовать браузер. Если вы делаете что-то аналогичное, вы должны быть в порядке.
Я отмечаю, что вы обнаружили этот синтаксис перехода через консоль вашего браузера. Здесь, что MSDN говорит о методе javascript escape()
:
"Функции escape и unescape не работают должным образом для символов, отличных от ASCII, и устарели. В JavaScript 1.5 и более поздних версиях используйте encodeURI, decodeURI, encodeURIComponent и decodeURIComponent".
Я думаю, что "не работают должным образом" означает, что они используют нестандартный синтаксис экранирования, который браузеры не распознают. Урок: читайте спецификацию, а не полагайтесь на эксперименты.
escape
не рекомендуется и не должно использоваться, в настоящее время я не могу изменить его, поскольку он исходит от клиента, и я не могу его изменить. Так как перед игрой мы использовали другой бэкэнд (фляжка), и это сработало, переключение на игру сломало сервис. Что я ищу, так это то, как справляться с этим с игровой стороны, и выглядит как мне придется реализовать свой собственный BodyParser
escape("היי")