Introducció a les APIs RESTful
Les APIs RESTful (Representational State Transfer) són un estil arquitectònic per a la creació de serveis web que permeten la comunicació entre sistemes mitjançant HTTP. Aquest estil es basa en un conjunt de principis i restriccions que faciliten la creació de serveis escalables i mantenibles.
Conceptes Clau de REST
- Recursos: En REST, tot és un recurs. Un recurs pot ser qualsevol cosa que es pugui identificar de manera única, com ara un usuari, un producte o una comanda. Els recursos es representen mitjançant URLs.
- Verbs HTTP: REST utilitza els verbs HTTP per realitzar operacions sobre els recursos. Els verbs més comuns són:
- GET: Obtenir una representació d'un recurs.
- POST: Crear un nou recurs.
- PUT: Actualitzar un recurs existent.
- DELETE: Eliminar un recurs.
- Estatless: Les interaccions amb l'API han de ser sense estat, és a dir, cada sol·licitud del client al servidor ha de contenir tota la informació necessària per entendre i processar la sol·licitud.
- Representacions: Els recursos es poden representar en diferents formats, com ara JSON, XML, HTML, etc. JSON és el format més utilitzat en APIs RESTful.
- HATEOAS (Hypermedia As The Engine Of Application State): Els clients interactuen amb l'API principalment a través d'hipervincles proporcionats per les respostes del servidor.
Estructura d'una API RESTful
Una API RESTful ben dissenyada segueix una estructura clara i consistent. A continuació es mostra un exemple d'una API per gestionar usuaris:
Mètode HTTP | URL | Descripció |
---|---|---|
GET | /users | Obtenir una llista d'usuaris |
GET | /users/{id} | Obtenir un usuari específic |
POST | /users | Crear un nou usuari |
PUT | /users/{id} | Actualitzar un usuari existent |
DELETE | /users/{id} | Eliminar un usuari |
Exemple Pràctic
A continuació es mostra un exemple pràctic d'una API RESTful utilitzant Node.js i Express:
const express = require('express'); const app = express(); const port = 3000; app.use(express.json()); let users = [ { id: 1, name: 'John Doe' }, { id: 2, name: 'Jane Doe' } ]; // Obtenir una llista d'usuaris app.get('/users', (req, res) => { res.json(users); }); // Obtenir un usuari específic app.get('/users/:id', (req, res) => { const user = users.find(u => u.id === parseInt(req.params.id)); if (!user) return res.status(404).send('Usuari no trobat'); res.json(user); }); // Crear un nou usuari app.post('/users', (req, res) => { const newUser = { id: users.length + 1, name: req.body.name }; users.push(newUser); res.status(201).json(newUser); }); // Actualitzar un usuari existent app.put('/users/:id', (req, res) => { const user = users.find(u => u.id === parseInt(req.params.id)); if (!user) return res.status(404).send('Usuari no trobat'); user.name = req.body.name; res.json(user); }); // Eliminar un usuari app.delete('/users/:id', (req, res) => { const userIndex = users.findIndex(u => u.id === parseInt(req.params.id)); if (userIndex === -1) return res.status(404).send('Usuari no trobat'); users.splice(userIndex, 1); res.status(204).send(); }); app.listen(port, () => { console.log(`API RESTful escoltant a http://localhost:${port}`); });
Exercici Pràctic
Objectiu: Crear una API RESTful per gestionar productes.
Requisits:
- Crear un nou projecte Node.js amb Express.
- Definir un array de productes amb els camps
id
iname
. - Implementar les operacions CRUD (Create, Read, Update, Delete) per als productes.
Solució:
const express = require('express'); const app = express(); const port = 3000; app.use(express.json()); let products = [ { id: 1, name: 'Producte A' }, { id: 2, name: 'Producte B' } ]; // Obtenir una llista de productes app.get('/products', (req, res) => { res.json(products); }); // Obtenir un producte específic app.get('/products/:id', (req, res) => { const product = products.find(p => p.id === parseInt(req.params.id)); if (!product) return res.status(404).send('Producte no trobat'); res.json(product); }); // Crear un nou producte app.post('/products', (req, res) => { const newProduct = { id: products.length + 1, name: req.body.name }; products.push(newProduct); res.status(201).json(newProduct); }); // Actualitzar un producte existent app.put('/products/:id', (req, res) => { const product = products.find(p => p.id === parseInt(req.params.id)); if (!product) return res.status(404).send('Producte no trobat'); product.name = req.body.name; res.json(product); }); // Eliminar un producte app.delete('/products/:id', (req, res) => { const productIndex = products.findIndex(p => p.id === parseInt(req.params.id)); if (productIndex === -1) return res.status(404).send('Producte no trobat'); products.splice(productIndex, 1); res.status(204).send(); }); app.listen(port, () => { console.log(`API RESTful escoltant a http://localhost:${port}`); });
Errors Comuns i Consells
- No utilitzar verbs en les URLs: Les URLs han de representar recursos, no accions. Per exemple, utilitzar
/users
en lloc de/getUsers
. - No gestionar correctament els codis d'estat HTTP: Assegura't d'utilitzar els codis d'estat HTTP adequats per a cada resposta (200 OK, 201 Created, 404 Not Found, etc.).
- No validar les dades d'entrada: Sempre valida les dades d'entrada per evitar errors i problemes de seguretat.
Conclusió
Les APIs RESTful són una eina poderosa per a la comunicació entre microserveis. Comprendre els principis bàsics i les millors pràctiques per dissenyar i implementar APIs RESTful és essencial per construir aplicacions escalables i mantenibles. En el proper tema, explorarem la missatgeria asíncrona com una alternativa a les APIs RESTful per a la comunicació entre microserveis.
Curs de Microserveis
Mòdul 1: Introducció als Microserveis
- Conceptes Bàsics de Microserveis
- Avantatges i Desavantatges dels Microserveis
- Comparació amb Arquitectura Monolítica
Mòdul 2: Disseny de Microserveis
- Principis de Disseny de Microserveis
- Descomposició d'Aplicacions Monolítiques
- Definició de Bounded Contexts