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.