Параметры запроса 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