2012-11-23 3 views
5

Ich habe URL-Objekt mit Pfad enthält unwise characters (RFC 2396) in meinem Fall ist es "|" (Rohr-) Zeichen. Jetzt muss ich das sicher in URI konvertieren, aber URL.toURI() löst eine Ausnahme aus.Wie URL zuURI konvertieren, wenn unklare Zeichen sind?

Ich habe gelesen URL documentation aber dieser Teil ist für mich verwirrend:

Die URL-Klasse hat sich nach der Flucht Mechanismus eine beliebige URL Komponenten nicht kodieren oder dekodieren in RFC2396 definiert. Es ist die Verantwortung des Aufrufers, alle Felder zu codieren, die vor dem Aufrufen von URL maskiert werden müssen, und auch alle ausgeblendete Felder, , die von URL zurückgegeben werden, zu decodieren. Da URL keine Kenntnis von URL-Escaping hat, erkennt es nicht die Äquivalenz zwischen dem codierten oder dekodierten Formular derselben URL.

Also wie soll ich es tun? Wie lautet das Muster, um diese Zeichen während der Konvertierung zu codieren? Muss ich eine verschlüsselte Kopie meines URL-Objekts erstellen?

Antwort

2

OK, komme ich mit so etwas wie dies oben:

URI uri = new URI(url.getProtocol(), 
        null /*userInfo*/, 
        url.getHost(), 
        url.getPort(), 
        (url.getPath()==null)?null:URLDecoder.decode(url.getPath(), "UTF-8"), 
        (url.getQuery()==null)?null:URLDecoder.decode(url.getQuery(), "UTF-8"), 
        null /*fragment*/); 

Sieht aus wie es funktioniert, here is an example. Kann jemand bestätigen, dass dies die richtige Lösung ist?

bearbeiten: initial solution hatte einige Probleme, wenn es eine Abfrage war, also habe ich es behoben.

+0

Diese Methode ändert URL wie es url Teilen URL codiert, meine Lösung sehen –

+0

ja du hast recht, Ich habe bemerkt, dass einige Zeit Ego, in ideone.com (siehe ersten Link) Ich habe meine Lösung korrigiert und ich habe zusätzliche Testfälle hinzugefügt, die dieses Problem aufdecken. Ich werde deine Lösung überprüfen, es sieht besser aus. –

+0

Übrigens wurde der Fehler, den Sie gestern bei jmeter eingereicht haben, behoben, Sie können versuchen, nachts –

1

URL-Codierung verwenden?

Von Ihrem Beispiel: Sie haben derzeit:

URL url = new URL("http", "google.com", 8080, "/crapy|path with-unwise_characters.jpg"); 

Stattdessen würde ich verwenden:

String path = "/crapy|path with-unwise_characters.jpg" 
URL url = new URL("http", "google.com", 8080, URLEncoder.encode(path, "UTF-8")); 

Dies sollte alle unklug Zeichen auf dem Weg nach der Standard-URL-Codierung arbeiten und zu handhaben.

+0

das ist OK Lösung, aber mein Hauptziel war die Konvertierung in URI, so dass meine Lösung direkter ist, vor allem, dass ich keine URL erzeuge, die aus dem Code von Drittanbietern stammt. –

1

Httpclient 4 hat eine Aufgabe, für die org.apache.http.client.utils.URIBuilder:

  URIBuilder builder = 
      new URIBuilder() 
     .setScheme(url.getProtocol()) 
     .setHost(url.getHost()) 
     .setPort(url.getPort()) 
     .setUserInfo(url.getUserInfo()) 
     .setPath(url.getPath()) 
     .setQuery(url.getQuery()); 
    URI uri = builder.build(); 
    return uri;