Manejo de Errores en Scala: Técnicas y Pruebas con Postman
Resumen
¿Cómo manejar los errores en aplicaciones Scala?
En el mundo del desarrollo de software, una buena gestión de errores es crucial para la estabilidad y robustez de nuestras aplicaciones. En Scala, tenemos herramientas poderosas y sencillas para manejar estos problemas de manera eficiente. Durante el desarrollo, es inevitable encontrar situaciones en las que las cosas no salen bien. La clave es saber cómo responder adecuadamente a estos inconvenientes, garantizando así que nuestra aplicación siga operando sin interrupciones.
¿Qué es la función recover?
Scala ofrece la función recover, que es parte de la clase Future. Esta herramienta es invaluable para gestionar excepciones de forma que no afecten la estabilidad completa del sistema:
Objetivo:recover permite manejar situaciones inusuales y excepciones que podrían ocurrir durante la ejecución.
Ventaja: Si ocurre una excepción, recover evita que el servidor colapse y en su lugar, registra el error y envía una respuesta adecuada al usuario.
Implementar recover permite a los desarrolladores responder con mensajes claros, por ejemplo, informando al usuario que hubo un error en el servidor sin derribar todo el sistema.
¿Cómo integrar el registro de logs en Scala?
El logging es una parte integral de la gestión de errores, permitiendo a los desarrolladores entender qué falla y en qué punto del sistema. Scala y el framework Play proporcionan herramientas eficientes para el logging:
Inicialización de un Logger:
val logger = play.Logger.of("MovieController")
Registrar errores en el log:
logger.error(s"Error en getMovies: ${exception.getMessage}")
Este proceso garantiza que, independientemente de la función o proceso que falle, siempre se registre el error de manera detallada, facilitando la futura resolución de problemas.
¿Cómo configurar rutas y endpoints en un API?
El proceso de configuración de endpoints es crucial para preparar nuestra aplicación para integrar servicios web, como APIs RESTful. En Scala, la definición de rutas es muy amigable y directa. A continuación, se explica cómo configurar una API de películas:
Definir rutas: Utilizamos una sintaxis especial que después se compila a Scala:
# Obtener todas las películas
GET /api/movies controllers.MovieController.getMovies
# Obtener una película por ID
GET /api/movies/:id controllers.MovieController.getMovie(id:String)
# Crear una nueva película
POST /api/movies controllers.MovieController.createMovie
# Actualizar una película
PATCH /api/movies/:id controllers.MovieController.updateMovie(id:String)
# Eliminar una película
DELETE /api/movies/:id controllers.MovieController.deleteMovie(id:String)
Estas configuraciones aseguran que cada endpoint esté vinculado a una funcionalidad específica en nuestro controlador, permitiendo acciones CRUD (Crear, Leer, Actualizar, Eliminar) esenciales para el manejo de datos.
¿Cómo probar las API con Postman?
Postman es una herramienta vital para los desarrolladores en la prueba de APIs. A través de Postman, se pueden enviar solicitudes HTTP a nuestra aplicación en desarrollo y verificar las respuestas del servidor:
Inicializar la base de datos con DBInit: Permite crear una mini base de datos en SQLite y verificar su existencia y estructura.
Probar inserciones y consultas:
Insertar datos mediante una solicitud POST y verificar la correcta creación con un GET request.
Usar un GET con un ID específico para obtener un único registro.
Modificar registros:
Actualizar un registro con PATCH y confirmar los cambios con una nueva solicitud GET.
Eliminar registros:
Usar DELETE para eliminar un registro y confirmar su eliminación exitosamente.
Probar con Postman asegura que cada componente de nuestro API funcione como se espera antes de lanzarlo a producción.
Conclusiones prácticas y siguientes pasos
Con una sólida gestión de errores y una configuración adecuada de API, se construye una base robusta para cualquier aplicación. Es fundamental seguir aprendiendo y explorando herramientas y técnicas que hagan a las aplicaciones más fuertes y seguras. Motivamos a los programadores a seguir mejorando sus habilidades, adoptar prácticas de codificación limpias y enfrentarse a nuevos desafíos en el emocionante campo del desarrollo de software. Además, anticipamos nuestro siguiente paso: exportar aplicaciones a Docker y otros formatos, una habilidad indispensable para la implementación moderna.
Tuve problemas con el Csrf. Me hubiese gustado que explicaras una manera de como manejarlo correctamente. A la final encontre como hacerlo funcionar pero deshabilitando el csrf para algunas rutas lo cual obviamente no es buena practica. Si alguien mas tiene este problema vayan aca repito, no es la mejor solucion pero para que puedan continuar probando con postman, sirve.
Cuando hablamos de "buenas prácticas", yo prefiero siempre tomarlo con pinzas, o dicho de otra manera, no asumir que eso es lo que hay que hacer por default, si no entender primero por qué una cosa es tratada como buena práctica y en qué casos tiene sentido.
Para el caso del tipo de ataque CSRF, su manera de ejecutarse es sobre páginas web alteradas que envían información a un tercero de forma, el servidor entonces puede saber si una petición viene realmente del usuario por medio de una especie de token/cookie de verificación extra. Si un token no es valido, se descarta responder esa solicitud pues es posiblemente un ataque de esa naturaleza.
Ahora bien, para el caso del proyecto, sería probablemente seguro deshabilitar esa funcionalidad, ya que el modo principal es simplemente como un API REST, no como un servidor de páginas web.
Sin embargo, eso no nos exime de tener algún tipo de verificación de por ejemplo un usuario logueado para prevenir peticiones mal intencionadas para robar datos o así.
Por supuesto, en el frontend hay que integrar alguna capa de seguridad que evite ese y otro tipo de ataques, aunque en general, la OWASP dice que teniendo bien configurado el CORS puede prevenir un ataque CSRF -> https://owasp.org/www-community/attacks/csrf
Hola, la petición por metodo POST me saca 403, la traza que me arroja es esta:
p.a.m.DefaultUrlEncodedCookieDataCodecCookie failed message authentication check
play.filters.CSRF[CSRF]Check failed because no token found in headers for/api/movie
Creo que falla en la autenticación, pero me pregunto ¿cuál autenticación?.
Existe un tipo de vulnerabilidad muy común en aplicaciones web donde el servidor sirve las páginas web que se llama Cross Site Request Forgery, CSRF.
La forma de evitarlo es firmando cada petición con un token que se envía en cada petición, y los navegadores lo implementan usando cookies.
Para el caso de nuestro servicio dado que es REST, no habría problema con deshabilitarlo, eso se puede hacer colocándo en null la siguiente instrucción en el archivo application.conf: play.filters.csrf.header.protectHeaders = null
Puedes leer más al respecto en la documentación de play: https://www.playframework.com/documentation/2.8.x/ScalaCsrf
Tengo un problema con este controller me da la siguiente excepción No instance of play.api.libs.json.Format is available for scala.Option[java.sql.Timestamp]
Estoy usando postgres y use el codeGenerator de slick para que me generara todos los case class de las tablas y las tablasQuery etc dentro de models
Dentro cree un package repositories y ahi cree un repository para que interactue con la DB con una de las tablas
Escribi un controller para la dicha tabla la inyecte etc. hasta alli todo bien.
En principio la libreria de Json de play solo admite los siguientes json values JsString, JsNumber, JsBoolean, JsObject, JsArray, JsNull.
Por lo que hice un seralizator para time stamp de la siguiente forma para que serialice y deserialice cuando un timeStamp a string y viceversa para cuando vaya a la db
y luego lo que hago es importarlo en el controller y funciono
wow valla que fue todo una travesía pero por fin compilo!!!
Recover nos permite es controlar errores y poderle responder al usuario
:id para pasarle el id a buscar
para hacer Logs desde play.logger.of,
recover tomar las exepciones y enviar un mensaje al usuarios final
Cuado intento ejecutar el POST para insertar una nueva movie, me bota éste error:
Unauthorized
You must be authenticated to access this page.