Правильный 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
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
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

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