← Servidor web y API con Node

UD6 · Guía y taller práctico

Lo que debes recordar

El método

Cómo se construye un servicio
  1. ¿Qué recursos existen en el problema?
  2. ¿Qué operaciones se hacen con cada uno, y qué responden?
  3. ¿Qué se valida, y dónde?
  4. ¿Qué capa se ocupa de cada cosa?
  5. ¿Qué pasa cuando falla, y qué ve quien llamó?
  6. ¿Cómo demuestro que funciona sin probarlo a mano?

La idea más importante

Diseña el contrato antes que la implementación, y sostenlo. Todo lo que llega de fuera es sospechoso; todo lo que sale es una decisión.

De ahí sale todo lo demás: por eso las rutas hablan de recursos, por eso los errores tienen una forma única, por eso la validación vive en el servidor con lista blanca, por eso las respuestas se construyen en lugar de volcarse, y por eso las capas están separadas.

Las tres capas del módulo, juntas

Lo que has construido en tres trimestres
  1. HTML · qué existe y qué significa
  2. CSS · cómo se presenta y se adapta
  3. JavaScript · qué ocurre en el navegador
  4. Node · qué ocurre en el servidor
  5. API · el contrato que une las dos mitades

Una idea ha aparecido en las seis unidades bajo formulaciones distintas: separa lo que cambia por razones distintas. Estructura de presentación, lógica de interfaz, reglas de almacén, contrato de implementación. Cada vez que lo hiciste, la unidad siguiente te costó menos.

Al terminar deberías poder responder

  1. ¿Qué distingue una API orientada a recursos de una orientada a acciones?
  2. ¿Dónde van los filtros y por qué no en la ruta?
  3. ¿Qué significa que una API no guarde estado?
  4. ¿Qué piezas forman el contrato de una API?
  5. ¿Qué código devuelve cada operación del CRUD, en éxito y en error?
  6. ¿Cuándo un 400 y cuándo un 404?
  7. ¿Por qué una búsqueda sin resultados no es un 404?
  8. ¿Qué diferencia hay entre PUT y PATCH?
  9. ¿Qué operaciones se pueden repetir sin efectos distintos?
  10. ¿Qué es una lista blanca de campos y qué evita?
  11. ¿Por qué el identificador lo asigna el servidor?
  12. ¿Qué sabe y qué no sabe cada capa?
  13. ¿Cómo compruebas que las capas están bien separadas?
  14. ¿Por qué la aplicación se crea sin arrancarse?
  15. ¿Por qué se normalizan los datos al leerlos del almacén?
  16. ¿Cómo se traduce un error interno a un código HTTP?
  17. ¿Para qué sirve el identificador de petición?
  18. ¿Por qué el cliente puede tratar todos los errores con una función?
  19. ¿Qué ventajas tiene generar el HTML en el servidor?
  20. ¿Qué es el cross-site scripting y cómo se evita?
  21. ¿Cuándo filtrar en el cliente y cuándo en el servidor?
  22. ¿Por qué se deshabilita el botón durante un envío?
  23. ¿Por qué la aplicación debe negarse a arrancar si falta una variable?
  24. ¿Qué protege CORS y qué no protege?
  25. ¿Qué diferencia hay entre 401 y 403?
  26. ¿Qué protecciones mínimas necesita un servicio expuesto?
  27. ¿Qué se prueba de una API, y cómo compruebas que la prueba sirve?
  28. ¿Qué pasa con un fichero de datos en un servicio desplegado?
  29. ¿Qué apartados no pueden faltar en un README?
  30. Si hubiera que cambiar el almacén, ¿qué ficheros tocarías?

El vocabulario de la unidad

Concepto Significa
Recurso Una cosa del problema identificable con una URL
REST Un estilo de API basado en recursos, métodos y estados
Contrato Lo que la API promete: rutas, cuerpos, códigos y formas
Sin estado Que el servidor no recuerda nada entre peticiones
CRUD Crear, leer, actualizar y borrar
Repetible sin efectos Que repetir la operación no cambie el resultado
Router Un grupo de rutas montado bajo una ruta base
Capa Una parte del sistema con una responsabilidad y sus límites
Servicio La capa donde viven las reglas de negocio
Repositorio La capa que sabe cómo se guardan y leen los datos
Lista blanca Aceptar solo lo enumerado y descartar el resto
Normalizar Dar forma conocida a un dato al leerlo
Escapar Sustituir caracteres con significado en HTML por entidades
Cross-site scripting Ejecutar código ajeno en el navegador de un visitante
CORS La política del navegador sobre peticiones a otro origen
Limitación de peticiones Rechazar llamadas por encima de una frecuencia
Identificador de petición Un código que relaciona una respuesta con su traza
Siembra Poblar el almacén con datos conocidos
Despliegue Publicar la aplicación en un servidor accesible

Y ahora

Has terminado el módulo. Empezaste escribiendo un encabezado y terminas con una aplicación publicada en internet, con su cliente, su API, sus pruebas y su documentación.

Lo que viene después ya no es lenguaje de marcas: es un backend con base de datos, seguridad, transacciones y despliegue serio, y un cliente construido con framework. Las preguntas, sin embargo, serán las mismas que vienes formulándote durante seis unidades.

Lo que te llevas
  1. ¿Qué significa esto, más allá de cómo se ve?
  2. ¿De qué tipo es este dato, de verdad?
  3. ¿Dónde vive la verdad de esta información?
  4. ¿Quién valida esto, y qué pasa si mienten?
  5. ¿Qué se ve cuando falla?
  6. ¿Puede usarlo alguien que no ve la pantalla?
  7. ¿Sabría explicar por qué lo hice así?

Esas preguntas no caducan con la tecnología. El framework de dentro de cinco años será otro; las preguntas, no.

Ya deberías ser capaz de

  • Diseñar una API REST a partir de sus recursos, no de las pantallas que la usan.
  • Elegir método, ruta y código de estado para cada operación, y sostener ese contrato.
  • Implementar el CRUD completo con validación de entrada en todas las operaciones.
  • Separar rutas, servicio y repositorio, de forma que cambiar el almacén no toque las rutas.
  • Definir un contrato de errores estable y usarlo desde el cliente.
  • Generar HTML en el servidor escapando el contenido que viene de fuera.
  • Conectar el cliente de la UD4 con la API propia, incluidos los formularios.
  • Configurar la aplicación por entorno y aplicar la seguridad mínima exigible.
  • Escribir pruebas automáticas de la API con el ejecutor incluido en Node.
  • Documentar y desplegar el servicio, y defender técnicamente las decisiones tomadas.