por - restful java
RestTemplate: Cómo enviar los parámetros de URL y consulta juntos (2)
Estoy intentando pasar los parámetros de ruta y de consulta en una URL, pero obtengo un error extraño. debajo está el código
String url = "http://test.com/Services/rest/{id}/Identifier"
Map<String, String> params = new HashMap<String, String>();
params.put("id", "1234");
UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(url)
.queryParam("name", "myName");
String uriBuilder = builder.build().encode().toUriString();
restTemplate.exchange(uriBuilder , HttpMethod.PUT, requestEntity,
class_p, params);
y mi url se está convirtiendo en http://test.com/Services/rest/%7Bid%7D/Identifier?name=myName
¿Qué debo hacer para que funcione? Estoy esperando http://test.com/Services/rest/{id}/Identifier?name=myName
para que params agregue id a la url
Por favor recomiende. gracias por adelantado
Un problema con la respuesta de Michal Foksa es que primero agrega los parámetros de consulta y luego expande las variables de ruta. Si el parámetro de consulta contiene paréntesis, por ejemplo, {foobar}
, esto causará una excepción.
La forma segura es expandir primero las variables de ruta y luego agregar los parámetros de consulta:
String url = "http://test.com/Services/rest/{id}/Identifier";
Map<String, String> params = new HashMap<String, String>();
params.put("id", "1234");
URI uri = UriComponentsBuilder.fromUriString(url)
.buildAndExpand(params)
.toUri();
uri = UriComponentsBuilder
.fromUri(uri)
.queryParam("name", "myName")
.build()
.toUri();
restTemplate.exchange(uri , HttpMethod.PUT, requestEntity, class_p);
Yo usaría buildAndExpand
de UriComponentsBuilder
para pasar todos los tipos de parámetros URI.
Por ejemplo:
String url = "http://test.com/solarSystem/planet/{planet}/moon/{moon}";
// URI (URL) parameters
Map<String, String> uriParams = new HashMap<String, String>();
uriParams.put("planet", "Mars");
uriParams.put("moon", "Phobos");
// Query parameters
UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(url)
// Add query parameter
.queryParam("firstName", "Mark")
.queryParam("lastName", "Watney");
System.out.println(builder.buildAndExpand(uriParams).toUri());
/**
* Console output:
* http://test.com/solarSystem/planet/Mars/moon/Phobos?firstName=Mark&lastName=Watney
*/
restTemplate.exchange(builder.buildAndExpand(uriParams).toUri() , HttpMethod.PUT,
requestEntity, class_p);
/**
* Log entry:
* org.springframework.web.client.RestTemplate Created PUT request for "http://test.com/solarSystem/planet/Mars/moon/Phobos?firstName=Mark&lastName=Watney"
*/