Почему URL-адреса закодированы другими, чем указано в RFC3986 Spring и Apache
Ранее сегодня я задал этот вопрос о проблеме кодирования URL.
Я пытался закодировать параметры URL-запроса с помощью Spring UriComponentBuilder, затем я также попробовал UriBuilder Apache Commons. Оба кодируют знак плюс (+
) в параметре запроса как %2B
, но в соответствии со спецификацией RFC3986 (раздел 3.4) в параметрах запроса допускается знак плюс. Не допускаются только:
* (pchar / "/" / "?")
Так что это будет действительный URL
http://www.example.com?foo=bar+baz
Но обе библиотеки конвертируют +:
http://www.example.com?foo=bar%2Bbaz
Я никогда не слышал об этом раньше и предполагал, что +
на самом деле является закодированным whitespace
персонаж. Кроме того, в этом ответе говорится, что по крайней мере весна следует этой спецификации.
Кто прав? Спецификация или весна и апач? Или я просто что-то неправильно понимаю? Или за какой спецификацией следуют эти библиотеки?
Примечание
Я бы даже посчитал плохой практикой запрещать и не анализировать серверную часть закодированных символов, согласитесь?