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à".
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. –