Ошибка синтаксического анализа приложения / x-www-form-urlencoded с почтовыми данными Unicode

1

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).

  • 0
    Я никогда не видел такого рода кодировки - есть ли у вас ссылка, предлагающая, чтобы она работала?
  • 0
    Мы работаем со старой системой, которая у нас есть, и эта конкретная ошибка возникает, когда Play ее проксирует. Он использует Flask, и на этом нет никаких проблем, он принимает эту кодировку. То, что я написал там, это «эй» на иврите после выхода из него: escape("היי")
Показать ещё 11 комментариев
Теги:
playframework
post
playframework-2.0

1 ответ

1

Согласно моим исследованиям, правильный способ обработки Юникода в теле application/x-www-form-urlencoded состоит в том, чтобы перевести Юникод в байты в кодировке по умолчанию для документа (то есть UTF-8), а затем в URL -encode байты ( т.е.% -encode).

Конечно, то, что вы сейчас делаете (с последовательностями "% uxxxx"), не является допустимым кодированием в отношении спецификаций. (Вы не можете просто вытащить вещи из воздуха, как это... и ожидать, что это сработает.)

Рекомендации:


Я отмечаю, что вы обнаружили этот синтаксис перехода через консоль вашего браузера. Здесь, что MSDN говорит о методе javascript escape():

"Функции escape и unescape не работают должным образом для символов, отличных от ASCII, и устарели. В JavaScript 1.5 и более поздних версиях используйте encodeURI, decodeURI, encodeURIComponent и decodeURIComponent".

Я думаю, что "не работают должным образом" означает, что они используют нестандартный синтаксис экранирования, который браузеры не распознают. Урок: читайте спецификацию, а не полагайтесь на эксперименты.

  • 0
    Да, хотя escape не рекомендуется и не должно использоваться, в настоящее время я не могу изменить его, поскольку он исходит от клиента, и я не могу его изменить. Так как перед игрой мы использовали другой бэкэнд (фляжка), и это сработало, переключение на игру сломало сервис. Что я ищу, так это то, как справляться с этим с игровой стороны, и выглядит как мне придется реализовать свой собственный BodyParser
  • 0
    @NitzanTomer - Если вам приходится жить в рамках этих ограничений, вы, вероятно, правы. Однако тот факт, что это работало раньше, не означает, что это было правильно раньше. Отправка escape-последовательностей, которые не распознаются стандартом, возможно, является некорректным поведением, даже если оно «работает». Суть стандартов в том, что каждый / все должен следовать им.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню