Я пытаюсь найти метод, который будет анализировать URL-адрес, декодировать его и возвращать декодированные компоненты недвусмысленным образом.Как разобрать и декодировать URI в Java для компонентов URI?
URLDecoder не подходит, потому что он может возвращать неоднозначную строку, например.
URLDecoder.decode("http://www.google.com?q=abc%26def", "UTF-8")
возвращается:
http://www.google.com?q=abc&def
Так что информация о сбежавшего & теряется.
Я хотел бы иметь что-то вроде:
DecodedUrlComponents cmp = GreatURLDecoder.decode(url);
Map<String, List<String>> decodedQuery = cmp.getQuery();
decodedQuery.get("q").get(0); //returns "abc&def"
Как добиться этого?
EDIT: Спасибо за ответы, но мой вопрос был немного по-другому: я хотел бы получить декодируется компонент однозначным образом, так что ни один из следующих делает то, что мне нужно:
new URI("http://www.google.com?q=abc%26def").getRawQuery()
возвращает закодированный запрос:q=abc%26def
new URI("http://www.google.com?q=abc%26def").getQuery()
возвращает значение неоднозначное:q=abc&def
URLDecoder.decode("http://www.google.com?q=abc%26def", "UTF-8")
возвращает неоднозначное значение:http://www.google.com?q=abc&def
org.springframework.web.util.UriComponentsBuilder.fromUriString("http://www.google.com?q=abc%26def").build(true).getQueryParams()
- близко, но до сих пор не то, что я хочу, потому что она возвращает карту закодированных Params:{q=[abc%26def]}
Спасибо, похоже, он выполняет свою работу.Я не очень-то доволен тем, что - зависимость от JAX-RS только ради разбора и расшифровки URL-адресов кажется переполненным – tomkur
Согласен, это довольно много лишних вещей. Возможно, вам лучше просто скопировать класс из исходного репозитория и включить именно этот. – Petter
Также, если вы используете Джерси 2 вместо RESTEasy для JAX-RS, вы можете использовать 'org.glassfish.jersey.uri.UriComponent.decodeQuery (URI, boolean)' и соответствующие методы 'decode *'. –