Сначала договоритесь о данных
Представим учебное приложение со списком задач. Для создания задачи требуется название, которое после удаления пробелов по краям не должно быть пустым. Ограничение длины и допустимые дополнительные поля тоже нужно определить заранее. Это правила нашего примера, а не автоматические свойства любого проекта. Опишите, что клиент отправляет, что сервер возвращает при успехе и как сообщает об ошибке конкретного поля. Если одна сторона считает пробелы полноценным названием, а другая нет, пользователь получит противоречивые подсказки. Согласованная формулировка правила предшествует выбору валидатора.
Интерфейс помогает исправить ввод
В Angular форма может хранить значения и состояние полей, а валидаторы отмечать нарушения правил. Для реактивных форм проверки задаются в модели формы. При показе сообщения полезно учитывать, взаимодействовал ли человек с полем, чтобы не встречать его списком ошибок ещё до ввода. Проверка обязательности сама по себе не должна подменять любое дополнительное правило. Если по условиям проекта требуется обрабатывать пробелы определённым образом, это поведение проверяют отдельно. После серверного отказа стоит сохранить введённые значения и показать понятное объяснение возле соответствующего поля.
Сервер не доверяет наличию формы
Запрос может прийти от другого клиента или без прохождения проверок браузера. Поэтому сервер самостоятельно проверяет входные данные перед выполнением операции. Разрешение пользователя на действие и корректность данных при этом являются разными проверками: правильно заполненное название не даёт права изменять чужую задачу. В ASP.NET Core контроллеры с атрибутом ApiController по умолчанию автоматически возвращают HTTP 400 при ошибках состояния модели. Ответ содержит сведения об ошибках в формате ValidationProblemDetails. Это поведение относится к описанной модели контроллеров; его не следует без проверки переносить на любую архитектуру конечных точек.
Ошибки формы и неизвестный результат различаются
Если сервер сообщил, что название недопустимо, пользователь может исправить поле. Если же соединение оборвалось, неизвестно, успел ли сервер выполнить операцию. Сообщение о неправильном названии в таком случае вводило бы в заблуждение. Сначала определите поведение интерфейса для подтверждённого отказа, успешного сохранения и ещё неустановленного исхода. Нажатие кнопки не должно немедленно превращаться в утверждение, что задача сохранена. Для рабочего приложения также продумывают проверку результата и защиту от случайных повторных действий.
Попробуйте на практике
Опишите контракт и проверки формы создания задачи на бумаге, прежде чем подключать настоящее хранилище.
- Задайте правило названия: после удаления крайних пробелов оно не пустое. Отдельно запишите выбранное ограничение длины и способ его подсчёта.
- Подготовьте четыре учебных значения: обычное название, пустую строку, только пробелы и строку длиннее установленного ограничения.
- Для каждого значения укажите ожидаемую реакцию формы и независимую реакцию сервера. Проверьте, совпадает ли смысл правил.
- Опишите ответы интерфейса на успешное сохранение, ошибку поля и обрыв соединения с неизвестным исходом. Не объединяйте эти случаи.
- Добавьте проверку запроса, поступившего без браузерной формы. Убедитесь, что недопустимые данные всё равно не должны сохраняться.
Как проверить результат. Контракт задаёт одинаковый смысл правил для клиента и сервера. Случай с пробелами проверен отдельно, ошибки данных не смешаны с правами доступа, а неизвестный исход не показан как подтверждённый успех.
Частые вопросы
Можно ли оставить только серверную проверку?
Серверная проверка необходима, но без удобных подсказок человек узнает о простых ошибках позже. Клиентская проверка улучшает взаимодействие, сохраняя сервер независимым источником решения о допустимости операции.
HTTP 400 всегда означает пустое поле?
Нет. Этот статус может сопровождать разные проблемы запроса. Интерфейсу нужно разбирать согласованную структуру ответа и показывать относящееся к ситуации объяснение.
Самостоятельный разбор темы. Содержание конкретной обучающей программы здесь не представлено.