Параметры запроса URL-адреса в Java

Как кодировать параметры запроса на URL-адрес в Java? Я знаю, это похоже на очевидный и уже заданный вопрос.

Есть две тонкости, о которых я не уверен:

  • Должны ли пробелы кодироваться на URL как "+" или "%20"? В chrome, если я наберу "http://google.com/foo=?bar me" хром, он будет закодирован с помощью %20
  • Нужно ли/правильно кодировать двоеточия ":" как% 3B? Chrome не работает.

Примечания:

  • java.net.URLEncoder.encode, похоже, не работает, представляется, что данные для кодирования должны быть представлены в форме. Например, он кодирует пространство как + вместо %20 и кодирует двоеточие, которое не является необходимым.
  • java.net.URI не кодирует параметры запроса

Ответ 1

java.net.URLEncoder.encode(String s, String encoding) тоже может помочь. Он следует кодировке HTML application/x-www-form-urlencoded.

URLEncoder.encode(query, "UTF-8");

С другой стороны, Percent-encoding (также известный как URL encoding) кодирует пространство с помощью %20. Колон является зарезервированным символом, поэтому : по-прежнему останется двоеточием после кодирования.

Ответ 2

EDIT: URIUtil больше не доступен в более поздних версиях, лучше ответьте на Java-encode URL или г-ном Синди в этой теме.


URIUtil Apache httpclient действительно полезен, хотя существуют альтернативы

URIUtil.encodeQuery(url);

Например, он кодирует пробел как "+" вместо "%20"

Оба являются совершенно правильными в правильном контексте. Хотя, если вы действительно предпочли, что вы могли бы заменить строку.

Ответ 3

К сожалению, URLEncoder.encode() не создает допустимого процентного кодирования (как указано в http://tools.ietf.org/html/rfc3986# раздел 2.1-).

URLEncoder.encode() кодирует все просто отлично, за исключением того, что пробел кодируется в "+". Все кодеры Java URI, которые я мог найти, отображали только публичные методы для кодирования запроса, фрагмента, частей пути и т.д., Но не подвергайте "сырую" кодировку. Это печально, так как фрагмент и запрос позволяют кодировать пространство до +, поэтому мы не хотим их использовать. Путь закодирован правильно, но сначала "нормализован", поэтому мы не можем использовать его для "общего" кодирования.

Лучшее решение, которое я мог бы придумать:

return URLEncoder.encode(raw, "UTF-8").replaceAll("\\+", "%20");

Если replaceAll() слишком медленный для вас, я предполагаю, что альтернатива заключается в том, чтобы свернуть собственный кодер...

EDIT: у меня здесь был первый код, который не кодирует "?", "&", "=" правильно:

//don't use - doesn't properly encode "?", "&", "="
new URI(null, null, null, raw, null).toString().substring(1);

Ответ 4

Нет необходимости кодировать двоеточие как% 3B в запросе, хотя это не является незаконным.

URI         = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
query       = *( pchar / "/" / "?" )
pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
pct-encoded   = "%" HEXDIG HEXDIG
sub-delims    = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="

Также кажется, что допустимы только процентные пробелы, поскольку я сомневаюсь, что пространство является ALPHA или DIGIT

посмотрите спецификацию URI для более подробной информации.

Ответ 5

Встроенный Java URLEncoder делает то, что должен, и вы должны его использовать.

"+" Или " %20" являются допустимыми заменами пробела в URL. Либо один будет работать.

":" Должен быть закодирован, так как это символ-разделитель. то есть http://foo или ftp://bar. Тот факт, что конкретный браузер может обрабатывать его, когда он не закодирован, не делает его правильным. Вы должны закодировать их.

В качестве хорошей практики обязательно используйте метод, который принимает параметр кодировки символов. Там обычно используется UTF-8, но вы должны указать его явно.

URLEncoder.encode(yourUrl, "UTF-8");

Ответ 6

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

String url;
URL myUrl = new URL(url.replace(" ","%20"));

пример: URL-адрес

www.xyz.com?para=hello sir

тогда вывод muUrl будет

www.xyz.com?para=hello%20sir