Administrar las validaciones del lado del cliente y del servidor en un solo lugar

14

Estoy 100% a bordo con el caso de que uno debería definitivamente usa validaciones de datos del lado del cliente y del servidor.

Sin embargo, en los marcos y entornos en los que he trabajado, los enfoques que he visto nunca han sido SECOS. La mayoría de las veces no hay un plan o patrón: las validaciones se escriben en la especificación del modelo y las validaciones se escriben en el formulario de la vista. (Nota: la mayor parte de mi experiencia de primera mano es con Rails, Sinatra y PHP w / jQuery)

Reflexionando, parece que no sería difícil crear un generador que, dado un conjunto de validaciones (por ejemplo, nombre del modelo, campo (s), condición), podría producir tanto el lado del cliente como el servidor necesarios. material lateral. Alternativamente, una herramienta de este tipo podría tomar las validaciones del lado del servidor (como el código validates en un modelo ActiveRecord) y generar validaciones del lado del cliente (como los complementos jQuery, que luego se aplicarían al formulario.

Obviamente, lo anterior es solo una reflexión "hey tuve esta idea" y no una propuesta formal. Este tipo de cosas es seguramente más difícil de lo que parecía cuando me surgió la idea.

Eso me lleva a la pregunta: ¿Cómo abordaría el diseño de una técnica de "escribir una vez, ejecutar en el servidor y el cliente" para la validación de datos?

Subtemas relacionados: ¿Existen herramientas como esa para marcos de trabajo o tecnologías cliente-servidor particulares? ¿Cuáles son las principales dificultades o desafíos al tratar de mantener solo un conjunto de validaciones?

    
pregunta asfallows 25.04.2014 - 22:46

4 respuestas

6

En mi experiencia limitada, los puntos donde se requiere la validación son

  1. El nivel de presentación usando HTML,
  2. en el nivel posterior a la presentación (es decir, validación de Javascript),
  3. en el nivel de combinación donde se deben validar las interacciones entre múltiples campos     juntos,
  4. en el nivel de lógica de negocios y
  5. en el nivel de la base de datos.

Cada uno de ellos tiene diferentes idiomas, tiempos y disparadores. Por ejemplo, tiene poco sentido validar un campo antes de que todo el registro se encuentre en un estado consistente, a menos que desee validar una sola pieza. Las restricciones en el nivel de la base de datos deben aplicarse solo al final antes de un compromiso, y no pueden hacerse fácilmente por partes.

Un concepto relacionado es que la representación de datos varía entre cada uno de los niveles. Un ejemplo simple es que un navegador web representa una parte del texto como, quizás, CP1290, mientras que la base de datos lo representa en UTF-8; las longitudes de las dos cadenas difieren, por lo que imponer restricciones de longitud se vuelve incómodo.

    
respondido por el BobDalgleish 26.04.2014 - 00:06
3

Una consideración que a menudo limita las soluciones es el viaje de ida y vuelta de la red. El cliente debe validar los datos del usuario sin enviar un mensaje a través de la red. En otras palabras, cuando el usuario presiona el botón de envío, el cliente debe validar los datos localmente.

Primero, supongamos que no tenemos esta limitación. Podríamos comunicarnos con un punto final de red que sea bueno para articular los problemas de validación. Por ejemplo, cuando le envía su nuevo registro de Usuario, en lugar de responder con un código de error HTTP de vainilla, podría devolver una respuesta JSON detallada que detalle los problemas y el cliente actualizaría la pantalla de manera inteligente para reflejar los problemas que encontró. El punto final desempeña el papel de una puerta de enlace de validación.

Es SECO pero no sin inconvenientes. Primero, depende de que el viaje de ida y vuelta de la red afecte a nuestro servidor con validaciones que podrían haberse manejado del lado del cliente. En segundo lugar, el diseño anticipa que todas las operaciones de CRUD se realizarán a través de nuestros puntos finales, pero ¿qué pasa cuando los desarrolladores y los procesos pasan por alto nuestra capa de acceso a datos yendo directamente en la base de datos ?

Revisemos nuestra solución para superar estos inconvenientes. En su lugar, almacenemos y comuniquemos nuestras validaciones como metadatos:

{field: 'username', type: 'required'}
{field: 'username', type: 'unique'} //requires a network roundtrip
{field: 'password', type: 'length', min: 10, max: 50}
{field: 'password', type: 'contains', characters: ['upper', 'special', 'letter', 'number']}

Tanto el cliente como el servidor tendrían algún mecanismo (por ejemplo, un motor) para interpretar y aplicar estos datos. En Javascript podríamos mapear cada pieza de información a funciones de trabajo. Para arrancar, podemos enseñar a cualquier capa de nuestra arquitectura, incluida nuestra base de datos, a aplicar las validaciones de manera consistente.

    
respondido por el Mario T. Lanza 19.06.2014 - 15:46
2

Una forma sería usar el mismo lenguaje / marco tanto en el servidor como en el lado del cliente.

Por ejemplo,

Node.js :: Cliente / Servidor en JavaScript GET :: Cliente / Servidor en Java

En este caso, la mayoría del código de "Objeto de dominio" sería común, eso incluiría la validación. Framework invocará el código según sea necesario. P.ej. El mismo código se invocaría en el navegador antes de "enviar" y en el servicio web del lado del servidor.

EDITAR (junio / 2014): con Java 8, ahora también es fácil integrar el código de validación JS en las aplicaciones Java. Java 8 tiene un nuevo motor de ejecución JS que es más permanente (por ejemplo, hace uso de invokeDynamic).

    
respondido por el Shamit Verma 23.05.2014 - 15:33
0

Estaba pensando en el mismo problema. Estaba pensando en usar ANTLR para obtener un árbol de sintaxis abstracta tanto en C # como en javascript. Desde allí, se utilizan los caminantes de árboles para aplicar las acciones especificadas en el idioma a los objetos que se validarán.

Entonces, puedes guardar una descripción de la validación requerida donde quieras, posiblemente en la base de datos.

Así es como abordaría el problema.

    
respondido por el Marcus 23.05.2014 - 13:16

Lea otras preguntas en las etiquetas