Cliente Rest con Spring
Después de Servicio Web Restful con Spring Boot, vamos a ver ahora como hacer el cliente REST con Spring. Podemos hacerlo con SpringBoot, o simplemente usar la clase RestTemplate
que nos ofrece Spring-web en nuestro main
de toda la vida.
Dependencias[editar]
Las dependencias que necesitamos son (en formato maven)
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>1.3.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.7.3</version>
</dependency>
</dependencies>
Si no queremos SpringBoot, la primera dependencia no es necesaria.
Instanciar RestTemplate
[editar]
Instanciar RestTemplate
es muy sencillo, tan tonto como esto
RestTemplate restTemplate = new RestTemplate();
A partir de aquí, basta usar sus métodos para hacer llamadas GET, POST, PUT y DELETE al servicio web correspondiente. Veamos un ejemplo de cada una de ellas.
El Servicio Web que vamos a usar en el lado del servidor es el de Servicio Web Restful con Spring Boot, cuyo código puedes encontrar en Github. También el cliente completo con y sin boot, lo tienes en GitHub
Llamada GET[editar]
La llamada GET se puede hacer con el método getForObject
de RestTemplate
. Aquí tienes dos líneas de ejemplo, una para pedir un elemento concreto, la otra para pedir una lista de elementos
// Petición de una lista de objetos
Greeting[] greetings = restTemplate.getForObject("http://localhost:8080/greeting", Greeting[].class);
// Petición de un objeto concreto
Greeting aGreeting = restTemplate.getForObject("http://localhost:8080/greeting/0", Greeting.class);
Los parámetros son
- url del servicio web al que queremos llamar. Esa url puede devolver una lista de objetos o solo uno, según este programado el servidor.
- La clase que esperamos como respuesta. En el primer caso un array
Greeting[].class
, en el segundo caso, sólo un objetoGreeting
De retorno obtendremos el objeto o array de objetos solicitados.
Llamada a POST[editar]
La llamada a POST puede ser algo como esto
String name = "New Greeting";
MultiValueMap<String, Object> values = new LinkedMultiValueMap<String, Object>();
values.add("content", name);
Greeting gretting = restTemplate.postForObject("http://localhost:8080/greeting", values, Greeting.class);
Necesitamos un objeto, propio de Spring, de tipo MultiValueMap
. Ahí metemos todos los parámetros que tengamos que pasar a la petición POST. En nuestro caso, el servicio web solo necesita un String (el texto para el Greeting
) con la clave "content".
Una vez creado y relleno el MultiValueMap
basta una llamada al método postForObject()
con los siguiente parámetros:
- url del servicio web en el que queremos hacer la petición POST
- El
MultiValueMap
con todas las claves/valor necesarias como parámetros de la petición. - El tipo
Greeting.class
que esperamos como respuesta y que obtendremos en el retorno del método.
Llamada a PUT[editar]
Esta también es sencilla. Basta algo como esto
Greeting aGreeting = new Greeting(1,"Modified Greeting");
// Queremos modificar el Greeting de la posicion 1, final de la url.
restTemplate.put("http://localhost:8080/greeting/1", aGreeting);
Se crea el objeto Greeting
que queremos enviar al servicio web y se hace la llamada al método put()
de RestTemplate
con los siguientes parámetros:
- url del servicio web al que vamos a hacer PUT
- El
Greeting
que queremos enviar.
Llamada a DELETE[editar]
Más fácil todavía, no hace falta más que un parámetro
// Queremos borrar la posición 2
restTemplate.delete("http://localhost:8080/greeting/2");
Más métodos[editar]
Por supuesto, RestTemplate
tiene muchos más métodos para hacer el mismo tipo de peticiones, pero con más control sobre ellas. No nos vamos a liar ahora, basta con ver unas llamadas básicas como acabamos de ver.