更正 HTTP 动词以用于 Web 中的业务规则验证端点 API

Correct HTTP verb to use for a business rules validation endpoint in Web API

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

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

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

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

[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);
}

这样,响应的状态可以提供一些与请求相关的反馈。

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

    [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 很奇怪。