У меня есть контроллер веб-API ниже. Его единственная ответственность - проверить входящий документ на соответствие набору бизнес-правил и вернуть результат. Какой HTTP-глагол следует использовать для этого действия контроллера?
//[Http<???>]
public IActionResult ValidateBusinessRules([FromBody BusinessDocument document)
{
var result = ValidateBusinessRules(document);
return Ok(result);
}
FromBody
работает с POST или PUT
@mirt, мой вопрос: какой HTTP-глагол использовать, то есть GET, POST, PUT и т. д. Также мне нужно вернуть объект, содержащий результат каждого правила проверки, которое довольно сложно по структуре. Невозможно просто вернуть return BadRequest
@ErshadNozari, вы также можете вернуть BedRequest с объектом.
@ErshadNozari Используете ли вы этот метод для проверки данных из формы и, если он действителен, вы сохраняете данные, используя другую конечную точку?
@mirt корректно проверяет данные из формы. Может быть нормально или содержать несколько ошибок проверки в объекте результата. Ответ отправляется обратно вызывающему абоненту (другому веб-API), который выполняет другие операции в зависимости от результата.
Можно было бы аргументировать, что ПОЧТА следует использовать только для создания нового объекта, но поскольку ПОЛУЧАТЬ не предназначен для отправки данных через тело запроса, а другие глаголы (ПОЛОЖИЛ = обновить объект, УДАЛЯТЬ = удалить объект) не дают вам лучшего варианта Я бы сказал, что можно использовать ПОЧТА для сценариев, когда вам нужно получить некоторые данные с сервера и отправить данные в теле запроса.
Поэтому я бы рекомендовал вам использовать здесь ПОЧТА
[HttpPost]
public IActionResult ValidateBusinessRules([FromBody] BusinessDocument document)
{
var result = ValidateBusinessRules(document);
return Ok(result);
}
[FromBody]
явно указывает связывателю модели проверить тело запроса на наличие данных для связывания. И поскольку только определенный запрос разрешает тело, это означает, что он работает с POST или PUT.
POST будет глаголом по умолчанию для использования в этом сценарии. Принимая во внимание состояние модели, действие может выглядеть так
[HttpPost]
public IActionResult ValidateBusinessRules([FromBody] BusinessDocument document) {
if (ModelState.IsValid) {
var result = ValidateBusinessRules(document);
if (result.IsValid) { //assuming result has a flag
return Ok(result);
}
return BadRequest(result);//assuming result provides relevant details.
}
return BadRequest(ModelState);
}
Таким образом, статус ответа может предоставить некоторую релевантную обратную связь о сделанном запросе.
У меня сейчас есть POST, но я не думал, что это правильный глагол, поскольку POST предназначен для создания ресурсов, не так ли?
@ErshadNozari Нет. POST предназначен для использования, когда один из других глаголов не применим. Из спецификации HTTP: «Метод POST требует, чтобы целевой ресурс обработал представление, заключенное в запросе, в соответствии с собственной конкретной семантикой ресурса». tools.ietf.org/html/rfc7231#section-4.3.3
Если вы используете эту конечную точку для проверки данных из формы, а затем хотите сохранить их через другую конечную точку, я думаю, что лучшим решением будет что-то вроде этого:
[HttpPost]
[Route("documents")]
public IActionResult ValidateBusinessRules([FromBody] BusinessDocument document)
{
var result = ValidateBusinessRules(document);
if (!result.IsValid)
{
return BadRequest(result);
}
var document = _documentService.Save(document);
return Ok(document);
}
Для меня странно использовать POST, если вы не хотите создавать новый ресурс.
В этом случае ресурс не создается. Я согласен, кажется странным использовать POST, если ресурс не создается, и, следовательно, мой вопрос.
Я думаю, что лучше всего подойдет BedRequest (401) - когда что-то пойдет не так. Но с другой стороны, я думаю, что это не RESTfull endpint. На мой взгляд, лучший способ - подготовить конечную точку с проверкой в самом начале и с определенной бизнес-логикой (выполняется после того, как проверка прошла)