Cliente Rest con Spring

De ChuWiki

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 objeto Greeting

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.