Класс Java URI: конструктор определяет, закодирован ли запрос? - PullRequest
1 голос
/ 29 апреля 2011

Является ли это поведение преднамеренным?

//create the same URI using two different constructors

URI foo = null, bar = null;
try { 
    //constructor: URI(uri string)
    foo = new URI("http://localhost/index.php?token=4%2F4EzdsSBg_4vX6D5pzvdsMLDoyItB");
} catch (URISyntaxException e) {} 
try { 
    //constructor: URI(scheme, authority, path, query, fragment) 
    bar = new URI("http", "localhost", "/index.php", "token=4%2F4EzdsSBg_4vX6D5pzvdsMLDoyItB", null);
} catch (URISyntaxException e) {}

//the output:
//foo.getQuery() = token=4/4EzdsSBg_4vX6D5pzvdsMLDoyItB
//bar.getQuery() = token=4%2F4EzdsSBg_4vX6D5pzvdsMLDoyItB

Конструктор URI (string uri), похоже, декодирует часть запроса URI. Я думал, что часть запроса должна быть закодирована? И почему другой конструктор не декодирует часть запроса?

Ответы [ 2 ]

1 голос
/ 29 апреля 2011

Из URI JavaDoc :

Конструктор с одним аргументом требует, чтобы все недопустимые символы в его аргументе были заключены в кавычки, и сохраняет все экранированные октеты и другие символы, которые присутствуют.

Конструкторы с несколькими аргументами заключают в кавычки недопустимые символы, как того требуют компоненты, в которых они появляются. Символ процента ('%') всегда указывается этими конструкторами. Любые другие символы сохраняются.

Таким образом, URI (String) ожидает, что вы все правильно закодируете, и предполагает, что %2F - это такое закодированное значение, которое будет декодировано в /.

Другие конструкторы завершат кодирование символа % (в результате %252F для ввода %2F) и, следовательно, после декодирования вы все равно получите %2F.

Я предполагаю, что цель отклонения между конструкторами состоит в том, чтобы позволить вещам типа new URI(otherUri.toString()) с toString() возвращать полностью закодированный URI.

0 голосов
/ 29 апреля 2011

Быстрый анализ:

Foo

Конструктор анализирует входной URI и снимает кавычки с литерала %2F до /. Это то, что мы ожидаем.

бар

С помощью конструктора, использованного в примере столбца, фрагмент фрагмент берется в виде необработанной строки с недопустимыми символами и сначала кодируется , в результате чего %2F переводится в %252F. Затем он анализируется, и теперь часть запроса без кавычек (снова) %2F.

Извлеченный урок: с первым конструктором мы передаем URI, соответствующий RFC 2396. Другие конструкторы принимают normal Strings (нелегальные символы без кавычек), а URI создает представление, соответствующее RFC 2396.

Вот рабочий пример для IDEONE (с дополнительным выходом поддержки)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...