2015-10-09 2 views
1

Я не уверен, что это подходящее место, чтобы задать этот вопрос, но вот что.Проверка данных Web Api 2 перед сохранением базы данных

Я создаю веб-интерфейс Web API 2, где внешнее приложение может отправлять данные. Прежде чем данные будут сохранены в базе данных, я хочу проверить мои данные (все введенные поля и т. Д.). Мне нужно использовать datamodel, который принимает любую строку как 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 допустимой комбинацией (путем проверки таблицы, в которой хранятся все комбинации).

Когда все данные верны, я сопоставляю их с моделью базы данных (EF) en, записывая данные в базу данных.

Вопрос в том, является ли это хорошим подходом к проверке данных POST, или я должен делать это на другом уровне?

ответ

1

Сервер проверки можно сделать 2 способами Атрибут

  1. данных на основе проверки
  2. IValidatableObject. Общий способ иметь такой подход - создать класс DTO (Data Transfer Object), который будет содержать все поля ввода от пользователя. Создайте фабрику, которая преобразует этот DTO в требуемую модель (объект, который вы будете использовать для хранения данных в базе данных). Внедрите интерфейс IValidatableObject для вашего класса DTO. Теперь, прежде чем запрос поступит в действие вашего контроллера, вызывается метод ValidateIValidatableObject. Я бы предпочел этот подход в отношении проверки на основе атрибутов данных, когда мне нужно больше контролировать проверку.

Затем создайте фильтр проверки, чтобы вернуть модельное состояние, которое будет содержать ошибки с соответствующим кодом состояния.

0

Вы должны подтвердить свои данные на всех уровнях, что означает:

  • на переднем конце (для увеличения UX и применение отзывчивость)
  • на связывание данных (чтобы убедиться, что переданные данные действительны)
  • после получения его на другом уровне (бизнес проверки и т.д.)
  • по хранению его (типы столбцов, собственно длины, например, ключи)

Помните, что вы не доверяете никаким данным, полученным от пользователя (или вне вашего API в целом).

В основном, что я слышал, валидация должна выполняться для каждого уровня/уровня вашей системы.

Смежные вопросы