Solución:
Para manipular fácilmente URL / ruta / parámetros / etc., puede usar la clase UriComponentsBuilder de Spring. Es más limpio que concatenar cadenas manualmente y se encarga de la codificación de URL por usted:
HttpHeaders headers = new HttpHeaders();
headers.set("Accept", MediaType.APPLICATION_JSON_VALUE);
UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url)
.queryParam("msisdn", msisdn)
.queryParam("email", email)
.queryParam("clientVersion", clientVersion)
.queryParam("clientType", clientType)
.queryParam("issuerName", issuerName)
.queryParam("applicationName", applicationName);
HttpEntity<?> entity = new HttpEntity<>(headers);
HttpEntity<String> response = restTemplate.exchange(
builder.toUriString(),
HttpMethod.GET,
entity,
String.class);
Las uriVariables también se expanden en la cadena de consulta. Por ejemplo, la siguiente llamada expandirá los valores tanto para la cuenta como para el nombre:
restTemplate.exchange("http://my-rest-url.org/rest/account/{account}?name={name}",
HttpMethod.GET,
httpEntity,
clazz,
"my-account",
"my-name"
);
por lo que la URL de solicitud real será
http://my-rest-url.org/rest/account/my-account?name=my-name
Consulte HierarchicalUriComponents.expandInternal (UriTemplateVariables) para obtener más detalles. La versión de Spring es 3.1.3.
Desde al menos Spring 3, en lugar de usar UriComponentsBuilder
para construir la URL (que es un poco detallada), muchos de El RestTemplate
Los métodos aceptan marcadores de posición en la ruta de los parámetros (no solo exchange
).
De la documentación:
Mucho de
RestTemplate
métodos acepta una plantilla de URI y variables de plantilla de URI, ya sea como unString
vararg, o como
Map<String,String>
.Por ejemplo con un
String
vararg:restTemplate.getForObject( "http://example.com/hotels/{hotel}/rooms/{room}", String.class, "42", "21");
O con un
Map<String, String>
:Map<String, String> vars = new HashMap<>(); vars.put("hotel", "42"); vars.put("room", "21"); restTemplate.getForObject("http://example.com/hotels/{hotel}/rooms/{room}", String.class, vars);
Referencia: https://docs.spring.io/spring/docs/current/spring-framework-reference/integration.html#rest-resttemplate-uri
Si miras el JavaDoc para RestTemplate
y busque “Plantilla URI”, puede ver con qué métodos puede usar marcadores de posición.