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:
- 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.
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):
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>
Ahora vamos a ver las clases que creamos que aspecto tienen.
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.
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.
@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.
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.
@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.
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:
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: