2013-01-25 5 views
5

Non riesco a trovare questo accennato in modo esplicito, ma sembra che non è possibile inviare un segno più di escape ("% 2b") come valore di query query se si utilizza java.net.URI, dal momento che il query arg è sfuggito.Un modo per inviare% 2b (segno più codificato) in query arg con java.net.URI?

// bad: http://example.com/foo?a=%252b 
new URI("http", null, "example.com", 80, "/foo", "a=%2b", null); 

provato un carattere effettivo "+", ma che viene inviato così com'è, in modo che il server si interpreta come uno spazio.

// bad: http://example.com/foo?a=+ 
new URI("http", null, "example.com", 80, "/foo", "a=+", null); 

Quindi credo che non resta che fare la percentuale di codifica delle chiavi ARG query e valori stessi e utilizzare il singolo argomento URI costruttore che non sfugge? Forse lasciare URI sfuggire al "percorso", dal momento che le regole sono difficili (ad esempio, il carattere "+" indica un carattere più, non uno spazio, quando nel percorso):

// good: http://example.com/foo?a=%2b 
new URI(new URI("http", null, "example.com", 80, "/foo", null, null).toASCIIString() + "?a=%2b"); 

Inoltre, la documentazione si sostiene in grado di creare un URI come questo e sarà identico alla fonte URI:

URI u = ...; 
URI identical = new URI(u.getScheme(), 
     u.getUserInfo(), 
     u.getPath(), u.getQuery(), 
     u.getFragment()); 

ma che non è vero quando contiene% 2b

URI u = new URI("http://example.com:80/foo?a=%2b"); 
URI identical = ...; // not identical! http://example.com:80/foo?a=+ 

frustrante, credo che sia il motivo per cui tutti usano Commons Apache o lezioni di primavera ins tead?

PS: http://docs.oracle.com/javase/6/docs/api/java/net/URI.html fa riferimento a un costruttore di URI che non esiste nella sezione "le seguenti identità contengono". È necessario rimuovere il parametro "autorità".

+0

La sfida per l'URI è che una volta ricevuta la query come ad es. argomento del costruttore, è troppo tardi per capirne la semantica, perché la query è già una stringa con tutte le coppie chiave-valore unite. Dato che '+' è un carattere speciale per [RFC 2396] (https://tools.ietf.org/html/rfc2396#section-2.2) non è necessario che venga scappato. Ad esempio, considera la query '? Key + = + val' che viene interpretata come'? Key = val' sul lato server e che è forse l'effetto desiderato. Altri costruttori come 'org.springframework.web.util.UriComponentsBuilder' lavorano su un livello semantico più alto, quindi possono eseguire una fuga più intelligente. –

risposta

2

Mi imbatto nello stesso problema. Dopo alcune ricerche, penso che se hai bisogno di una codifica% 2b del simbolo più, è meglio non usare la classe URI come risultato. Sto usando il codice come questo:

URI uri = new URI(...); 
String asciiUrl = uri.toASCIIString(); 
String plusReplaced = asciiUrl.replace("+", "%2b"); 
-1

userei UriBuilder di prendersi cura di tutti i caratteri che devono essere codificati.

Problemi correlati