Как я могу проверить объект запроса веб-API для этого сценария? - PullRequest
0 голосов
/ 03 мая 2018

У меня есть api / v1 / users / search uri в проекте Web API 2.2. Этот URI принимает объект UserSearchRequest. Вот образец:

{
"DomainName":"ad.corp.domain",
"NetworkUserId":"jsmith2",
"FirstName":"John",
"LastName":"Smith"
}

Логика поиска в бэкэнде добавит все предоставленные значения параметров запроса для фильтрации набора возвращаемых пользователей. В противном случае пустой объект запроса приведет к возвращению всех пользователей. Однако, если клиент передает запрос, подобный следующему, тогда все пользователи будут возвращены:

{
"UserName":"jsmith2"
}

В приведенном выше примере вместо NetworkUserId по ошибке был использован недопустимый объект UserName. Однако вместо того, чтобы веб-API возвращал ошибку, он просто игнорировал дополнительное свойство и возвращал всех пользователей, поскольку не были предоставлены допустимые значения свойств критериев поиска.

Каким будет правильный способ проверки входящего запроса, чтобы в случае предоставления неверного имени prpoerty Web API возвращал 404 BadRequest и предпочтительно указывал неверное имя свойства?

Ответы [ 3 ]

0 голосов
/ 03 мая 2018

Вы столкнулись с Проблема "чрезмерной публикации" . Это можно сделать несколькими способами:

  1. Используйте атрибут Bind и внесите в белый или черный список нужные вам свойства.

     public ActionResult search([Bind(Exclude="UserName")] Person person)
      {
          ...
      }
    
      public ActionResult search([Bind(Include="DomainName, NetworkUserId, 
        FirstName, LastName")] Person person)
      {
         ...
      }
    
  2. Другое решение заключается в создании Custom Model Binder путем расширения IModelBinder. Это позволит определить дополнительные столбцы и обработать это как ошибку. Вы можете проверить реализацию здесь .

0 голосов
/ 04 мая 2018

Я думаю, что здесь вы получаете данные из таблицы конкретных х или у. То, что вы показываете здесь, это возвращение данных каталога. Это на самом деле легкая часть. Код контроллера вы можете управлять проверкой. Я думаю, что вы пытаетесь получить "NetworkUserId", но контроллер может быть изменен на имя пользователя. Пожалуйста, проверьте ваш тип данных. Пожалуйста, приложите код контроллера и класс модели. Спасибо.

0 голосов
/ 03 мая 2018

В случае неправильных имен свойств или типов данных веб-API не сможет десериализовать объект json в UserSearchRequest, а параметр контроллера API будет нулевым. Вы можете проверить на ноль, который будет указывать, что входной запрос не был правильно отформатирован. Вот пример кода:

 public async Task<IActionResult> SearchUsers([FromBody] UserSearchRequest 
 searchRequest) {
   if(searchRequest == null)
    {
        return BadRequest();
    }
   //For valid search request, continue search...
}
...