在将 Web Api 2 数据保存到数据库之前对其进行验证
Validate Web Api 2 data before saving it to the database
我不确定在这里问这个问题是否正确,但事情就是这样。
我正在创建一个 Web API 2 网络服务,外部应用程序可以在其中 post 数据。在将数据保存到数据库之前,我想验证我的数据(是否输入了所有必填字段等)。我必须使用的数据模型确实接受任何字符串作为 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 消息,提示您需要提供有效的商品编号。
属性 'RequiredDelivery' 检查 ItemNumber / DeliveryType 组合是否有效(通过检查存储所有组合的 table)。
当所有数据都正确时,我将其映射到数据库模型 (EF) 并将数据写入数据库。
我的问题是,如果这是验证 POST 数据的好方法,还是我应该在另一个层面上这样做?
您应该在所有级别上验证您的数据,这意味着:
- 在前端(提高用户体验和应用程序响应能力)
- 关于数据绑定(以确保传递的数据有效)
- 在其他级别(业务验证等)收到后
- 关于存储它(正确的列类型、长度、键,例如)
切记不要相信任何来自用户的数据(或者一般情况下 API 以外的数据)。
基本上我所听到的,应该对您的系统中的每个 layer/level 执行验证。
服务器验证可以通过两种方式完成
- 基于数据属性的验证
IValidatableObject
。采用这种方法的一般方法是,创建一个 DTO class(数据传输对象),它将包含来自用户的所有输入字段。创建一个工厂,将此 DTO 转换为所需的模型(您将用于在数据库中存储数据的对象)。为您的 DTO class 实现 IValidatableObject
接口。现在,在请求进入您的控制器操作之前,将调用 IValidatableObject
的 Validate
方法。当我需要对验证进行更多控制时,我更喜欢这种方法而不是基于数据属性的验证。
然后制作一个验证过滤器,return 模型状态将包含带有正确状态代码的错误。
我不确定在这里问这个问题是否正确,但事情就是这样。
我正在创建一个 Web API 2 网络服务,外部应用程序可以在其中 post 数据。在将数据保存到数据库之前,我想验证我的数据(是否输入了所有必填字段等)。我必须使用的数据模型确实接受任何字符串作为 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 消息,提示您需要提供有效的商品编号。
属性 'RequiredDelivery' 检查 ItemNumber / DeliveryType 组合是否有效(通过检查存储所有组合的 table)。
当所有数据都正确时,我将其映射到数据库模型 (EF) 并将数据写入数据库。
我的问题是,如果这是验证 POST 数据的好方法,还是我应该在另一个层面上这样做?
您应该在所有级别上验证您的数据,这意味着:
- 在前端(提高用户体验和应用程序响应能力)
- 关于数据绑定(以确保传递的数据有效)
- 在其他级别(业务验证等)收到后
- 关于存储它(正确的列类型、长度、键,例如)
切记不要相信任何来自用户的数据(或者一般情况下 API 以外的数据)。
基本上我所听到的,应该对您的系统中的每个 layer/level 执行验证。
服务器验证可以通过两种方式完成
- 基于数据属性的验证
IValidatableObject
。采用这种方法的一般方法是,创建一个 DTO class(数据传输对象),它将包含来自用户的所有输入字段。创建一个工厂,将此 DTO 转换为所需的模型(您将用于在数据库中存储数据的对象)。为您的 DTO class 实现IValidatableObject
接口。现在,在请求进入您的控制器操作之前,将调用IValidatableObject
的Validate
方法。当我需要对验证进行更多控制时,我更喜欢这种方法而不是基于数据属性的验证。
然后制作一个验证过滤器,return 模型状态将包含带有正确状态代码的错误。