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?
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
.
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);