使用JSON模式进行干式用户输入验证(客户端、服务器端)

使用JSON模式进行干式用户输入验证(客户端、服务器端),json,validation,dry,Json,Validation,Dry,作为广泛测试用例的一部分,我正在构建一个基于ajax的类似CMS的应用程序,它在各种文档类型上提供CRUD功能,例如:文章、标记等 在服务器端和客户端,我正在考虑使用JSON模式()作为一种干方式进行用户输入验证的方法(即:1个验证模式,在服务器端和客户端都使用,没有重复的代码等等)。这似乎很好,因为: JSON模式都是用JS和Java实现的,因此理论上一个模式可以处理客户端和服务器端验证 所有CUD操作请求和响应都是JSON(通过ajax) 但是,除了对用户输入进行常规验证外,我还希望在服

作为广泛测试用例的一部分,我正在构建一个基于ajax的类似CMS的应用程序,它在各种文档类型上提供CRUD功能,例如:文章、标记等

在服务器端和客户端,我正在考虑使用JSON模式()作为一种干方式进行用户输入验证的方法(即:1个验证模式,在服务器端和客户端都使用,没有重复的代码等等)。这似乎很好,因为:

  • JSON模式都是用JS和Java实现的,因此理论上一个模式可以处理客户端和服务器端验证

  • 所有CUD操作请求和响应都是JSON(通过ajax)

但是,除了对用户输入进行常规验证外,我还希望在服务器上进行一些额外的检查(例如:检查用户想要创建的标记的名称是否已经存在)

理想情况下,我希望这些类型的检查包含在我的通用服务器端验证代码中(如前所述,它将基于JSON模式)。然而,我并不完全相信这是正确的方法,因为这些额外的检查并不仅仅基于提供的JSON数据,而是需要额外的数据来验证(例如:系统中现有标记的名称,以检查标记名称是否已经存在)

那么,在服务器端的基于json模式的验证框架中加入类似上述检查的附加检查(从设计/架构角度来看)是否是一个好主意?这是一个优雅的解决方案吗?或者你会把它们分开吗?如果不是,为什么不呢?关于客户端和服务器端验证,您会建议采取什么其他方法保持沉默

你觉得怎么样

以下文本案例的一些附加上下文/目标,以获取一些背景信息

谢谢, 吉尔特扬


一些背景/目标:

  • 使用REST方法的基于ajax的CMS

  • CUD请求通过ajax使用rest方法执行(即:分别映射POST、PUT和DELETE)。请求和响应都是通过JSON完成的

  • 没有表格的CMS。而是使用就地编辑(例如使用Aloha编辑器:

  • 保持干燥

  • 模板:通过客户端和服务器端的Mustache模板完成。通过ajax的初始渲染和增量渲染是基于1和相同的模板完成的。我想做一些不同于Mustache的东西(bc,当然它缺乏表达能力),但它至少适用于这个原型。(关于备选方案,请参见前面的问题,我仍在寻找答案:)

  • 干输入验证:如上所述


验证流程(如果失败):

  • 用户创建/更新/删除项目

  • 客户端上的验证失败会立即向用户反馈要修复的内容。(Javascript JSON模式验证器理想情况下会将格式化后的JSON返回给用户)

  • 当客户端验证成功时,使用ajax执行CUD操作

  • 如果服务器端验证失败,将返回一个状态代码400(错误请求),其中一个Json对象包含验证失败,jquery的错误回调将拾取该验证失败

    $.ajax({
        ....
        error: function(xhr, status, error) {
            var validationJSON = JSON.parse(xhr.responseText);
            //handle server-side validation failure 
        },
        ....
    });
    
  • 向用户显示包含服务器端验证失败的JSON对象(类似于客户端)


  • 在服务器上的一个位置(每个模型)有一个单一的验证定义是非常可能的,也是最令人满意的事情之一,这样就可以为客户端和基于AJAX的验证生成适当的JS

    Yii framework for PHP有一个出色的体系结构,它以一种优雅的方式将所有验证规则存储在模型中(根据需要划分为适当的“场景”)从那以后,只需翻转几个开关,就可以使特定的表单客户端或AJAX可验证。我相信Yii的界面是基于Rails的

    无论如何,我强烈建议您从Yii的设计中找出以下要点;即使您不懂PHP,也可以从中获得灵感:

    • =>模型验证规则的干源
    • =>用于根据模型属性生成表单元素
      • 例如,见
    • =>验证器的基类,其中规定
    我认为追求干式验证规则声明是明智的,根据我的经验,实现100%的目标并保持丰富的表单和丰富的验证规则是完全不现实的。(当你不必管理所有的客户端验证JS时,你会热爱生活吗?)

    希望这有帮助