在将Web Api 2数据保存到数据库之前验证它

本文关键字:数据库 验证 保存 Web Api 数据 在将 | 更新日期: 2023-09-27 18:16:56

我不确定这是否是问这个问题的正确地方,但事情是这样的。

我正在创建一个Web API 2 Web服务,其中外部应用程序可以发布数据。在将数据保存到数据库之前,我想验证我的数据(是否输入了所有必需的字段等)。我必须使用的数据模型不接受任何字符串作为itemNumber,因此我要确保数据是正确的。在本例中:

  • itemNumber是否存在于数据库中;
  • deliveryType和itemNumber的组合是否合法?

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

public class Product {
    public int ID { get; set; }
    [RequiredItem]
    public string ItemNumber { get; set; }
    [RequiredDelivery]
    public string DeliveryType { get; set; }
}

我的自定义属性'RequiredItem'正在检查数据库中是否存在该项目。如果没有,响应将是一个Json消息,您需要提供一个有效的itemnumber。

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

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

我的问题是,如果这是验证POST数据的好方法,或者我应该在另一个级别上这样做吗?

在将Web Api 2数据保存到数据库之前验证它

服务器验证有两种方式

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

然后创建一个验证过滤器,以返回包含错误的模型状态,并带有适当的状态代码。

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

    前端
  • (增加用户体验和应用程序响应)
  • 关于数据绑定(确保传递的数据是有效的)
  • 在其他级别(业务验证等)接收后
  • 关于存储它(适当的列类型,长度,键等)

记住不要相信任何来自用户的数据(或者通常是你的API之外的数据)。

基本上我听到的是,验证应该对系统的每个层/级别执行。