2011-09-09 14 views
8

Ho provato a utilizzare java.net.URI per manipolare le stringhe di query, ma non sono riuscito nemmeno in un'attività molto semplice come ottenere la stringa di query da un URL e inserirla in un altro.Come utilizzare java.net.URI

Sai come fare questo codice qui sotto lavoro

URI sample = new URI("test?param1=x%3D1"); 
URI uri2 = new URI(
      "http", 
      "domain", 
      "/a-path", 
      sample.getRawQuery(), 
      sample.getFragment()); 

Chiama per uri2.toASCIIString() dovrebbe restituire: http://domain/a-path?param1=x%3D1 ma restituisce: http://domain/a-path?param1=x%253D1 (doppio encoding)

se uso getQuery() al posto di getRawQuery() la stringa di query non è codificata affatto e l'url è simile al seguente: http://domain/a-path?param1=x=1

risposta

1

Il problema è che il secondo costruttore codificherà il qu e frammento usando la codifica URL. Ma = è un carattere URI legale, quindi non lo codificherà per te; e % non è un carattere URI legale, quindi lo sarà codificato in. È esattamente l'opposto di quello che vuoi, in questo caso.

Quindi, non è possibile utilizzare il secondo costruttore. Usa il primo, concatenando insieme le parti della stringa.

+0

Buona spiegazione. Quindi l'interfaccia URI è mal progettata (difficilmente vedo alcun motivo per il secondo costruttore). Conosci una classe URI migliore? Come joda-time che sostituisce la classe Date/Calendar? –

+0

No, I do not ... e 'URI' è già un re-make della vecchia classe 'java.net.URL', che ha i suoi problemi. – Jesper

0

È possibile chiudere la chiamata a getQuery() con una chiamata a java.net.URLEncoder.encode(String)?

URI sample = new URI("test?param1=x%3D1"); 
URI uri2 = new URI(
     "http", 
     "domain", 
     "/a-path", 
     URLEncoder.encode(sample.getQuery(), "UTF-8"), 
     sample.getFragment()); 
+0

Hai controllato? 'URLEncoder.encode (sample.getQuery())' è più o meno uguale a 'sample.getRawQuery()' così finirai con lo stesso problema che ho avuto –