Как использовать java.net.URI - PullRequest
9 голосов
/ 09 сентября 2011

Я пытался использовать java.net.URI для манипулирования строками запроса, но мне не удалось даже выполнить такую ​​простую задачу, как получение строки запроса из одного URL-адреса и размещение его в другом.

Знаете ли вы, как заставить работать этот код ниже

URI sample = new URI("test?param1=x%3D1");
URI uri2 = new URI(
            "http",
            "domain",
            "/a-path",
            sample.getRawQuery(),
            sample.getFragment());

Звонок на uri2.toASCIIString() должен вернуться: http://domain/a-path?param1=x%3D1 но возвращает: http://domain/a-path?param1=x%253D1 (двойное кодирование)

если я использую getQuery () вместо getRawQuery (), строка запроса вообще не кодируется, а URL выглядит так: http://domain/a-path?param1=x=1

Ответы [ 2 ]

1 голос
/ 09 сентября 2011

Проблема в том, что второй конструктор закодирует запрос и фрагмент с использованием URL-кодировки.Но = является допустимым символом URI, поэтому он не будет кодировать его для вас;и % не является допустимым символом URI, поэтому будет кодировать его.В данном случае это прямо противоположно тому, что вы хотите.

Итак, вы не можете использовать второй конструктор.Используйте первый, объединяя части строки вместе.

0 голосов
/ 09 сентября 2011

Не могли бы вы перевести вызов на getQuery() с вызовом на java.net.URLEncoder.encode(String)?

URI sample = new URI("test?param1=x%3D1");
URI uri2 = new URI(
        "http",
        "domain",
        "/a-path",
        URLEncoder.encode(sample.getQuery(), "UTF-8"),
        sample.getFragment());
...