Кодирование параметров URL-запроса в Java
как кодировать параметры запроса, чтобы перейти на url-адрес в Java? Я знаю, это кажется очевидным и уже задал вопрос.
есть две тонкости, в которых я не уверен:
- должны ли пробелы быть закодированы на url как " + "или как " %20"? В chrome, Если я наберу "http://google.com/foo=?bar me" chrome меняет его на кодировку с %20
- необходимо / правильно ли кодировать двоеточия ": "как %3B? Хром нет.
Примечания:
-
java.net.URLEncoder.encode
кажется, не работает,похоже, что для кодирования данных должна быть представлена форма. Например, он кодирует пространство как+
вместо%20
, и кодирует двоеточие, которое не является необходимым. -
java.net.URI
не кодирует параметры запроса
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");