2015-03-17 4 views
5

Ich versuche, eine Methode zu finden, die eine URL analysieren, dekodieren und die dekodierten Komponenten auf eine eindeutige Weise zurückgeben würde.Wie parsen und dekodieren Sie URI in Java zu URI-Komponenten?

URLDecoder ist nicht eine richtige Passform, weil es mehrdeutige String, z.

URLDecoder.decode("http://www.google.com?q=abc%26def", "UTF-8") 

kehrt:

http://www.google.com?q=abc&def 

So sind die Informationen über entkam & verloren.

Ich möchte etwas haben, wie:

DecodedUrlComponents cmp = GreatURLDecoder.decode(url); 
Map<String, List<String>> decodedQuery = cmp.getQuery(); 
decodedQuery.get("q").get(0); //returns "abc&def" 

Wie erreichen ich das?

EDIT: Danke für die Antworten, aber meine Frage war ein bisschen anders: Ich möchte bekommen decodiert Komponenten in eindeutiger Weise, so dass weder der folgenden tut, was ich brauche:

  • new URI("http://www.google.com?q=abc%26def").getRawQuery() kehrt codierte Abfrage: q=abc%26def
  • new URI("http://www.google.com?q=abc%26def").getQuery() kehrt mehrdeutig Wert: q=abc&def
  • URLDecoder.decode("http://www.google.com?q=abc%26def", "UTF-8") kehrt mehrdeutig Wert: http://www.google.com?q=abc&def
  • org.springframework.web.util.UriComponentsBuilder.fromUriString("http://www.google.com?q=abc%26def").build(true).getQueryParams() - in der Nähe, aber immer noch nicht, was ich will, weil es eine Karte von codierten params liefert: {q=[abc%26def]}

Antwort

0

Generieren ein java.net.URL von URL-String und dann mwthods verwenden wie url.getQuery(), url.getProtocol(), url.getHost() usw. - Es ist alles da.

0

Verwenden folgendes:

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

Sollte test = 34% 3FG drucken.

0

URLDecoder teilt Ihre URL nicht in Komponenten auf, sondern übersetzt die String-Darstellung einfach in ein spezifisches Format, wie durch sein JavaDoc und seine Signatur angedeutet, die einen String zurückgibt. Wie andere bereits erwähnt haben, sollten Sie einfach ein URL Objekt aus Ihrer Zeichenkette konstruieren, was Ihnen alle Funktionen zur Verfügung stellt, die Sie benötigen. Siehe here.

1

Sie könnten zum Beispiel eine Implementierung von javax.ws.rs.core.UriInfo verwenden. Ein Beispiel wäre org.jboss.resteasy.spi.ResteasyUriInfo. Wenn Sie Maven verwenden müssen Sie nur die folgenden zu Ihrem pom.xml hinzuzufügen:

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

Dann sollte der folgende Code tun, was Sie wollen:

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

Danke, es sieht aus wie es seine Arbeit macht.Ich bin nicht sehr glücklich damit - die Abhängigkeit von JAX-RS nur für das Parsen und Entschlüsseln von URLs scheint ein Overkill – tomkur

+0

Einverstanden, es ist eine ganze Reihe von Extras. Sie könnten besser die Klasse einfach aus ihrem Quell-Repository kopieren und nur diese einschließen. – Petter

+0

Auch wenn Sie Jersey 2 anstelle von RESTEasy für JAX-RS verwenden, können Sie 'org.glassfish.jersey.uri.UriComponent.decodeQuery (URI, boolean)' und verwandte 'decode * 'Methoden verwenden. –

1

Mit Federrahmen (org.springframework .web.util) können Sie folgendes tun:

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.