Проверка модели веб-API на основе параметров - PullRequest
0 голосов
/ 27 мая 2020

У меня есть такой API, что я хочу от него Когда я вызываю без каких-либо параметров http//localhostcustomer/employes/, он должен возвращать StatusCode(StatusCodes.Status404NotFound)

И если пройти с недопустимыми параметрами http//localhostcustomer/employes/customerid=abcsd&employedid=yyyy, он должен возвращать StatusCode(StatusCodes.Status400BadRequest);

как выполнить проверку модели для этого

[Route("customer/employes")]
Public class testcontroller : controller

public List<Emplyees> get( [Required]int customerid, [Required]int employedid)
{
  if (ModelState.IsValid)
     return OK
  else
     StatusCode(StatusCodes.Status400BadRequest);
}

Ответы [ 4 ]

0 голосов
/ 27 мая 2020

Я бы взглянул на FluentValidation , популярную. NET библиотеку для создания строго типизированных правил проверки.

Вы можете создать собственный валидатор, который проверяет ваш контроллер параметры метода, и это создает ответ соответственно.

Что-то вроде:

var validator = new CustomerEmployeeValidator();
var validation = validator.Validate(someparameter);
if (!validation.IsValid)
   return BadRequest(validation.Errors);

О том, как создать валидатор, вы должны изучить: https://fluentvalidation.net/

В качестве примечания: если входной параметр неверен, вы всегда должны возвращать BadRequest StatusCode вместо NotFound StatusCode.

NotFound StatusCode обычно используется, когда вы ищете специфику c данные извне и не найдены в этом репозитории.

0 голосов
/ 27 мая 2020

Без параметров - не найдено

Если вы не зарегистрировали (явно или неявно через атрибуты) маршрут /employees, то ASP. NET не найдет обработчик для этого запроса, который почему по умолчанию он вернется с 404.

С неверными параметрами - неверный запрос

Это немного сложнее. Если у вас есть маршрут с параметрами, вы также можете определить их типы. По умолчанию, если запрос содержит параметр маршрута, который не может быть преобразован в указанный тип c, тогда ASP. NET не будет вызывать ваш обработчик, а не попытается найти для этого лучший маршрут.

Запрос: /employees/123info

[Route("customer/employees")]
public List<Employee> Get( [Required]int someParameter) {

Если вы хотите также поймать неверные запросы, то вам нужно использовать параметры string и попытаться применить logi преобразования c вручную :

[Route("customer/employees")]
public IActionResult Get(string someParameter) {
  bool isItAValidParameter = int.TryParse(someParameter, out var validParameter):
  if (!isItAValidParameter)
   ...
0 голосов
/ 27 мая 2020

Вы не передаете модель в качестве параметра, поэтому проверка модели не имеет смысла. Вам необходимо явно проверить свои свободные параметры.
В случае неверных параметров:
Запрос: /employes/customerid=abcsd&employedid=yyyy
По умолчанию api возвращает статус 400 - Ошибка неверного запроса.

В случае без каких-либо параметров:
вы получите HTTP ERROR 404 - Страница не найдена


0 голосов
/ 27 мая 2020

, поскольку вы на самом деле не передаете модель, вы не можете разместить проверку на чем-то, поскольку вы просто передаете свободные параметры.

u может создать метод или класс, который проверяет ваши входные параметры, например

IsValid(CustomerId,EmployedId) return Ok()

, или изменить текущий ModelState.IsValid так, чтобы

ModelState.IsValid(CustomerId,EmployedId) return Ok()

Поскольку кажется, что ваш пытаетесь создать запрос Get с обязательными параметрами, может быть интересно отформатировать его как правильный вызов REST, чтобы ваш путь выглядел как / customer / [CustomerId] / Employes / [usedId]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...