java - mvc - resttemplate spring español
RestTemplate para NO escapar de la url (2)
En lugar de utilizar una URL de String
, UriComponentsBuilder
un URI
con un 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"
Use UriComponentsBuilder#build(boolean)
para indicar
si todos los componentes establecidos en este constructor están codificados (
true
) o no (false
)
Esto es más o menos equivalente a reemplazar {parameter}
y crear un objeto URI
usted mismo.
String url = "http://example.com/path/to/my/thing/{parameter}";
url = url.replace("{parameter}", "%2F");
URI uri = new URI(url);
System.out.println(uri);
Luego puede usar este objeto URI
como el primer argumento del método postForObject
.
Estoy usando Spring RestTemplate con éxito de esta manera:
String url = "http://example.com/path/to/my/thing/{parameter}";
ResponseEntity<MyClass> response = restTemplate.postForEntity(url, payload, MyClass.class, parameter);
Y eso es bueno.
Sin embargo, a veces el parameter
es %2F
. Sé que esto no es lo ideal, pero es lo que es. La URL correcta debe ser: http://example.com/path/to/my/thing/%2F
pero cuando configuro el parameter
en "%2F"
se hace doble escape a http://example.com/path/to/my/thing/%252F
. ¿Cómo puedo prevenir esto?
Puede indicar al resto de la plantilla que ya ha codificado el uri. Esto se puede hacer usando UriComponentsBuilder.build (true). De esta manera, la plantilla de reposo no intentará escapar del uri. La mayoría de las api de la plantilla de resto aceptarán un URI como primer argumento.
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);