En aquest tema, aprendrem com gestionar els diferents mètodes HTTP en una aplicació Spring Boot. Els mètodes HTTP són fonamentals per a la comunicació entre clients i servidors en aplicacions web. Els mètodes més comuns són GET, POST, PUT, DELETE, però n'hi ha d'altres com PATCH, OPTIONS, i HEAD.
Objectius
- Entendre els diferents mètodes HTTP i les seves funcions.
- Aprendre a implementar aquests mètodes en controladors Spring Boot.
- Veure exemples pràctics de cada mètode HTTP.
- Realitzar exercicis per reforçar els conceptes apresos.
Mètodes HTTP comuns
GET
El mètode GET s'utilitza per sol·licitar dades d'un servidor. És idempotent, el que significa que múltiples sol·licituds GET no haurien de tenir efectes col·laterals.
POST
El mètode POST s'utilitza per enviar dades al servidor per crear un nou recurs. No és idempotent, ja que enviar la mateixa sol·licitud POST diverses vegades pot crear múltiples recursos.
PUT
El mètode PUT s'utilitza per actualitzar un recurs existent o crear-lo si no existeix. És idempotent.
DELETE
El mètode DELETE s'utilitza per eliminar un recurs. És idempotent.
PATCH
El mètode PATCH s'utilitza per aplicar modificacions parcials a un recurs.
OPTIONS
El mètode OPTIONS s'utilitza per descriure les opcions de comunicació per al recurs de destinació.
HEAD
El mètode HEAD és similar a GET, però només retorna les capçaleres de la resposta sense el cos.
Implementació en Spring Boot
Configuració del controlador
A continuació, veurem com implementar aquests mètodes en un controlador Spring Boot.
import org.springframework.web.bind.annotation.*; import java.util.ArrayList; import java.util.List; @RestController @RequestMapping("/api/items") public class ItemController { private List<String> items = new ArrayList<>(); // GET: Obtenir tots els ítems @GetMapping public List<String> getAllItems() { return items; } // POST: Crear un nou ítem @PostMapping public String createItem(@RequestBody String item) { items.add(item); return "Item creat: " + item; } // PUT: Actualitzar un ítem existent @PutMapping("/{index}") public String updateItem(@PathVariable int index, @RequestBody String item) { if (index >= 0 && index < items.size()) { items.set(index, item); return "Item actualitzat: " + item; } else { return "Ítem no trobat"; } } // DELETE: Eliminar un ítem @DeleteMapping("/{index}") public String deleteItem(@PathVariable int index) { if (index >= 0 && index < items.size()) { String removedItem = items.remove(index); return "Item eliminat: " + removedItem; } else { return "Ítem no trobat"; } } // PATCH: Modificar parcialment un ítem @PatchMapping("/{index}") public String patchItem(@PathVariable int index, @RequestBody String item) { if (index >= 0 && index < items.size()) { String existingItem = items.get(index); String updatedItem = existingItem + item; // Exemple de modificació parcial items.set(index, updatedItem); return "Item modificat: " + updatedItem; } else { return "Ítem no trobat"; } } // OPTIONS: Descriure les opcions de comunicació @RequestMapping(method = RequestMethod.OPTIONS) public String options() { return "GET, POST, PUT, DELETE, PATCH, OPTIONS"; } // HEAD: Obtenir les capçaleres de la resposta @RequestMapping(method = RequestMethod.HEAD) public void head() { // No cal implementar res aquí, Spring Boot gestionarà les capçaleres automàticament } }
Explicació del codi
- GET: El mètode
getAllItems
retorna tots els ítems de la llista. - POST: El mètode
createItem
afegeix un nou ítem a la llista. - PUT: El mètode
updateItem
actualitza un ítem existent a la llista. - DELETE: El mètode
deleteItem
elimina un ítem de la llista. - PATCH: El mètode
patchItem
modifica parcialment un ítem existent. - OPTIONS: El mètode
options
retorna les opcions de comunicació disponibles. - HEAD: El mètode
head
retorna les capçaleres de la resposta sense el cos.
Exercicis pràctics
Exercici 1: Implementar un controlador per gestionar usuaris
Crea un controlador similar a ItemController
per gestionar usuaris. Cada usuari ha de tenir un id
, nom
i email
.
Solució
import org.springframework.web.bind.annotation.*; import java.util.ArrayList; import java.util.List; class User { private int id; private String name; private String email; // Constructors, getters i setters public User(int id, String name, String email) { this.id = id; this.name = name; this.email = email; } public int getId() { return id; } public void setId(int 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; } } @RestController @RequestMapping("/api/users") public class UserController { private List<User> users = new ArrayList<>(); // GET: Obtenir tots els usuaris @GetMapping public List<User> getAllUsers() { return users; } // POST: Crear un nou usuari @PostMapping public String createUser(@RequestBody User user) { users.add(user); return "Usuari creat: " + user.getName(); } // PUT: Actualitzar un usuari existent @PutMapping("/{id}") public String updateUser(@PathVariable int id, @RequestBody User user) { for (User u : users) { if (u.getId() == id) { u.setName(user.getName()); u.setEmail(user.getEmail()); return "Usuari actualitzat: " + user.getName(); } } return "Usuari no trobat"; } // DELETE: Eliminar un usuari @DeleteMapping("/{id}") public String deleteUser(@PathVariable int id) { for (User u : users) { if (u.getId() == id) { users.remove(u); return "Usuari eliminat: " + u.getName(); } } return "Usuari no trobat"; } // PATCH: Modificar parcialment un usuari @PatchMapping("/{id}") public String patchUser(@PathVariable int id, @RequestBody User user) { for (User u : users) { if (u.getId() == id) { if (user.getName() != null) { u.setName(user.getName()); } if (user.getEmail() != null) { u.setEmail(user.getEmail()); } return "Usuari modificat: " + u.getName(); } } return "Usuari no trobat"; } // OPTIONS: Descriure les opcions de comunicació @RequestMapping(method = RequestMethod.OPTIONS) public String options() { return "GET, POST, PUT, DELETE, PATCH, OPTIONS"; } // HEAD: Obtenir les capçaleres de la resposta @RequestMapping(method = RequestMethod.HEAD) public void head() { // No cal implementar res aquí, Spring Boot gestionarà les capçaleres automàticament } }
Exercici 2: Provar els mètodes HTTP
Utilitza una eina com Postman per provar els mètodes HTTP del controlador UserController
. Crea, actualitza, elimina i modifica usuaris, i comprova que les respostes siguin les esperades.
Resum
En aquesta secció, hem après a gestionar els diferents mètodes HTTP en una aplicació Spring Boot. Hem vist com implementar aquests mètodes en un controlador i hem realitzat exercicis pràctics per reforçar els conceptes apresos. Ara estem preparats per avançar cap a la gestió d'excepcions en serveis RESTful.
Curs de Spring Boot
Mòdul 1: Introducció a Spring Boot
- Què és Spring Boot?
- Configuració del teu entorn de desenvolupament
- Creant la teva primera aplicació Spring Boot
- Entenent l'estructura del projecte Spring Boot
Mòdul 2: Conceptes bàsics de Spring Boot
- Anotacions de Spring Boot
- Injecció de dependències a Spring Boot
- Configuració de Spring Boot
- Propietats de Spring Boot
Mòdul 3: Construint serveis web RESTful
- Introducció als serveis web RESTful
- Creant controladors REST
- Gestionant mètodes HTTP
- Gestió d'excepcions en REST
Mòdul 4: Accés a dades amb Spring Boot
- Introducció a Spring Data JPA
- Configuració de fonts de dades
- Creant entitats JPA
- Utilitzant repositoris de Spring Data
- Mètodes de consulta a Spring Data JPA
Mòdul 5: Seguretat a Spring Boot
- Introducció a Spring Security
- Configuració de Spring Security
- Autenticació i autorització d'usuaris
- Implementant autenticació JWT
Mòdul 6: Proves a Spring Boot
Mòdul 7: Funcions avançades de Spring Boot
Mòdul 8: Desplegant aplicacions Spring Boot
Mòdul 9: Rendiment i monitorització
- Optimització del rendiment
- Monitorització amb Spring Boot Actuator
- Utilitzant Prometheus i Grafana
- Gestió de registres i logs