Как кодировать параметры запроса для перехода по URL-адресу в Java? Я знаю, это кажется очевидным и уже заданным вопросом.
Есть две тонкости, в которых я не уверен:
- Следует ли кодировать пробелы в URL-адресе как «+» или «% 20»? В Chrome, если я ввожу "http://google.com/foo=?bar me", Chrome изменяет его на кодировку% 20
- Необходимо / правильно ли кодировать двоеточия ":" как% 3B? Chrome этого не делает.
Ноты:
java.net.URLEncoder.encode
похоже, не работает, похоже, для отправки данных кодирования. Например, он кодирует пробел+
вместо%20
и кодирует двоеточие, в котором нет необходимости.java.net.URI
не кодирует параметры запроса
application/x-www-form-urlencoded
пары ключ / значение. Подробнее см. Здесь: незаконныйargumentexception.blogspot.com/2009/12/…Ответы:
java.net.URLEncoder.encode(String s, String encoding)
тоже может помочь. Он следует кодировке HTML-формыapplication/x-www-form-urlencoded
.С другой стороны, процентное кодирование (также известное как кодирование URL ) кодирует пробел с помощью
%20
. Двоеточие - это зарезервированный символ, поэтому:
после кодирования останется двоеточием.источник
URLEncoder
он соответствуетapplication/x-www-form-urlencoded
формату MIME (который является допустимой кодировкой HTML-формы). Я предполагаю, что это не то, что вы ищете.http://example.com/?url=http://example.com/?q=c&sort=name
. Кодировать&sort=name
или нет? Невозможно отличить значение от URL-адреса. Это точная причина, по которой вам вообще нужно кодирование значений.РЕДАКТИРОВАТЬ:
URIUtil
больше не доступен в более поздних версиях, лучше ответьте на Java - закодируйте URL-адрес или г-н Синди в этой теме.URIUtil
Apache httpclient действительно полезен, хотя есть несколько альтернативИ то, и другое совершенно справедливо в правильном контексте . Хотя, если вы действительно предпочитаете, вы можете заменить строку.
источник
URIUtil.encodeWithinQuery
это то, что вы бы использовали для кодирования отдельного параметра запроса, что, по-видимому, и задавал исходный вопрос.К сожалению, URLEncoder.encode () не дает допустимого процентного кодирования (как указано в RFC 3986 ).
URLEncoder.encode () кодирует все отлично, за исключением того, что пробел кодируется как "+". Все кодировщики Java URI, которые мне удалось найти, предоставляют только общедоступные методы для кодирования запроса, фрагмента, частей пути и т. Д., Но не раскрывают "исходную" кодировку. Это прискорбно, поскольку фрагменту и запросу разрешено кодировать пробел в +, поэтому мы не хотим их использовать. Путь закодирован правильно, но сначала «нормализуется», поэтому мы не можем использовать его и для «общего» кодирования.
Лучшее решение, которое я мог придумать:
Если
replaceAll()
это слишком медленно для вас, я думаю, альтернатива - накрутить собственный кодировщик ...РЕДАКТИРОВАТЬ: Сначала у меня был этот код, который неправильно кодирует "?", "&", "=":
источник
+
- совершенно правильная кодировка пробела.+
может неправильно интерпретироваться - взгляните на C # blogs.msdn.microsoft.com/yangxind/2006/11/08/…encodeURIComponent
выводом метода Javascript , и это было единственное точное совпадение с теми, которые я пробовал (запросы с пробелами, турецкими и немецкими специальными символами).Нет необходимости кодировать двоеточие в запросе как% 3B, хотя это не является незаконным.
Также кажется, что допустимы только пробелы с процентной кодировкой, поскольку я сомневаюсь, что пробел - это АЛЬФА или ЦИФРА.
обратитесь к спецификации URI для получения более подробной информации.
источник
application/x-www-form-urlencoded
строку запроса, все в порядке. Если вы исправляете URL-адрес, введенный / вставленный пользователем, его:
следует оставить в покое.Встроенный Java URLEncoder делает то, что должен, и вы должны его использовать.
А «+» или «% 20» являются обеими действительной для замены пробела в URL. Любой из них будет работать.
Знак «:» должен быть закодирован, так как это символ-разделитель. т.е. http: // foo или ftp: // bar . Тот факт, что конкретный браузер может обрабатывать его, когда он не закодирован, не делает его правильным. Вы должны их закодировать.
Рекомендуется использовать метод, который принимает параметр кодировки символов. Здесь обычно используется UTF-8, но вы должны указать его явно.
источник
+
это только представление пространства вapplication/x-www-form-urlencoded
; не гарантируется работа даже при ограничении HTTP. Точно так же:
это допустимо в строке запроса и не должно преобразовываться в%3B
; сервер может интерпретировать их по-разному.http://
дляhttp%3A%2F%2F
которых не является правильнымhttp://
деталь. Метод предназначен для параметров запроса и данных закодированной формы. Однако, если вы хотите передать URL-адрес другого веб-сайта в качестве параметра запроса, ЗАТЕМ вы захотите его закодировать, чтобы не запутать парсер URL.application/x-www-form-urlencoded
тип содержимого. Разве это не значит, что он должен работать с HTTP?если у вас есть только проблема с пробелом в URL-адресе. Я использовал код ниже, и он отлично работает
пример: url
тогда вывод muUrl
источник
Я заметил, что в случае Datetime (Timestamp)
URLEncoder.encode(param,"UTF-8")
не работает.источник