apuntes:backend_frontend
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| apuntes:backend_frontend [2026/09/29 09:10] – [Ejercicios] Santiago Faci | apuntes:backend_frontend [2026/10/28 22:52] (current) – [Backend: API] Santiago Faci | ||
|---|---|---|---|
| Line 2: | Line 2: | ||
| < | < | ||
| - | {{ frontendbackend.jpg }} | + | {{ frontendbackend.jpg?450 }} |
| < | < | ||
| </ | </ | ||
| Line 116: | Line 116: | ||
| app.get('/ | app.get('/ | ||
| - | res.json(cities); | + | |
| }); | }); | ||
| app.get('/ | app.get('/ | ||
| const city = req.params.city; | const city = req.params.city; | ||
| - | res.json(cities[city]); | + | |
| }); | }); | ||
| Line 292: | Line 292: | ||
| app.get('/ | app.get('/ | ||
| - | res.status(200).json(cities); | + | |
| }); | }); | ||
| app.get('/ | app.get('/ | ||
| const city = req.params.city; | const city = req.params.city; | ||
| - | res.status(200).json(cities[city]); | + | |
| }); | }); | ||
| Line 310: | Line 310: | ||
| }; | }; | ||
| - | res.status(201).json(cities[name]); | + | |
| }); | }); | ||
| Line 323: | Line 323: | ||
| delete cities[name]; | delete cities[name]; | ||
| - | res.status(204).end(); | + | |
| }); | }); | ||
| Line 336: | Line 336: | ||
| }; | }; | ||
| - | res.status(200).json(cities[name]); | + | |
| }); | }); | ||
| Line 345: | Line 345: | ||
| </ | </ | ||
| + | ==== Gestión de errores ==== | ||
| + | |||
| + | La gestión de errores es una buena práctica que consiste en implementar/ | ||
| + | |||
| + | En el ejemplo anterior, el CRUD completo, se incluye un caso de gestión de errores. Antes de eliminar una pelicula cuyo nombre se ha pasado como parámetro, se comprueba que exista. Asi, se puede notificar al consumidor (quien ha invocado la operación) que ha habido un error y no se ha podido localizar la pelicula si ésta no existe: | ||
| + | * Se response con un código de error '' | ||
| + | * Se incluye un mensaje de error que proporciona información adicional que puede ayudar a diagnosticar el error o problema (en este caso es bastante sencillo pero en determinadas ocasiones puede ser más complicado saber qué ha pasado) | ||
| + | |||
| + | <code javascript> | ||
| + | . . . | ||
| + | if (cities[name] === undefined) { | ||
| + | return res.status(404).json({ | ||
| + | error: 'No se ha podido encontrar la ciudad' | ||
| + | }); | ||
| + | } | ||
| + | . . . | ||
| + | </ | ||
| + | |||
| + | ==== Validación ==== | ||
| + | |||
| + | La validación es una buena práctica que consiste en comprobar que los valores del los datos que nos envian quienes invocan nuestras operaciones son correctos y de acuerdo a lo esperado. Por ejemplo, algo invoca nuestra operación de registro de ciudades y envia un texto como valor para el campo '' | ||
| + | |||
| + | Casos como el comentado anteriormente pueden controlarse de esta manera: | ||
| + | |||
| + | <code javascript> | ||
| + | . . . | ||
| + | const population = req.body.population; | ||
| + | if (typeof population !== ' | ||
| + | return res.status(400).json({ | ||
| + | error: ' | ||
| + | }); | ||
| + | } | ||
| + | . . . | ||
| + | </ | ||
| ===== CRUD Backend + Frontend ===== | ===== CRUD Backend + Frontend ===== | ||
| Line 385: | Line 419: | ||
| app.get('/ | app.get('/ | ||
| - | res.json(cities); | + | |
| }); | }); | ||
| app.get('/ | app.get('/ | ||
| const city = req.params.city; | const city = req.params.city; | ||
| - | res.json(cities[city]); | + | |
| }); | }); | ||
| Line 403: | Line 437: | ||
| }; | }; | ||
| - | res.status(201).end(); | + | |
| }); | }); | ||
| Line 586: | Line 620: | ||
| const data = await findAllCities(); | const data = await findAllCities(); | ||
| - | res.status(200).json(data); | + | |
| }); | }); | ||
| Line 593: | Line 627: | ||
| const data = await findCity(req.params.city); | const data = await findCity(req.params.city); | ||
| - | res.status(200).json(data); | + | |
| }); | }); | ||
| Line 600: | Line 634: | ||
| await registerCity(req.body.name, | await registerCity(req.body.name, | ||
| - | res.status(201).json({}); | + | |
| }); | }); | ||
| Line 607: | Line 641: | ||
| await modifyCity(req.params.city, | await modifyCity(req.params.city, | ||
| - | res.status(204).json({}); | + | |
| }); | }); | ||
| Line 614: | Line 648: | ||
| await removeCity(req.params.city); | await removeCity(req.params.city); | ||
| - | res.status(204).json({}) | + | |
| }); | }); | ||
| Line 970: | Line 1004: | ||
| - El titulo y el argumento son campos obligatorios a la hora de registrar una pelicula | - El titulo y el argumento son campos obligatorios a la hora de registrar una pelicula | ||
| - El campo sala solamente podrá ser un valor entre 1 y 9 (que son las salas que tiene el cine) | - El campo sala solamente podrá ser un valor entre 1 y 9 (que son las salas que tiene el cine) | ||
| + | - Prepara una colección Postman que permita probar todas las operaciones desarrolladas en tu API de peliculas. No olvides preparar requests para todos los casos posibles | ||
| + | - ¿Qué ocurre cuando, al registrar una película, se envian campos que no existen? ¿Se debería fallar? ¿Qué debería ocurrir con esa información de más que se envía? | ||
| + | - ¿Te has fijado en el patrón que sigue los códigos de error que has implementado en las operaciones del backend desarrollado? | ||
| + | - Imagina que algo falla, de forma inesperada, cuando se está ejecutando el código del backend. ¿Qué error se debería devolver? (Pista: https:// | ||
| + | - ¿Qué debería hacer el backend si alguien está invocando las operaciones de forma abusiva? (Pista: https:// | ||
| + | - Añade lo necesario para que también se puedan realizar operaciones similares pero con actores (de los que se almacene nombre, apellidos, pais de origen y si alguna vez ganaron un Oscar) | ||
| + | - ¿Cómo podríamos hacer que peliculas y actores estuvieran relacionadas? | ||
| ====== Proyectos de ejemplo ====== | ====== Proyectos de ejemplo ====== | ||
apuntes/backend_frontend.1790673005.txt.gz · Last modified: by Santiago Faci
