Curso de Spring Boot | Petición Rest 1

Curso de Spring Boot
Petición Rest

Curso de Spring Boot | Petición Rest 2

Controlador

package com.app.controllers
...
@CrossOrigin // Para hacer peticiones desde otro servidor
@RestController // Para hacer peticiones REST
@RequestMapping("/people")
public class PersonaController {

 @Autowired
 private PersonaRepository personaRepository;
 
 @PostMapping("/")
 public void createPeople(@RequestBody Persona person) {
  personaRepository.save(person);
 }

 @DeleteMapping("/{id}")
 public void deletePeople(@PathVariable("id") Integer id) {
  personaRepository.deleteById(id);
 }
 
 @GetMapping
 public List<Persona> selectPeople() {
  List<Persona> people = personaRepository.findAll();
  return people;
 }
 
 @PutMapping("/{id}")
 public void updatePeople(@RequestBody Persona person, @PathVariable("id")Integer id) {
  person.setId(id);
  personaRepository.save(person);
 }
}

Modelo

package com.app.repositories.PersonaRepository
...
public interface PersonaRepository extends JpaRepository<Persona, Integer> {
/*
   Puedes ampliar las operaciones contra la base de datos que es posible realizar con el repository añadiendo líneas como las siguientes a esta interfaz:

   @Query("SELECT e FROM Equipo e WHERE e.equipoCod=:id")
   Equipo findEquipoByEquipoCod(@Param("id")int id);

   List<Asignatura> findByUserlistContaining(user);

   @Transactional
   void deleteByNombre(String nombre);
*/
}

Probando las peticiones

Aquí tienes el conjunto de de peticiones del frontend que se estan comunicando con la API anterior.

./src/services/api.js

import axios from 'axios';
export default api= axios.create({ baseURL: 'http://localhost:8080/people' });

./src/services/guests.js

import api from './api.js';

export const savePersonName = async (obj) => await instance.post('/', obj)

export const getPersons = async () => await instance.get();

export const deletePerson = async (id) => await instance.delete('/' + id);

export const updatePerson = async (id, name) => await instance.put('/'+id, { nombre: name });

Para probar las peticiones post con Postman:

Curso de Spring Boot | Petición Rest 3

Ejercicios REST

En los siguientes ejercicios tendrás que descargar el código fuente de una Single Page Application hecha con react. Esta aplicación tendrá uno o varios ficheros desde los que se harán peticiones a una API creada con SpringBoot.

Lista de invitados

Hacer una página web para una lista de invitados con 4 secciones. Una para consultar los invitados, otra para dar de alta un nuevo invitado y otra para darlo de baja.La tabla que usaremos tendrá dos campos: nombre (VARCHAR) e ID (INT, AUTOINCREMENT, PK).

Cada uno de los siguientes pantallazos representa una página diferente.

Curso de Spring Boot | Petición Rest 4
Curso de Spring Boot | Petición Rest 5
Curso de Spring Boot | Petición Rest 6
Curso de Spring Boot | Petición Rest 7

Ejercicio futbol

En una primera página mostraremos un listado de equipos de futbol. Luego, al pulsar en uno de los equipos, mostraremos el listado de sus jugadores, la foto del equipo y la foto del escudo en una página independiente.

Curso de Spring Boot | Petición Rest 8
Curso de Spring Boot | Petición Rest 9
Necesitaremos añadir este código al repository
@Query("SELECT e FROM Equipo e WHERE e.equipo_cod=:id")
Equipo findEquipoByEquipoCod(@Param("id")int id);

Hospital

Curso de Spring Boot | Petición Rest 10

Librería

Curso de Spring Boot | Petición Rest 11
Curso de Spring Boot | Petición Rest 12
Curso de Spring Boot | Petición Rest 13

Ejercicio calidades

Pantallazo listado jugadores

Subir una imagen

Necesitaremos definir el siguiente fichero de configuración, que habilita la posibilidad de subir ficheros al servidor mediante peticiones HTTP.

com.pablomonteserin.prueba.config.Config

package com.app.config.WebConfig
...
@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        // Mapea /uploads/images/** a la carpeta física del servidor
        String uploadPath = System.getProperty("user.dir") + "/uploads/";

        registry.addResourceHandler("/uploads/**")
                .addResourceLocations("file:" + uploadPath);
    }
}

Y el siguiente método del controlador:

private final Path root = Paths.get("uploads");

@PostMapping("/upload")
public ResponseEntity<?> handleFileUpload(@RequestParam("file") MultipartFile file) {
 try {
  Files.copy(file.getInputStream(), this.root.resolve(file.getOriginalFilename()));
  return ResponseEntity.ok().body("{\"resp\":\"Archivo cargado con éxito\"}");

 } catch (Exception e) {
  if (e instanceof FileAlreadyExistsException) {
   throw new RuntimeException("A file of that name already exists.");
  }
  throw new RuntimeException(e.getMessage());
 }
}

Probando la subida

Con Postman:

Curso de Spring Boot | Petición Rest 15

Con HTML y Javascript

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <h2>Con Ajax</h2>
    <form action="#" id="fileUploadForm" method="post">
      <input type="file" name="file" id="file" />
      <button type="submit">Enviar</button>
    </form>
   
    <script>
      document
        .getElementById("fileUploadForm")
        .addEventListener("submit", function (e) {
          e.preventDefault();
          const formData = new FormData();
          const imagefile = document.querySelector("#file");
          formData.append("file", imagefile.files[0]);
          fetch("http://localhost:8080/evento/upload", {
            method: "POST",
            body: formData,
          })
            .then((response) => {
              return response.json();
            })
            .then((data) => {
              alert("Imagen cargada con éxito");
            })
            .catch((error) => {
              alert("Error al cargar la imagen");
            });
        });
    </script>
  </body>
</html>