Схема кодирования URL-адресов Spring REST:% 20 или + Какой? - PullRequest
7 голосов
/ 13 ноября 2010

Я создал Spring REST-приложение, в котором вы можете выполнять CRUD-операции на основе HTTP-методов POST, PUT, GET, DELETE.У меня есть типичный шаблон URI

http://host/root/{id}/{name}/{address} and etc.

У нас есть клиент, который обращается к этой службе REST.Очевидно, они отправляют параметры для имени из нескольких слов и адреса в следующей форме:

http://host/root/11/John+Smith/10+Las+Vegas+USA

Они используют схему кодирования HTML, основанную на типе application / x-www-form-urlencoded.Согласно статье в Википедии

application / x-www-form-urlencoded type

Кодировка, используемая по умолчанию, основана на очень ранней версии общего URI процента-правила кодирования с рядом модификаций, таких как нормализация новой строки и замена пробелов на «+» вместо «% 20».- http://en.wikipedia.org/wiki/Percent-encoding

Однако представляется, что стандартная схема кодирования URL-адресов заключается в использовании% 20 при замене пробелов в шаблонах URI.Какой из них правильный?

My Spring REST автоматически конвертирует% 20 в пробелы.Это правильно истолковано.Я использую Spring 3.0.4.Когда мой REST-сервис встречает +, он принимается как есть.Конечно, когда я ставлю валидацию для исключения +, она действительно исключается, как и ожидалось.

Находится ли я в рамках стандартов или существуют такие двойные стандарты?Или клиент использует древнюю схему?

1 Ответ

11 голосов
/ 13 ноября 2010

Дело в том, что application/x-www-form-urlencoded можно использовать только в параметрах запроса , тогда как кодирование процентов также поддерживается в пути.

Итак,

http://host/root/11/?name=John+Smith&address=10+Las+Vegas+USA

в порядке и будет правильно декодироваться Spring MVC, но

http://host/root/11/John+Smith/10+Las+Vegas+USA

неверно, и Spring MVC не декодирует его, потому что вместо него должна использоваться следующая форма:

http://host/root/11/John%20Smith/10%20Las%20Vegas%20USA
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...