Què és un servei web RESTful?
Un servei web RESTful és una arquitectura de serveis web que segueix els principis de REST (Representational State Transfer). REST és un estil arquitectònic que utilitza els mètodes HTTP per interactuar amb recursos representats en format JSON o XML. Els serveis web RESTful són àmpliament utilitzats per la seva simplicitat, escalabilitat i interoperabilitat.
Principis de REST
- Client-Servidor: La separació de les preocupacions entre el client i el servidor permet una major escalabilitat i mantenibilitat.
- Sense estat (Stateless): Cada petició del client al servidor ha de contenir tota la informació necessària per entendre i processar la petició. El servidor no ha de mantenir cap estat del client entre peticions.
- Caché: Les respostes del servidor poden ser cachejades per millorar el rendiment.
- Interfície uniforme: L'ús d'una interfície uniforme simplifica i desacobla l'arquitectura, permetent la independència entre el client i el servidor.
- Sistema en capes: L'arquitectura pot estar composta per capes jeràrquiques que ajuden a limitar la complexitat i millorar l'escalabilitat.
- Code on Demand (Opcional): Els servidors poden proporcionar codi executable al client quan sigui necessari.
Mètodes HTTP comuns en REST
Mètode HTTP | Descripció | Exemple d'ús |
---|---|---|
GET | Obtenir un recurs | GET /api/llibres/1 |
POST | Crear un nou recurs | POST /api/llibres |
PUT | Actualitzar un recurs existent | PUT /api/llibres/1 |
DELETE | Eliminar un recurs | DELETE /api/llibres/1 |
PATCH | Actualitzar parcialment un recurs | PATCH /api/llibres/1 |
Beneficis dels serveis web RESTful
- Simplicitat: Utilitza els mètodes HTTP estàndard, fent-lo fàcil d'entendre i implementar.
- Escalabilitat: La separació de client i servidor permet una millor escalabilitat.
- Interoperabilitat: Pot ser utilitzat per diferents clients (navegadors, aplicacions mòbils, etc.) sense necessitat de canvis en el servidor.
- Flexibilitat: Permet la representació de recursos en diferents formats (JSON, XML, etc.).
Exemples pràctics
Exemple 1: Obtenir un recurs (GET)
@RestController @RequestMapping("/api/llibres") public class LlibreController { @GetMapping("/{id}") public ResponseEntity<Llibre> obtenirLlibre(@PathVariable Long id) { Llibre llibre = serveiLlibre.obtenirLlibrePerId(id); if (llibre != null) { return ResponseEntity.ok(llibre); } else { return ResponseEntity.notFound().build(); } } }
Exemple 2: Crear un nou recurs (POST)
@RestController @RequestMapping("/api/llibres") public class LlibreController { @PostMapping public ResponseEntity<Llibre> crearLlibre(@RequestBody Llibre llibre) { Llibre nouLlibre = serveiLlibre.crearLlibre(llibre); return ResponseEntity.status(HttpStatus.CREATED).body(nouLlibre); } }
Exemple 3: Actualitzar un recurs existent (PUT)
@RestController @RequestMapping("/api/llibres") public class LlibreController { @PutMapping("/{id}") public ResponseEntity<Llibre> actualitzarLlibre(@PathVariable Long id, @RequestBody Llibre llibre) { Llibre llibreActualitzat = serveiLlibre.actualitzarLlibre(id, llibre); if (llibreActualitzat != null) { return ResponseEntity.ok(llibreActualitzat); } else { return ResponseEntity.notFound().build(); } } }
Exemple 4: Eliminar un recurs (DELETE)
@RestController @RequestMapping("/api/llibres") public class LlibreController { @DeleteMapping("/{id}") public ResponseEntity<Void> eliminarLlibre(@PathVariable Long id) { boolean eliminat = serveiLlibre.eliminarLlibre(id); if (eliminat) { return ResponseEntity.noContent().build(); } else { return ResponseEntity.notFound().build(); } } }
Exercicis pràctics
Exercici 1: Crear un controlador REST per gestionar autors
- Crea una classe
Autor
amb els campsid
,nom
illibreId
. - Implementa un controlador REST per gestionar autors (
AutorController
). - Implementa els mètodes següents:
GET /api/autors/{id}
: Obtenir un autor per ID.POST /api/autors
: Crear un nou autor.PUT /api/autors/{id}
: Actualitzar un autor existent.DELETE /api/autors/{id}
: Eliminar un autor.
Solució
// Classe Autor public class Autor { private Long id; private String nom; private Long llibreId; // Getters i setters } // Controlador AutorController @RestController @RequestMapping("/api/autors") public class AutorController { @GetMapping("/{id}") public ResponseEntity<Autor> obtenirAutor(@PathVariable Long id) { Autor autor = serveiAutor.obtenirAutorPerId(id); if (autor != null) { return ResponseEntity.ok(autor); } else { return ResponseEntity.notFound().build(); } } @PostMapping public ResponseEntity<Autor> crearAutor(@RequestBody Autor autor) { Autor nouAutor = serveiAutor.crearAutor(autor); return ResponseEntity.status(HttpStatus.CREATED).body(nouAutor); } @PutMapping("/{id}") public ResponseEntity<Autor> actualitzarAutor(@PathVariable Long id, @RequestBody Autor autor) { Autor autorActualitzat = serveiAutor.actualitzarAutor(id, autor); if (autorActualitzat != null) { return ResponseEntity.ok(autorActualitzat); } else { return ResponseEntity.notFound().build(); } } @DeleteMapping("/{id}") public ResponseEntity<Void> eliminarAutor(@PathVariable Long id) { boolean eliminat = serveiAutor.eliminarAutor(id); if (eliminat) { return ResponseEntity.noContent().build(); } else { return ResponseEntity.notFound().build(); } } }
Conclusió
En aquesta secció, hem après els conceptes bàsics dels serveis web RESTful, incloent-hi els principis de REST, els mètodes HTTP comuns i els beneficis d'utilitzar serveis web RESTful. També hem vist exemples pràctics de com implementar aquests serveis utilitzant Spring Boot. A més, hem proporcionat un exercici pràctic per reforçar els conceptes apresos. En la següent secció, explorarem com crear controladors REST en detall.
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