2015-03-17 3 views
5

Я пытаюсь найти метод, который будет анализировать 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]}

ответ

0

Генерировать java.net.URL из вашего URL-строки, а затем использовать mwthods как url.getQuery(), url.getProtocol(), url.getHost() и т.д. - Это все.

0

Используйте следующее:

String url = "http://www.google.com?test=34%3fg"; 
URL testUrl = new java.net.URL(url); 
System.out.println(testUrl.getQuery()); 

Если напечатать тест = 34% 3fg.

0

URLDecoder не разбивает ваш URL на компоненты, а просто преобразует его представление в конкретный формат, как намечено его JavaDoc и его сигнатурой, которая возвращает строку. Как уже упоминалось, вы должны просто построить объект URL из своей строки, который предоставляет всю необходимую вам функциональность. См. here.

1

Вы можете, например, использовать реализацию javax.ws.rs.core.UriInfo. Одним из примеров может быть org.jboss.resteasy.spi.ResteasyUriInfo. Если вы используете Maven вам нужно только добавить следующие строки в pom.xml:

<dependency> 
    <groupId>org.jboss.resteasy</groupId> 
    <artifactId>resteasy-jaxrs</artifactId> 
    <version>3.0.6.Final</version> 
</dependency> 

Тогда следующий код должен делать то, что вы хотите:

UriInfo ui = new ResteasyUriInfo(new URI("http://www.google.com?q=abc%26def")); 
List<String> qValues = ui.getQueryParameters().get("q"); 
for (String q : qValues) { 
    System.out.println(q); 
} 
+0

Спасибо, похоже, он выполняет свою работу.Я не очень-то доволен тем, что - зависимость от JAX-RS только ради разбора и расшифровки URL-адресов кажется переполненным – tomkur

+0

Согласен, это довольно много лишних вещей. Возможно, вам лучше просто скопировать класс из исходного репозитория и включить именно этот. – Petter

+0

Также, если вы используете Джерси 2 вместо RESTEasy для JAX-RS, вы можете использовать 'org.glassfish.jersey.uri.UriComponent.decodeQuery (URI, boolean)' и соответствующие методы 'decode *'. –

1

С пружинной рамкой (org.springframework .web.util) вы можете сделать следующее:

URI uri = <your_uri_here>; 
UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromUri(uri); 
UriComponents uriComponents = uriComponentsBuilder.build(); 
String path = uriComponents.getPath(); 
MultiValueMap<String, String> queryParams = uriComponents.getQueryParams(); //etc.