我有以下Web API控制器。它的唯一责任是根据一组业务规则验证传入的文档并返回结果。哪个正确的HTTP动词可用于此控制器操作?
//[Http<???>]
public IActionResult ValidateBusinessRules([FromBody BusinessDocument document)
{
var result = ValidateBusinessRules(document);
return Ok(result);
}
答案 0 :(得分: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);
}
这样,响应状态可以提供有关所提出请求的一些相关反馈。
答案 1 :(得分:0)
有人可能会认为 POST 仅应用于创建新实体,但由于 GET 并非旨在通过请求正文和其他动词发送数据(< em> PUT =更新实体, Delete =删除实体)没有给您更好的选择,我想在您遇到的情况下使用 POST 是可以的需要从服务器获取一些数据,并且需要在请求正文中发送数据。
因此,我建议您在此处使用 POST
[HttpPost]
public IActionResult ValidateBusinessRules([FromBody] BusinessDocument document)
{
var result = ValidateBusinessRules(document);
return Ok(result);
}
答案 2 :(得分:0)
如果您使用此端点来验证表单中的数据,然后想通过另一个端点保存它们,那么我认为最好的解决方案是这样的:
[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是很奇怪的。