En aquest tema, aprendrem a construir APIs RESTful utilitzant Node.js. Les APIs RESTful són una manera estàndard de crear serveis web que permeten la comunicació entre diferents aplicacions. Aquest mòdul cobrirà els conceptes bàsics de REST, com configurar un servidor Express per a una API RESTful, i com implementar operacions CRUD (Crear, Llegir, Actualitzar, Eliminar).
Objectius del Tema
- Entendre els principis bàsics de REST.
- Configurar un servidor Express per a una API RESTful.
- Implementar operacions CRUD.
- Gestionar errors i respostes HTTP.
- Principis Bàsics de REST
Què és REST?
REST (Representational State Transfer) és un estil d'arquitectura per a dissenyar serveis web. Els serveis RESTful utilitzen els mètodes HTTP estàndard (GET, POST, PUT, DELETE) per a realitzar operacions sobre recursos.
Principis Clau de REST
- Client-Servidor: Separació de les preocupacions entre el client i el servidor.
- Sense Estat: Cada petició del client al servidor ha de contenir tota la informació necessària per entendre i processar la petició.
- Caché: Les respostes han de ser marcades com a cachéables o no cachéables.
- Interfície Uniforme: Utilització d'una interfície uniforme per a la interacció entre el client i el servidor.
- Sistema en Capes: L'arquitectura pot estar composta per capes que poden ser gestionades de manera independent.
- Configurar un Servidor Express per a una API RESTful
Instal·lació d'Express
Primer, necessitem instal·lar Express. Si no ho has fet ja, pots instal·lar-lo utilitzant npm:
Crear un Servidor Bàsic
Creem un fitxer server.js
i configurem un servidor bàsic:
const express = require('express'); const app = express(); const port = 3000; app.use(express.json()); app.get('/', (req, res) => { res.send('Benvingut a la nostra API RESTful!'); }); app.listen(port, () => { console.log(`Servidor escoltant a http://localhost:${port}`); });
Explicació del Codi
express.json()
: Middleware per a parsejar les peticions JSON.app.get('/')
: Defineix una ruta GET per a la ruta arrel.app.listen(port)
: Inicia el servidor a l'escolta del port especificat.
- Implementar Operacions CRUD
Crear un Model de Dades
Per a aquest exemple, utilitzarem una llista d'usuaris emmagatzemada en memòria:
let users = [ { id: 1, name: 'John Doe', email: '[email protected]' }, { id: 2, name: 'Jane Doe', email: '[email protected]' } ];
Operació GET (Llegir)
Afegim una ruta per obtenir tots els usuaris:
Operació POST (Crear)
Afegim una ruta per crear un nou usuari:
app.post('/users', (req, res) => { const newUser = { id: users.length + 1, name: req.body.name, email: req.body.email }; users.push(newUser); res.status(201).json(newUser); });
Operació PUT (Actualitzar)
Afegim una ruta per actualitzar un usuari existent:
app.put('/users/:id', (req, res) => { const userId = parseInt(req.params.id); const user = users.find(u => u.id === userId); if (user) { user.name = req.body.name; user.email = req.body.email; res.json(user); } else { res.status(404).send('Usuari no trobat'); } });
Operació DELETE (Eliminar)
Afegim una ruta per eliminar un usuari:
app.delete('/users/:id', (req, res) => { const userId = parseInt(req.params.id); users = users.filter(u => u.id !== userId); res.status(204).send(); });
- Gestionar Errors i Respostes HTTP
Gestionar Errors
És important gestionar errors i retornar respostes HTTP adequades. Per exemple, si un usuari no es troba, retornem un error 404:
app.put('/users/:id', (req, res) => { const userId = parseInt(req.params.id); const user = users.find(u => u.id === userId); if (user) { user.name = req.body.name; user.email = req.body.email; res.json(user); } else { res.status(404).send('Usuari no trobat'); } });
Respostes HTTP
Utilitzem els codis d'estat HTTP adequats per a cada operació:
200 OK
: Operació exitosa.201 Created
: Nou recurs creat.204 No Content
: Operació exitosa, però sense contingut a retornar.404 Not Found
: Recurs no trobat.
Exercici Pràctic
Objectiu
Implementar una API RESTful per a gestionar una llista de tasques.
Requisits
- Cada tasca ha de tenir un
id
,title
, icompleted
. - Implementar operacions CRUD per a les tasques.
Solució
const express = require('express'); const app = express(); const port = 3000; app.use(express.json()); let tasks = [ { id: 1, title: 'Aprendre Node.js', completed: false }, { id: 2, title: 'Construir una API RESTful', completed: false } ]; app.get('/tasks', (req, res) => { res.json(tasks); }); app.post('/tasks', (req, res) => { const newTask = { id: tasks.length + 1, title: req.body.title, completed: req.body.completed }; tasks.push(newTask); res.status(201).json(newTask); }); app.put('/tasks/:id', (req, res) => { const taskId = parseInt(req.params.id); const task = tasks.find(t => t.id === taskId); if (task) { task.title = req.body.title; task.completed = req.body.completed; res.json(task); } else { res.status(404).send('Tasques no trobades'); } }); app.delete('/tasks/:id', (req, res) => { const taskId = parseInt(req.params.id); tasks = tasks.filter(t => t.id !== taskId); res.status(204).send(); }); app.listen(port, () => { console.log(`Servidor escoltant a http://localhost:${port}`); });
Conclusió
En aquest tema, hem après a construir una API RESTful utilitzant Node.js i Express. Hem cobert els principis bàsics de REST, com configurar un servidor Express, i com implementar operacions CRUD. També hem vist com gestionar errors i respostes HTTP adequades. Amb aquests coneixements, estàs preparat per construir APIs RESTful robustes i escalables.
Curs de Node.js
Mòdul 1: Introducció a Node.js
Mòdul 2: Conceptes Bàsics
Mòdul 3: Sistema de Fitxers i I/O
Mòdul 4: HTTP i Servidors Web
Mòdul 5: NPM i Gestió de Paquets
Mòdul 6: Framework Express.js
- Introducció a Express.js
- Configuració d'una Aplicació Express
- Middleware
- Routing en Express
- Gestió d'Errors
Mòdul 7: Bases de Dades i ORMs
- Introducció a les Bases de Dades
- Utilitzar MongoDB amb Mongoose
- Utilitzar Bases de Dades SQL amb Sequelize
- Operacions CRUD
Mòdul 8: Autenticació i Autorització
Mòdul 9: Proves i Depuració
- Introducció a les Proves
- Proves Unitàries amb Mocha i Chai
- Proves d'Integració
- Depuració d'Aplicacions Node.js
Mòdul 10: Temes Avançats
Mòdul 11: Desplegament i DevOps
- Variables d'Entorn
- Utilitzar PM2 per a la Gestió de Processos
- Desplegar a Heroku
- Integració i Desplegament Continu