2015-01-28 6 views
10

ich mit Spring RestTemplate erfolgreich wie folgt aus:RestTemplate NICHT url zu entkommen

String url = "http://example.com/path/to/my/thing/{parameter}"; 
ResponseEntity<MyClass> response = restTemplate.postForEntity(url, payload, MyClass.class, parameter); 

Und das ist gut.

Manchmal ist parameter jedoch %2F. Ich weiß, das ist keine Idee, aber es ist was es ist. Die richtige URL sollte lauten: http://example.com/path/to/my/thing/%2F, aber wenn ich parameter auf "%2F" setze, wird es doppelt zu http://example.com/path/to/my/thing/%252F geflutet. Wie verhindere ich das?

Antwort

18

Anstatt eine String URL zu verwenden, erstellen Sie eine URI mit einer UriComponentsBuilder.

String url = "http://example.com/path/to/my/thing/"; 
String parameter = "%2F"; 
UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url).path(parameter); 
UriComponents components = builder.build(true); 
URI uri = components.toUri(); 
System.out.println(uri); // prints "http://example.com/path/to/my/thing/%2F" 

Verwenden UriComponentsBuilder#build(boolean)

, um anzuzeigen, ob alle in diesem Builder eingestellte Komponenten sind codiert (true) oder nicht (false)

Dies ist mehr oder weniger gleichwertig Ersetzen Sie {parameter} und erstellen Sie selbst ein URI Objekt.

String url = "http://example.com/path/to/my/thing/{parameter}"; 
url = url.replace("{parameter}", "%2F"); 
URI uri = new URI(url); 
System.out.println(uri); 

können Sie dann dieses URI Objekt als erstes Argument der Methode postForObject verwenden.

+0

Danke. Ich habe das etwas anders gelöst. Im echten Leben sieht meine URL eher wie "http://example.com/path/ {param}/to/place" aus, also habe ich 'UriComponentsBuilder.fromHttpUrl (url.replace (" {param} ", Parameter))' ' . – huwr

+1

Ich fand es besser, 'UriComponentsBuilder.fromUriString()' anstelle von 'fromHttpUrl()' zu verwenden, da URIs in Form von '/ pfad/ohne/host' erlaubt sind, was beim Testen mit Spring' MockMvc' nützlich ist. –

5

Sie können die Restvorlage erkennen, dass Sie die uri bereits codiert haben. Dies kann mithilfe von UriComponentsBuilder.build (true) erfolgen. Auf diese Weise versucht die Vorlage nicht, die URL zu verlassen. Die meisten Restvorlagen-Apis akzeptieren einen URI als erstes Argument.

String url = "http://example.com/path/to/my/thing/{parameter}"; 
url = url.replace("{parameter}", "%2F"); 
UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(url); 
// Indicate that the components are already escaped 
URI uri = builder.build(true).toUri(); 
ResponseEntity<MyClass> response = restTemplate.postForEntity(uri, payload, MyClass.class, parameter); 
Verwandte Themen