template mvc español cliente java spring resttemplate

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