【问题标题】:Correct HTTP verb to use for a business rules validation endpoint in Web API更正 HTTP 动词以用于 Web API 中的业务规则验证端点
【发布时间】:2018-10-26 06:02:43
【问题描述】:

我有以下 Web API 控制器。它的唯一职责是根据一组业务规则验证传入的文档并返回结果。哪个是用于此控制器操作的正确 HTTP 动词?

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

【问题讨论】:

  • 我认为 BedRequest (401) 是最好的——当出现问题时。但另一方面,我认为它不是 RESTfull 终结点。在我看来,最好的方法是在一开始就通过验证和一定的业务逻辑(在验证通过后执行)来准备端点
  • FromBody 适用于 POST 或 PUT
  • @mirt 我的问题是使用哪个 HTTP 动词,即 GET、POST、PUT 等。我还需要返回一个对象,其中包含每个结构相当复杂的验证规则的结果。不能只返回返回 BadRequest
  • @ErshadNozari,你也可以用一个对象返回 BedRequest。
  • @ErshadNozari 您是否使用此方法来验证表单中的数据,如果有效,您是否使用另一个端点保存数据?

标签: rest asp.net-web-api asp.net-web-api2 asp.net-core-webapi


【解决方案1】:

[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 No. POST 应在其他动词之一不适用时使用。来自 HTTP 规范:“POST 方法请求目标资源根据资源自己的特定语义处理请求中包含的表示。” tools.ietf.org/html/rfc7231#section-4.3.3
【解决方案2】:

如果你使用这个端点来验证表单中的数据,然后你想通过另一个端点保存它们,我认为最好的解决方案是这样的:

    [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 似乎很奇怪,因此我的问题是。
【解决方案3】:

有人可能会说 POST 应该只用于创建新实体,但因为 GET 并非旨在通过请求正文和其他动词(PUT = 更新实体,DELETE = 删除实体)没有更好的选择需要从服务器获取一些数据,需要在请求体中发送数据。

因此我建议您在此处使用 POST

[HttpPost]
public IActionResult ValidateBusinessRules([FromBody] BusinessDocument document)
{
  var result = ValidateBusinessRules(document);
  return Ok(result);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-21
    • 2017-01-09
    • 2012-06-18
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    相关资源
    最近更新 更多