Нужны ли двоеточия для кодирования в параметрах запроса URI?
Я заметил, что Java UriBuilder
не кодирует символы :
, включенные в мои значения параметров запроса (строки в формате ISO 8601).
Согласно Википедии, кажется, что двоеточие должно быть закодировано.
В частности, при кодировании строки запроса используются следующие правила:
- Буквы (A-Z и a-z), числа (0-9) и символы '.', '-', '~' и '_' остаются как -s
- SPACE кодируется как '+' или %20 [править]
- Все остальные символы кодируются как шестнадцатиричное представление% FF с любыми символами, отличными от ASCII, которые сначала кодируются как UTF-8 (или другие заданные кодирование)
Итак, что это за сделка? Должны быть закодированы двоеточия в параметрах запроса?
Обновление:
Я просмотрел спецификацию синтаксиса URI (RFC 3986), и похоже, что коды кодов в параметрах запроса действительно не нужны. Здесь выдержка из ABNF для URI:
URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
query = *( pchar / "/" / "?" )
pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
pct-encoded = "%" HEXDIG HEXDIG
sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "=
Ответы
Ответ 1
Да, они должны быть закодированы в строке запроса. Правильное кодирование %3A
Однако я могу понять, почему UriBuilder не кодирует :
. Вы не хотите кодировать двоеточие после протокола (например, http:
) или между именем пользователя и паролем (например, ftp://username:[email protected]
) в абсолютном URI.
Ответ 2
В Java SDK нет UriBuilder
, он определяется JAX-RS. Это документация утверждает, что параметры запроса должны быть закодированы в URL, другие компоненты кодируются с использованием RFC 3986.
Методы Builder выполняют контекстное кодирование символов, не разрешенных в соответствующем компоненте URI, следуя правилам типа носителя application/x-www-form-urlencoded
для параметров запроса и RFC 3986 для всех других компонентов
Однако реализация JAX-RS в Джерси не играет по этой спецификации и кодирует все согласно RFC 3986. Это ошибка, см. JIRA.