Оригинальный ответ
Вы смешиваете 2 вещи, а +
в теле запроса будет означать пробел, если заголовок имеет application/x-www-form-urlencoded
.Тело или содержание запроса будет зависеть от заголовков, но запрос может иметь только url
, а не headers
и нет body
.
Таким образом, кодировка URI не может контролироваться никакими заголовками как таковыми
См. Раздел URL Encoding
в https://en.wikipedia.org/wiki/Query_string
Некоторые символы не могут быть частьюURL (например, пробел) и некоторые другие символы имеют специальное значение в URL: например, символ # может использоваться для дополнительного указания подраздела (или фрагмента) документа.В формах HTML символ = используется для отделения имени от значения.Общий синтаксис URI использует кодировку URL для решения этой проблемы, в то время как HTML-формы делают некоторые дополнительные замены, а не применяют процентное кодирование для всех таких символов.SPACE кодируется как '+' или "% 20". [10]
HTML 5 определяет следующее преобразование для отправки HTML-форм с помощью метода "get" на веб-сервер. 1 Ниже приводится краткое описание алгоритма:
Символы, которые не могут быть преобразованы в правильную кодировку, заменяются цифровыми ссылками на символы HTML [11] ПРОБЕЛ кодируется буквами '+' или '% 20' (A–Z и a – z), цифры (0–9) и символы «*», «-», «.»и '_' оставлены как есть. Все остальные символы закодированы как шестнадцатеричное представление% HH с любыми не-ASCII символами, сначала закодированными как UTF-8 (или другое заданное кодирование). Октет, соответствующий тильде ("~"), разрешенв строках запроса по RFC3986, но в HTML-формах требуется кодирование в процентах в «% 7E».
Кодировка SPACE в виде «+» и выбор символов «как есть» отличает эту кодировку от RFC3986.
И вы можете увидеть то же поведение на google.com
, а также снизу скриншоты
Также вы можете увидеть такое же поведение и в других платформах.Ниже приведен пример Python Flask
Итак, то, что вы видите, является правильным, вы просто сравниваете его с документом, который ссылается на содержимое телазапроса, а не URL
Edit-1: 22 мая
После отладки кажется, что декодирование даже не происходит в Spring.Я происходил в package org.apache.tomcat.util.buf;
и UDecode
классе
/**
* URLDecode, will modify the source.
* @param mb The URL encoded bytes
* @param query <code>true</code> if this is a query string
* @throws IOException Invalid %xx URL encoding
*/
public void convert( ByteChunk mb, boolean query )
throws IOException
{
int start=mb.getOffset();
И ниже, где фактически происходит конвертация
if( buff[ j ] == '+' && query) {
buff[idx]= (byte)' ' ;
} else if( buff[ j ] != '%' ) {
Это означает, что это встроенный сервер Tomcat, который делаетэтот перевод и весна даже не участвуют в этом.Нет конфигурации для изменения этого поведения, как видно из кода класса.Таким образом, вы должны жить с этим