Curso de Spring Boot

Normalmente Spring Boot se usa como backend, y el frontend se desarrolla con frameworks como:

  • Angular
  • React
  • Vue

El frontend se comunica con el backend mediante APIs REST.

Arquitectura típica:

1Frontend (Angular / React)
23      API REST
45Spring Boot Backend
67     Base de datos

18.1 Ejemplo de API en Spring Boot

Supongamos este endpoint:

1@RestController
2@RequestMapping("/users")
3public class UserController {
4
5    @GetMapping
6    public List<UserDTO> getUsers() {
7
8        return List.of(
9                new UserDTO(1L,"Ana","ana@email.com"),
10                new UserDTO(2L,"Carlos","carlos@email.com")
11        );
12
13    }
14
15}

URL de la API:

1http://localhost:8080/users

18.2 Consumir API desde Angular

Ejemplo usando HttpClient.


Servicio Angular

1@Injectable({
2  providedIn: 'root'
3})
4export class UserService {
5
6  constructor(private http: HttpClient) {}
7
8  getUsers() {
9    return this.http.get<User[]>('http://localhost:8080/users');
10  }
11
12}

Usar servicio en componente

1export class UserComponent {
2
3  users: User[] = [];
4
5  constructor(private userService: UserService) {}
6
7  ngOnInit() {
8
9    this.userService.getUsers()
10      .subscribe(data => {
11        this.users = data;
12      });
13
14  }
15
16}

18.3 Consumir API desde React

Ejemplo usando fetch.

1useEffect(() => {
2
3  fetch("http://localhost:8080/users")
4    .then(res => res.json())
5    .then(data => setUsers(data));
6
7}, []);

18.4 Problema CORS

Cuando frontend y backend están en servidores diferentes, el navegador puede bloquear la petición.

Ejemplo:

1Frontend → localhost:4200
2Backend → localhost:8080

Error típico:

1CORS policy blocked request

18.5 Solución CORS en Spring Boot

Podemos permitir peticiones desde el frontend.


Configuración global

1@Configuration
2public class CorsConfig {
3
4    @Bean
5    public WebMvcConfigurer corsConfigurer() {
6
7        return new WebMvcConfigurer() {
8
9            @Override
10            public void addCorsMappings(CorsRegistry registry) {
11
12                registry.addMapping("/**")
13                        .allowedOrigins("http://localhost:4200")
14                        .allowedMethods("*");
15
16            }
17
18        };
19
20    }
21
22}

18.6 Permitir CORS en un controller

También se puede usar:

1@CrossOrigin(origins = "http://localhost:4200")
2@RestController
3@RequestMapping("/users")
4public class UserController {
5
6}

18.7 Enviar datos desde frontend

Ejemplo crear usuario.


Angular

1createUser(user: User) {
2  return this.http.post("http://localhost:8080/users", user);
3}

JSON enviado

1{
2  "name": "Ana",
3  "email": "ana@email.com"
4}

Controller Spring

1@PostMapping
2public User createUser(@RequestBody CreateUserDTO dto) {
3
4    return service.createUser(dto);
5
6}

18.8 Autenticación con JWT

En aplicaciones modernas el frontend se autentica con JWT.


Flujo

11 login
22 backend genera token
33 frontend guarda token
44 frontend envía token en cada petición

Login request

1{
2  "username": "admin",
3  "password": "1234"
4}

Respuesta

1{
2  "token": "eyJhbGciOiJIUzI1NiIs..."
3}

18.9 Enviar token desde frontend

Angular:

1const headers = {
2  Authorization: "Bearer " + token
3};
4
5this.http.get("/users", { headers });

React:

1fetch("/users", {
2  headers: {
3    Authorization: "Bearer " + token
4  }
5});

18.10 Interceptor en Angular

Lo ideal es enviar el token automáticamente.


Ejemplo

1@Injectable()
2export class AuthInterceptor implements HttpInterceptor {
3
4  intercept(req: HttpRequest<any>, next: HttpHandler) {
5
6    const token = localStorage.getItem("token");
7
8    if(token) {
9      req = req.clone({
10        setHeaders: {
11          Authorization: "Bearer " + token
12        }
13      });
14    }
15
16    return next.handle(req);
17
18  }
19
20}

18.11 Arquitectura típica frontend + backend

1Angular / React
23     API REST
45Spring Boot
67Database

18.12 Buenas prácticas

No exponer entidades

Usar DTO.


Manejar errores HTTP

Ejemplo:

1404 usuario no encontrado
2401 no autorizado

Usar tokens JWT

Evita sesiones en servidor.


Configurar CORS correctamente

Permitir solo dominios necesarios.

  • Loading...