在将 Web Api 2 数据保存到数据库之前对其进行验证

Validate Web Api 2 data before saving it to the database

我不确定在这里问这个问题是否正确,但事情就是这样。

我正在创建一个 Web API 2 网络服务,外部应用程序可以在其中 post 数据。在将数据保存到数据库之前,我想验证我的数据(是否输入了所有必填字段等)。我必须使用的数据模型确实接受任何字符串作为 itemNumber,因此我想确保数据正确。在这种情况下:

为了解决这个问题,我有以下(简化的)模型来接收来自 POST 的数据。

public class Product {
    public int ID { get; set; }

    [RequiredItem]
    public string ItemNumber { get; set; }

    [RequiredDelivery]
    public string DeliveryType { get; set; }
}

我的自定义属性 'RequiredItem' 正在检查数据库中是否存在项目。否则,响应将是一条 Json 消息,提示您需要提供有效的商品编号。

属性 'RequiredDelivery' 检查 ItemNumber / DeliveryType 组合是否有效(通过检查存储所有组合的 table)。

当所有数据都正确时,我将其映射到数据库模型 (EF) 并将数据写入数据库。

我的问题是,如果这是验证 POST 数据的好方法,还是我应该在另一个层面上这样做?

您应该在所有级别上验证您的数据,这意味着:

  • 在前端(提高用户体验和应用程序响应能力)
  • 关于数据绑定(以确保传递的数据有效)
  • 在其他级别(业务验证等)收到后
  • 关于存储它(正确的列类型、长度、键,例如)

切记不要相信任何来自用户的数据(或者一般情况下 API 以外的数据)。

基本上我所听到的,应该对您的系统中的每个 layer/level 执行验证。

服务器验证可以通过两种方式完成

  1. 基于数据属性的验证
  2. IValidatableObject。采用这种方法的一般方法是,创建一个 DTO class(数据传输对象),它将包含来自用户的所有输入字段。创建一个工厂,将此 DTO 转换为所需的模型(您将用于在数据库中存储数据的对象)。为您的 DTO class 实现 IValidatableObject 接口。现在,在请求进入您的控制器操作之前,将调用 IValidatableObjectValidate 方法。当我需要对验证进行更多控制时,我更喜欢这种方法而不是基于数据属性的验证。

然后制作一个验证过滤器,return 模型状态将包含带有正确状态代码的错误。