Cargando



Cómo hacer una API REST con SpringMVC en Java

Breve explicación de una API REST con los métodos get y post en java usando SpringMVC


jul 01 2016 11:29
Intermedio
jul 02 2016 11:37

En este tutorial se va a enseñar cómo hacer una breve API REST en Java, usando para ello SpringMVC. Veremos las instrucciones GET y POST, las operaciones DELETE y PUT convendría que las hicieras para practicar. Antes de empezar recomiendo descargar Eclipse STS, un IDE bueno para programar en Spring, nos facilita mucho a la hora de crear nuestros proyectos:

 

 

Nota
Debes tener java instalado, si eliges la versión 1.8 mejor.

 

Algunas cosas generales a tener en cuenta
  • Tenemos un controlador, que es el encargado de atender las peticiones que se hagan, la clase que haga de controlador hay que anotarla con @RestController.
  • Por cada URL tenemos que implementar un método. Cada método tendrá que ir con la anotación @RequestMapping con la URL a la que se atiende y el método de la petición y además devolverá el objeto deseado.

 

Ahora vamos a ver un ejemplo, en él tendremos una clase Persona y un controlador para la persona PersonaController.

 

1. Comenzar el proyecto

Abrimos STS y damos a nuevo proyecto “Spring Project Starter” , configuramos las opciones y el nombre y damos a Next, yo lo dejaré como puedes ver en la siguiente imagen:

 

[color=rgb(169,169,169)]Pincha en la imagen para ampliar[/color]

 

En la siguiente pantalla que te aparecerá debemos elegir las opciones que vamos a utilizar, lo vamos a dejar todo sin tocar y le damos a Finish y ya tenemos el proyecto creado, tendremos la siguiente estructura (Nota que yo ya he creado las 2 clases que vamos a usar, y la captura no es de STS):

 

estructuraSpring.jpg

 

Veremos que en src/main/java dentro del paquete hay creada una clase ya y que contiene el siguiente código:

@SpringBootApplication
public class EjemploApiApplication{

	public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
	}
}
Esta clase la dejamos tal cual, nos sirve para ejecutar nuestro ejemplo. Ahora vamos a ir a la clase pom.xml y comprobamos si tenemos el siguiente código, si no está simplemente lo añadimos:
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.3.3.RELEASE</version>
		<relativePath/>
	</parent>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>		
	</dependencies>
Nota
Es posible que tengas que actualizar tu proyecto con maven al guardar ese archivo, en STS tienes la opción para hacerlo (ALT + F5).

 

Ahora vamos a ver las clases que creamos que aspecto tienen.

 

2. Clase Persona

Primero ponemos el código y luego se explica.
public class Perona {
	private long id = -1;
	private String nombre;
	private int edad;

	public Persona() {

	}

	public Persona(String nombre, int edad) {
		super();
		this.nombre = nombre;
		this.edad = edad;
	}

	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public int getEdad(){
		return edad;
	}

	public void setEdad(int e) {
		edad = e;
	}

	public long getId() {
		return id;
	}

	public void setId(long id) {
		this.id = id;
	}
}
Esta clase no es nada difícil de comprender, lo único que tienes que saber es que necesitamos los get y set de cada atributo y también el constructor sin parámetros, ya que serán usados por el controlador, así evitaremos trabajar con muchos parámetros y Spring inyectara estos y creara el objeto.

 

3. Clase PersonaController

De nuevo como primera parte está el código y a continuación la explicación.
@RestController
public class PersonaController {

	private Map<Long, Persona> personas = new ConcurrentHashMap<>();
	private Long idUsado = 0;

	@RequestMapping(value = "/personas", method = RequestMethod.GET)
	public Collection<Anuncio> damePersonas() {
		return personas.values();
	}

	@RequestMapping(value = "/personas", method = RequestMethod.POST)
	@ResponseStatus(HttpStatus.CREATED)
	public Persona addPersona(@RequestBody Persona p) {
		idUsado++;
		p.setId(idUsado);
		personas.put(idUsado, p);

		return p;
	}

	@RequestMapping(value = "/personas/{id}", method = RequestMethod.GET)
	public ResponseEntity<Persona> getPersona(@PathVariable long id) {
		Persona p = personas.get(id);

		if (p != null) 
			return new ResponseEntity<>(p, HttpStatus.OK);

	    return new ResponseEntity<>(HttpStatus.NOT_FOUND);
		
	}

}
Como no vamos a usar base de datos creamos un mapa <id, Persona>, si tuviéramos una base de datos esto sería sustituido por su repositorio, y la variable de idUsado no sería necesaria, pero no es objetivo del tutorial añadir BD.
Dentro de la anotación RequestMapping vemos que tenemos también el método, por defecto es GET, por lo que en esos métodos no sería necesario añadirlo, pero no está de más.

 

Tenemos 3 métodos

damePersonas
Lo que va a hacer es devolver todas las personas que tenemos en nuestro mapa (personas.values()). No tiene mayor complicación.

 

addPersona
Es utilizado para añadir una persona a nuestra colección, puedes ver que el parámetro que tenemos está anotado con @RequestBody, es lo que recibimos del cliente (el cuerpo de la petición). La anotación
@ResponseStatus(HttpStatus.CREATED)
Se pone para devolver un 201 como código de respuesta. Se puede apreciar en el cuerpo como cada vez que se llama aumenta en uno el id, para que sea único y se lo asignamos a la persona, luego la añadimos al mapa y por último el cuerpo de respuesta de la función es esa misma persona.

 

getPersona
Nos va a devolver la persona pedida a través del id. Aquí tenemos que la función devuelve
ResponseEntity<Persona>
Esto es así para devolver un OK y la persona en caso de que exista o un NOT FOUND. El parámetro aquí viene anotado con @PathVariable, ese parámetro tendrá el valor del {id} que ves en RequestMapping y es lo que ponemos en la URL, por ejemplo /personas/1 llama a esta función con el id en 1.

 

 

Nota
La anotación RequestMapping puedes ponerla justo encima de la clase, como muestro a continuación:
@RestController
@RequestMapping("/personas")
public class PersonaController {
    ...
}
Si haces eso, evitarás repetir personas en cada método y puedes simplemente poner lo siguiente:
@RequestMapping(value = "/", method = RequestMethod.GET)
Si hay pocos métodos a lo mejor no te merece la pena, pero para muchos desde luego que es la mejor opción.

 

Bueno ya hemos terminado esta pequeña API.

 

4. Cómo ejecutar el proyecto

Para ejecutar el proyecto, selecciona tu proyecto, en la barra de menús veras un triángulo blanco dentro de un círculo verde (el run de siempre en elclipse), pincha en el pequeño triángulo negro que se encuentra a la derecha, sitúate en Run As y pincha en Spring Boot App.

 

[color=#a9a9a9]Pincha en la imagen para ampliar[/color]

 

Ahora si quieres ampliar el ejemplo te recomiendo añadir los métodos para atender peticiones PUT y DELETE, necesitarás saber el id de la persona a modificar, por lo que lo recibirás como en la última función y en PUT además necesitaras mandar los datos como lo hemos hecho en la función de POST.

 

Si quieres probar tu API REST sin tener que programar un cliente que haga las peticiones puedes usar Postman, es un plugin de Google Chrome:

 

postman1.jpg

 

Aquí puedes elegir el tipo de petición que quieras, rellenar las cabeceras y el cuerpo que se tienen que enviar, si requiere autenticación, etc. Es un programa muy completo.

 

[color=#a9a9a9]Pincha en la imagen para ampliar[/color]

 

Por ejemplo una petición get para obtener todas las personas en la API corriendo en localhost y escuchando en el puerto 80:

 

peticionPostMan.jpg


¿Te ayudó este Tutorial?


2 Comentarios

Interesante, nunca había manejado Spring! parece potente

Ya quiero aprender Java para ponerme con Spring. Gracias por el tutorial

No esperes más y entra en Solvetic
Deja tus comentarios y aprovecha las ventajas de la cuenta de usuario ¡Únete!

X