Cómo crear una API REST con Spring Boot
El acrónimo REST significa Transferencia de estado representacional, mientras que API significa Interfaz de programación de aplicaciones. Juntos, se refieren a una API REST. Una API REST es un servicio que transfiere solicitudes y respuestas entre dos sistemas de software, en una arquitectura REST.
La arquitectura REST crea servicios web a los que se puede acceder a través de URL utilizando uno de los cuatro verbos de solicitud: POST, GET, PUT y DELETE. Entonces, podría decir que una API REST es un software que le permite crear, leer, actualizar y eliminar recursos a través de URL.
Puede aprender a crear una API REST con Spring Boot.
Inicializar la aplicación Spring Boot
Lo primero que debe hacer es familiarizarse con los conceptos básicos de Spring y configurar una aplicación Spring Boot. Sin embargo, deberá modificar las dependencias. Además de la dependencia web, deberá obtener la dependencia de la API persistente de Java (JPA) de Spring Data y el controlador para la base de datos que pretende usar (esta aplicación usará MySQL).
Para esta API REST, necesitará un controlador, un modelo y un repositorio. Entonces, la API REST tendrá la siguiente estructura de archivos:
Crear el modelo
La primera clase que deberá crear es el modelo de cliente, que almacena la lógica de datos.
package com.onlineshopaholics.api.model;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
@Table(name="customer")
@Entity
public class Customer {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@Column(name="customername")
private String name;
private String email;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
De la clase de cliente anterior, verá que cada cliente tendrá una identificación, un nombre y un correo electrónico. También notará varias anotaciones que sirven para diferentes propósitos.
- @Entity: declara la clase de cliente como una entidad JPA. Esto significa que JPA utilizará los campos de la clase para crear columnas en una base de datos relacional.
- @Table: Designa el nombre de la tabla que se asignará a la clase de modelo de cliente.
- @Id: Designa una propiedad que identificará de forma única a la entidad en la base de datos.
- @GeneratedValue y @GenerationType: funcionan juntos para especificar una estrategia de generación automática para el campo con el que se asocia. Por lo tanto, el campo de identificación generará automáticamente un valor único cada vez que cree un nuevo cliente.
- @Column: Designa una propiedad que se asigna a una columna en la base de datos. Por lo tanto, la propiedad de nombre se asignará a una columna de nombre de cliente en la base de datos.
Crear el repositorio
Este repositorio le permitirá interactuar con los datos del cliente en la base de datos.
package com.onlineshopaholics.api.repository;
import org.springframework.data.repository.CrudRepository;
import com.onlineshopaholics.api.model.Customer;
public interface CustomerRepository extends CrudRepository<Customer, Integer>{}
El repositorio de clientes amplía la interfaz CrudRepositoy<T,ID> de Spring , pasándole la clase de modelo de Cliente junto con el tipo de identificador único para la entidad, Integer.
La interfaz de CrudRepository brinda acceso a más de 10 operaciones, incluidos los métodos CRUD genéricos que necesitará para la API REST. Entonces, debido a que CrudRepository ya define los métodos que necesitará, no es necesario declararlos explícitamente en la interfaz de CustomerRepository.
Crear el controlador
El controlador le permite actualizar los datos en su base de datos utilizando el modelo y el repositorio.
package com.onlineshopaholics.api.controller;
import java.util.Optional;
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.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import com.onlineshopaholics.api.model.Customer;
import com.onlineshopaholics.api.repository.CustomerRepository;
@RestController
@RequestMapping("/customers")
public class CustomerController {
@Autowired
private CustomerRepository customerRepository;
// create new customer
@PostMapping("/add")
public Customer addNewCustomer(@RequestBody Customer newCustomer){
Customer user = new Customer();
user.setName(newCustomer.getName());
user.setEmail(newCustomer.getEmail());
customerRepository.save(user);
return user;
}
// view all customers
@GetMapping("view/all")
public @ResponseBody Iterable<Customer> getAllCustomers(){
return customerRepository.findAll();
}
// view specific customer
@GetMapping("view/{id}")
public Optional<Customer> getCustomer(@PathVariable Integer id) {
return customerRepository.findById(id);
}
// update an existing customer
@PutMapping("/edit/{id}")
public String update(@RequestBody Customer updateCustomer, @PathVariable Integer id) {
return customerRepository.findById(id)
.map(customer -> {
customer.setName(updateCustomer.getName());
customer.setEmail(updateCustomer.getEmail());
customerRepository.save(customer);
return "Customer details have been successfully updated!";
}).orElseGet(() -> {
return "This customer doesn't exist";
});
}
// delete customer
@DeleteMapping("delete/{id}")
public String delete(@PathVariable("id")Integer id) {
customerRepository.deleteById(id);
return "Customer has been successfully deleted!";
}
}
El controlador anterior equipa la API REST con operaciones CRUD mediante el uso de cinco de los métodos de interfaz CrudRepository<T,ID> (cada uno asignado a un método específico). El controlador también utiliza varias anotaciones Spring importantes que le permiten realizar sus funciones.
- @RestController: esta anotación tiene dos propósitos. Marca una clase para el descubrimiento por escaneo de componentes. También le dice a Spring que escriba el valor de retorno para todos los métodos, en esta clase, en el cuerpo de la respuesta.
- @RequestMapping: define el patrón de solicitud de referencia que manejará el controlador. Entonces, este controlador manejará todas las solicitudes a «/ clientes».
- @ResponseBody: permite que un método devuelva una entidad completa.
- @RequestBody: le permite convertir el cuerpo de la solicitud en un objeto.
- @RequestParam: le permite aislar una propiedad de un objeto.
- @PathVariable: le permite asignar un valor de solicitud a un marcador de posición. Mapea el ID dado al método de eliminación con un valor existente en la base de datos.
- @PostMapping: Le permite crear recursos.
- @GetMapping: Le permite leer datos de recursos.
- @PutMapping: Le permite actualizar recursos.
- @DeleteMapping: Le permite eliminar recursos.
Conexión de la base de datos a su aplicación
Para conectar una base de datos a cualquier aplicación Spring, deberá usar el archivo application.properties en la carpeta de recursos. Este archivo inicialmente está vacío, por lo que puede completarlo con las propiedades apropiadas para la base de datos que desea utilizar. Esta aplicación utilizará una base de datos MySQL, por lo que el archivo application.properties contendrá los siguientes datos:
spring.jpa.hibernate.ddl-auto=update
spring.jpa.open-in-view=false
spring.datasource.url=jdbc:mysql://${MYSQL_HOST:localhost}:3306/onlineshopaholics
spring.datasource.username=root
spring.datasource.password=securepw
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
Los datos anteriores muestran que esta aplicación se conectará a una base de datos MySQL llamada onlineshopaholics, con un nombre de usuario «root» y «securepw» como contraseña. Su próximo paso es crear la base de datos y la tabla de clientes en MySQL.
Creación de solicitudes
Hay muchas herramientas que puede usar para probar su API REST. Postman es una herramienta de prueba de API REST popular y puede usarla para probar la API simple que ha creado. Después de crear la tabla MySQL y ejecutar la aplicación Spring, puede iniciar Postman y experimentar con los cuatro verbos de solicitud.
Solicitud POST
Esta solicitud le permitirá crear nuevos clientes utilizando la API REST. Para completar esta solicitud, deberá ir a la sección de encabezados de su solicitud de publicación y crear un nuevo encabezado (Tipo de contenido). Debe establecer el valor de este encabezado en application/json, ya que creará nuevos clientes con JSON.
En el cuerpo de la solicitud, deberá cambiar el tipo a raw e insertar su JSON. Luego deberás insertar la URL de la publicación:
El envío de la solicitud devolverá la siguiente respuesta:
Puede ver que la solicitud fue exitosa y que el nuevo cliente también tiene una identificación.
OBTENER solicitud
Ahora que tiene un cliente, puede verlo con la solicitud de obtención que devuelve todos los clientes:
O cada cliente por id:
Solicitud PUT
Puede actualizar a Janet con un nuevo apellido y correo electrónico.
Borrar petición
También puede eliminar a Janet de la base de datos.
Pruebe su API REST de Spring usando JUnit
Con Spring Boot, puede probar cualquier aplicación (incluidas las API REST) utilizando el archivo de prueba de Spring. Las pruebas de software son importantes para Spring Boot. Cada aplicación Spring inicializada utiliza JUnit para realizar pruebas y le permite enviar solicitudes a sus API REST.
Deja una respuesta