Нужны ли двоеточия для кодирования в параметрах запроса 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.