English English

Cómo crear una API de REST en Spring Boot 2

Este es un tutorial de introducción sobre cómo crear una API de REST que realice operaciones de CRUD. Puede obtener, agregar, actualizar y borrar datos.

Dependencia

Necesitas añadir la dependencia "spring-boot-starter-web", además de tu dependencia estándar "Spring" ("spring-boot-starter-parent").

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

Explicación

Una API REST tiene puntos finales que son una "URL" a la que se puede acceder para enviar o recuperar datos de la API. Tienes que usar comandos "HTTP" como "GET", "POST", "DELETE", "UPDATE" y más para comunicarte con la API.

  • "GET": Recuperar datos de la API.
  • "POST": Enviar datos a la API. Quieres añadir un nuevo objeto, por ejemplo.
  • "UPDATE": Actualizar datos. Quiere actualizar un objeto existente.
  • "DELETE": Borrar datos. Borrar un objeto existente.

Los puntos finales de la API se agrupan en una clase que es un "RestController". Una clase "RestController" se crea utilizando la anotación "@RestController". Por ejemplo: si quiere guardar productos y direcciones en su API, entonces tiene que crear una clase "RestController" para los productos y una clase "RestController" para las direcciones.
Un endpoint de la API podría cargar un determinado producto con el id de producto "1" de su base de datos. Los endpoints de la API se declaran añadiendo una anotación de "Mapeo" a una función que tiene la funcionalidad de ese endpoint de la API.
Por ejemplo, estas anotaciones de "Mapeo" están disponibles:

@GetMapping("/MY_API_URL")
@PostMapping("/MY_API_URL")
@PutMapping("/MY_API_URL")
@DeleteMapping("/MY_API_URL")

Estos realizan las operaciones "HTTP" que se mencionan arriba. Se añade una de estas anotaciones a una función para implementar la funcionalidad de esa operación.
Los parámetros se definen por su nombre entre corchetes en la "URI" y se añaden a los argumentos de una función con la anotación "@PathVariable". Luego pueden ser recuperados por la función.
Ejemplo:

@GetMapping("/customer/{customerId}")
public ResponseEntity<Customer> getCustomerById(@PathVariable Long id) {
...
}

Si llamas a la URL de la API con cualquier número "/cliente/1", entonces se llamará a la función "getCustomerById". La anotación "GetMapping" asigna la url de la API a esta función y el id "id" pasado a la variable "id" "Long" en el argumento de esta función.

 

Si quieres enviar datos a la "API", entonces tienes que usar un objeto JSON en el "cuerpo" de la petición HTTP. En este caso se utiliza una anotación "@PostMapping". La anotación "@RequestBody" se utiliza para mapear un objeto JSON (que es enviado por el usuario de la API) a la variable de argumento de una función de la API. Toda la comunicación entre la API y el cliente se realiza a través de los objetos JSON.
La función del punto final de la API devuelve un objeto "ResponseEntity" que contiene un objeto y un código de estado HTTP. Si la solicitud de la "API" se ha realizado correctamente, se devuelve el objeto solicitado y el estado HTTP "200 OK".

Las anotaciones de "mapping" mencionadas también tienen argumentos adicionales.

Ejemplo:

@PostMapping(path= "/save", consumes = "application/json", produces = "application/json")

El argumento "consumes" define los datos de objeto del tipo de datos que se envían a la API". "produces" define el tipo de datos de objeto que es devuelto por la API.

 

@RequestMapping(path="/users")

Puede definir una ruta base para los puntos finales de la API de la clase "RestController", utilizando este comando.

 

Ejemplo

Este es un ejemplo en el que un cliente puede ser cargado, añadido, actualizado o eliminado. La clase "CustomerService" se utiliza para acceder a los métodos que realizan las operaciones de la base de datos. La clase modelo "Customer" guarda un cliente con los campos como "customerId", "companyName", "forename" y más.

@RestController
public class CustomerController {

    @Autowired
    private CustomerService customerService;
    private final String BASE_API_URL = "/api/customer";

    /**
     * Get all customers. HTTP GET command.
     *
     * @return
     */    
    @GetMapping(BASE_API_URL + "/all")
    public ResponseEntity<List<Customer>> getAllCustomer() {
        List<Customer> customerList = this.customerService.getAllCustomer();
        if (!CollectionUtils.isEmpty(customerList)) {
            return status(HttpStatus.OK).body(customerList);
        } else {
            return status(HttpStatus.BAD_REQUEST).body(new ArrayList<Customer>());
        }
    }

    /**
     * Get a customer with a certain id. HTTP GET command.
     *
     * @return
     */
    @GetMapping(BASE_API_URL + "/get/byEmail/{email}")
    public ResponseEntity<Customer> getOwnerByEmail(@PathVariable String email) {
        try {
            return status(HttpStatus.OK).body(this.customerService.getCustomerByEmail(email));
        } catch (DataValueNotFoundException e) {
            return status(HttpStatus.BAD_REQUEST).body(new Customer());
        }
    }

    /**
     * Add a customer. HTTP POST command. 
     * @param newCustomer
     * @return 
     */
    @PostMapping(BASE_API_URL + "/add")
    public ResponseEntity<String> addCustomer(@RequestBody Customer newCustomer) {
        int resultCode = this.customerService.save(newCustomer);

        switch (resultCode) {
            case 0:
                return ResponseEntity.ok("OK. Customer was added successfully.");
            case 1:
                return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("ERROR. Customer cannot be null!");
            case 2:
                return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("ERROR. Customer could not be saved!");
            case 3:
                return ResponseEntity.status(HttpStatus.BAD_REQUEST)
                        .body("ERROR. Customer E-Mail already exists! Please select another e-mail.");
            default:
                return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("ERROR. Customer could not be saved!");
        }
    }
	
    /**
     * Update an existing customer. HTTP PUT command. 
     * @param id
     * @param customer
     * @return 
     */
    @PutMapping(BASE_API_URL + "/update/{id}")
    public ResponseEntity<String> updateOwner(@PathVariable Long id, @RequestBody Customer customer) {
        int resultCode = this.customerService.update(customer);

        switch (resultCode) {
            case 0:
                return ResponseEntity.ok("OK. Update was successful.");
            case 1:
                return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("ERROR. Customer cannot be null!");
            case 2:
                return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("ERROR. Customer does not exist!");
            case 3:
                return ResponseEntity.status(HttpStatus.BAD_REQUEST)
                        .body("ERROR. Customer E-Mail already exists! Please select another e-mail.");
            default:
                return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("ERROR. Update failed!");
        }

    }

	
     /**
      * Delete an existing customer. HTTP DELETE command. 
      * @param customerId
      * @return 
      */	
    @DeleteMapping(BASE_API_URL + "/delete/{id}")
    public ResponseEntity<String> deleteAccountType(@PathVariable Long customerId) {
        if (this.customerService.deleteById(customerId)) {
            return ResponseEntity.ok("Your customer was deleted successfully.");
        } else {
            return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Error. Customer does not exists!");
        }
    }
}

Aquí se puede acceder a la API desde la url base "/api/customer" y el respectivo punto final de la API.
Por ejemplo, si se desea obtener todos los clientes, se llamaría a esta URL de la API con el comando HTTP "GET":

/api/customer/all

 

Probando el "REST API" creado

Puedes usar la aplicación "Postman" para probar tu API. Si quieres ver sólo la salida, puedes llamar directamente a la url de la API.

Probando el método de punto final de la API "getAllCustomer":

GET /api/customer/all

 

La resultante del "API" se muestra en el "Cuerpo" como un objeto JSON.

 

Documentación de Spring Boot:
https://docs.spring.io/spring-boot/docs/current/api/

Descargue Postman:
https://www.postman.com/downloads/

Documentación de Spring:
https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/ 

https://docs.spring.io/spring-framework/docs/current/javadoc-api/

 

Usamos cookies en nuestro sitio web. Algunas de ellas son esenciales para el funcionamiento del sitio, mientras que otras nos ayudan a mejorar el sitio web y también la experiencia del usuario (cookies de rastreo). Puedes decidir por ti mismo si quieres permitir el uso de las cookies. Ten en cuenta que si las rechazas, puede que no puedas usar todas las funcionalidades del sitio web.