Кодирование параметров URL-запроса в Java


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

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

  1. должны ли пробелы быть закодированы на url как " + "или как " %20"? В chrome, Если я наберу "http://google.com/foo=?bar me" chrome меняет его на кодировку с %20
  2. необходимо / правильно ли кодировать двоеточия ": "как %3B? Хром нет.

Примечания:

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

5 ответов:

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

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

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

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


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

URIUtil.encodeQuery(url);

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

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

К Сожалению, URLEncoder.encode() не производит допустимое процентное кодирование (как указано в http://tools.ietf.org/html/rfc3986#section-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);

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

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

также кажется, что допустимы только закодированные в процентах пробелы, поскольку я сомневаюсь, что пространство является альфой или цифрой

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

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

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

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

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

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