Правильный http-глагол для использования в конечной точке проверки бизнес-правил в веб-api

У меня есть контроллер веб-API ниже. Его единственная ответственность - проверить входящий документ на соответствие набору бизнес-правил и вернуть результат. Какой HTTP-глагол следует использовать для этого действия контроллера?

//[Http<???>]
public IActionResult ValidateBusinessRules([FromBody BusinessDocument document)
{
  var result = ValidateBusinessRules(document);
  return Ok(result);
}

Я думаю, что лучше всего подойдет BedRequest (401) - когда что-то пойдет не так. Но с другой стороны, я думаю, что это не RESTfull endpint. На мой взгляд, лучший способ - подготовить конечную точку с проверкой в ​​самом начале и с определенной бизнес-логикой (выполняется после того, как проверка прошла)

mirt 26.10.2018 08:10
FromBody работает с POST или PUT
Nkosi 26.10.2018 08:13

@mirt, мой вопрос: какой HTTP-глагол использовать, то есть GET, POST, PUT и т. д. Также мне нужно вернуть объект, содержащий результат каждого правила проверки, которое довольно сложно по структуре. Невозможно просто вернуть return BadRequest

Ershad Nozari 26.10.2018 08:16

@ErshadNozari, вы также можете вернуть BedRequest с объектом.

mirt 26.10.2018 08:19

@ErshadNozari Используете ли вы этот метод для проверки данных из формы и, если он действителен, вы сохраняете данные, используя другую конечную точку?

mirt 26.10.2018 08:31

@mirt корректно проверяет данные из формы. Может быть нормально или содержать несколько ошибок проверки в объекте результата. Ответ отправляется обратно вызывающему абоненту (другому веб-API), который выполняет другие операции в зависимости от результата.

Ershad Nozari 26.10.2018 08:36
2
6
587
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Можно было бы аргументировать, что ПОЧТА следует использовать только для создания нового объекта, но поскольку ПОЛУЧАТЬ не предназначен для отправки данных через тело запроса, а другие глаголы (ПОЛОЖИЛ = обновить объект, УДАЛЯТЬ = удалить объект) не дают вам лучшего варианта Я бы сказал, что можно использовать ПОЧТА для сценариев, когда вам нужно получить некоторые данные с сервера и отправить данные в теле запроса.

Поэтому я бы рекомендовал вам использовать здесь ПОЧТА

[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 предназначен для создания ресурсов, не так ли?

Ershad Nozari 26.10.2018 08:39

@ErshadNozari Нет. POST предназначен для использования, когда один из других глаголов не применим. Из спецификации HTTP: «Метод POST требует, чтобы целевой ресурс обработал представление, заключенное в запросе, в соответствии с собственной конкретной семантикой ресурса». tools.ietf.org/html/rfc7231#section-4.3.3

Eric Stein 26.10.2018 14:50

Если вы используете эту конечную точку для проверки данных из формы, а затем хотите сохранить их через другую конечную точку, я думаю, что лучшим решением будет что-то вроде этого:

    [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, если ресурс не создается, и, следовательно, мой вопрос.

Ershad Nozari 26.10.2018 09:12

Другие вопросы по теме