web-dev-qa-db-fra.com

RestTemplate pour ne pas échapper à l'URL

J'utilise Spring RestTemplate avec succès comme ceci:

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

Et c'est bien.

Cependant, parameter est parfois %2F. Je sais que ce n'est pas idéal, mais c'est ce que c'est. L'URL correcte doit être: http://example.com/path/to/my/thing/%2F mais quand j'ai défini parameter sur "%2F" il se double échappe à http://example.com/path/to/my/thing/%252F. Comment puis-je empêcher cela?

19
huwr

Au lieu d'utiliser une URL String, créez une URI avec une 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"

Utilisez UriComponentsBuilder#build(boolean) pour indiquer

si tous les composants définis dans ce générateur sont encodés (true) ou non (false)

Cela revient plus ou moins à remplacer {parameter} Et à créer vous-même un objet URI.

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

Vous pouvez ensuite utiliser cet objet URI comme premier argument de la méthode postForObject.

29

Vous pouvez dire au modèle de repos que vous avez déjà encodé l'URI. Cela peut être fait en utilisant UriComponentsBuilder.build (true). De cette façon, le modèle de repos ne tentera pas à nouveau d'échapper à l'uri. La plupart des api de modèles restants accepteront un URI comme premier 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);
10
rouble