Domanda

Voglio inviare un URI come valore di un parametro query / matrix. Prima di poterlo aggiungere a un URI esistente, devo codificarlo secondo RFC 2396. Ad esempio, dato l'input:

http://google.com/resource?key=value1 & amp; valore2

Mi aspetto l'output:

http% 3A% 2F% 2fgoogle.com% 2fresource% 3fkey% 3dvalue1% 2520% 26% 2520value2

java.net.URLEncoder java.net.URI genereranno il giusto output. URLEncoder è pensato per la codifica di moduli HTML che non è la stessa di RFC 2396. URI non ha alcun meccanismo per codificare un singolo valore alla volta, quindi non ha modo di sapere che value1 e value2 fanno parte della stessa chiave.

È stato utile?

Soluzione

UriBuilder di Jersey codifica URI componenti che utilizzano application / x-www-form-urlencoded e RFC 3986 secondo necessità. Secondo il Javadoc

  

I metodi Builder eseguono la codifica contestuale di caratteri non consentiti nel componente URI corrispondente seguendo le regole del tipo di supporto application / x-www-form-urlencoded per i parametri di query e RFC 3986 per tutti gli altri componenti. Si noti che solo i caratteri non consentiti in un particolare componente sono soggetti alla codifica, quindi, ad esempio, un percorso fornito a uno dei metodi del percorso può contenere parametri di matrice o più segmenti di percorso poiché i separatori sono caratteri legali e non verranno codificati. Anche i valori codificati in percentuale sono riconosciuti dove consentito e non saranno codificati in doppio.

Altri suggerimenti

Potresti anche usare Spring UriUtils

Non ho abbastanza reputazione per commentare le risposte, ma volevo solo notare che il download dell'API JSR-311 da solo non funzionerà. Devi scaricare l'implementazione di riferimento ( jersey ).

Il download dell'API dalla pagina JSR ti darà una ClassNotFoundException quando l'API tenta di cercare un'implementazione in fase di esecuzione.

Ho scritto il mio, è breve, super semplice e puoi copiarlo se ti piace: http://www.dmurph.com/2011/01/java-uri- encoder /

Sembra che CharEscapers da Google GData-java-client ha quello che vuoi. Ha il metodo uriPathEscaper, uriQueryStringEscaper e uriEscaper generico. (Tutti restituiscono l'oggetto Escaper che esegue effettivamente la escape). Licenza Apache.

Penso che la classe URI è quello che stai cercando.

Mmhh so che hai già scartato URLEncoder, ma nonostante ciò che dicono i documenti, ho deciso di provarlo.

Hai detto:

  

Ad esempio, dato un input:

     

http://google.com/resource?key=value

     

Mi aspetto l'output:

     

http% 3A% 2F% 2fgoogle.com% 2fresource% 3fkey% 3dvalue

C:\oreyes\samples\java\URL>type URLEncodeSample.java
import java.net.*;

public class URLEncodeSample {
    public static void main( String [] args ) throws Throwable {
        System.out.println( URLEncoder.encode( args[0], "UTF-8" ));
    }
}

C:\oreyes\samples\java\URL>javac URLEncodeSample.java

C:\oreyes\samples\java\URL>java URLEncodeSample "http://google.com/resource?key=value"
http%3A%2F%2Fgoogle.com%2Fresource%3Fkey%3Dvalue

Come previsto.

Quale sarebbe il problema con questo?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top