Mi primer API Rest con Spring Boot

En este artículo crearemos una API REST con Spring Boot, una tecnología de Spring, cabe mencionar que Spring framework es la tecnología más utilizada para la plataforma Java.

Con Spring Boot nos facilitamos las configuraciones como las dependencias de conexión con la base de datos, despliegue del servidor, entre otras.

Utilizaremos MySQL como nuestro gestor de base de datos y maven como el gestor de la aplicación.

Crear el proyecto con Spring Boot

Como lo hemos dicho anteriormente utilizaremos la tecnología Spring Boot, esta nos facilitara las configuraciones y solo tendremos que enfocarnos en el código de nuestra aplicación.

Para iniciar con nuestro proyecto lo realizaremos con spring initializr.

Descripción de los campos:

Project: Seleccionamos el gestor de nuestra aplicación maven o gradle, utilizaremos maven

Languaje: Elegimos con qué lenguaje queremos trabajar, utilizaremos Java

Spring Boot: Seleccionamos la versión con la que queremos trabajar, se deja la que está por default

Project Metadata: Aquí ingresamos el nombre de nuestro proyecto

Packaging: Seleccionamos el empaquetado de nuestra aplicaciones

Java: Seleccionamos la versión de Java

Dependecies: Aquí buscaremos las dependencias que necesitemos, buscamos y agregamos las que se muestran a continuación.

Damos clic en Generate para descargar el proyecto, una vez descargado lo descomprimimos.

Para el desarrollo de la aplicación utilizamos Spring Tool Suite (STS), en este IDE importamos el proyecto como Existing Maven Projects

Nos aparecerá un archivo pom.xml, marcamos el check y damos clic en next.

Nuestro proyecto (STS) empezará a descargar las dependencias que seleccionamos anteriormente, estas se encuentran en el archivo pom.xml

La Base de datos

Esta será la estructura de nuestra base de datos.

En el archivo application.properties con la siguiente ruta de acceso: src/main/resources/ agregamos el string de conexión para ingresar a la base de datos que creamos anteriormente.

spring.datasource.url=jdbc:mysql://localhost:3306/test?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=

spring.jpa.show-sql=true

Desarrollo de la API

La siguiente estructura de paquetes es la que creamos para la aplicación.

La clase DemoApplication.java

Es la clase que arranca cuando iniciamos la aplicación.

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;

@SpringBootApplication
@EnableJpaAuditing
public class DemoApplication {

	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);
		
	}
	
}

La clase Person.java

La entidad de nuestro objeto Person, esta clase va a mapear los atributos como campos en la base de datos.

package com.example.demo.model;

import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EntityListeners;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

@Entity
@Table(name = "users")
@EntityListeners(AuditingEntityListener.class)
public class Person {
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;
	private String name;
	
	@Column(name = "user_name")
	private String userName;
	
	@Column(name = "date_registry")
	@CreatedDate
	private Date date;
	
	public Person() {

	}

	public Person(Long id, String name, String userName, Date date) {
		this.id = id;
		this.name = name;
		this.userName = userName;
		this.date = date;
	}
	
	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public Date getDate() {
		return date;
	}

	public void setDate(Date date) {
		this.date = date;
	}

	@Override
	public String toString() {
		return "Person [id=" + id + ", name=" + name + ", userName=" + userName + ", date=" + date + "]";
	}

}

La clase PersonRepository.java

Esta clase nos ayuda a realizar operaciones en nuestra base de datos sin escribir tantas líneas de código, Spring Data realiza esto por nosotros, operaciones como delete, save, findAll, son algunos de los métodos que realiza automáticamente.

package com.example.demo.repository;

import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import com.example.demo.model.Person;

@Repository
public interface PersonRepository extends JpaRepository<Person, Long>{
	
	List<Person> findByName(@Param("name") String name);
	
}

La clase PersonController.java

Esta clase le indica a spring que la clase va a ser un controlador de una API Rest, nos proveerá de todos los métodos para un CRUD.

package com.example.demo.Controlller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.example.demo.model.Person;
import com.example.demo.repository.PersonRepository;

@RestController
@RequestMapping("/api")
public class PersonController {
	
	@Autowired
	private PersonRepository repository;
	
	
	@GetMapping("/persons")
	public List<Person> allPersons(){
		return repository.findAll();
	}
	
	@GetMapping("/person/{name}")
	public List<Person> findByName(@PathVariable("name") String name) {
		return repository.findByName(name);
	}
	
	@PostMapping("/person")
	public Person createPerson(@RequestBody Person person) {
		return repository.save(person);
	}
	
	@PutMapping("/person/{id}")
	public Person updatePerson(@PathVariable int id ,@RequestBody Person person) {
		return repository.save(person);
	}
	
	@DeleteMapping("/person/{id}")
	public void deletePerson(@PathVariable("id") Long id) {
		repository.deleteById(id);
	}
}


Para realizar las pruebas correspondientes vamos a utilizar postman una aplicación para probar api's.

Realizamos una prueba para almacenar un nuevo registro, para esto utilizamos un método POST.

Con el método POST nosotros podemos almacenar nuevos registros en nuestra base de datos.

Probamos la petición Get

Esta petición get nos traerá todos los registros

Prueba de la petición Get con parámetro

Con la petición Get con parámetro name, podemos buscar un objeto Person por medio del name.

Prueba para actualizar un registro

Este es el registro que queremos actualizar.

A continuación con el método PUT, actualizamos el registro

Este es una API Rest muy sencilla, pero cuando recien estan empezando, sirve de mucho para entender como Spring maneja las anotaciones quienes nos ahorran líneas de código.

Recuerda que puedes aprender a crear API REST de forma profesional con nuestro curso Mastering API REST con Spring boot, donde te enseñaremos desde cero a crear un API REST completa, con las mejores prácticas.