在RESTful API中确定有意义的HTTP响应代码以进行业务规则验证

时间:2016-09-01 14:18:25

标签: c# rest api validation asp.net-web-api2

我目前处于构建RESTful API的早期阶段,并且已经以正确的方式来回处理业务规则验证。

我正在使用Web API 2并且当前使用IValidatableObject来处理验证模型。例如,如果缺少必填字段,我将返回" 400 Bad Request"和ModelState

我开始向IValidatableObject Public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)方法添加业务规则验证,并继续返回&#34; 400 Bad Request&#34;带有描述未通过验证的业务规则的消息。然后我退后一步思考&#34;业务规则与模型验证不同,请求完全有效,我不应该返回400.&#34;

现在我计划将业务规则验证从模型验证转移到域逻辑中。这让我想到我不仅应该返回正确的状态代码,还应该返回客户端如何确定要显示的正确消息。

我在403 Forbidden422 Unprocessable Entity之间徘徊,倾向于422.欢迎任何建议。

现在让我们说我发出的请求失败了多个业务规则,我返回了422和一组错误消息。我希望客户能够理解错误并向他们展示他们认为合适的消息,而不仅仅是在我的回复中显示消息。

  1. 哪种HTTP状态代码最适合失败的业务?
  2. 返回错误消息的最佳做法是什么?
  3. 是否可以返回422.x并记录每个.x,以便客户端知道该怎么做?这似乎让我有了每个请求只返回一个错误的限制。

    我应该定义错误代码并返回错误消息吗?例如:

    {
      "Errors": [
        { "Error": { "Code": "E0001", "Message": "You failed business rule 1" } },
        { "Error": { "Code": "E0002", "Message": "You failed business rule 2" } }
       ]  
    }
    

    任何反馈都会很棒!谢谢!

1 个答案:

答案 0 :(得分:1)

看一下这个答案here

我不会发送403,因为您的案件与授权无关。

如果您的模型返回null,我会发送400。即模型装订器不知道如何处理你发布的内容。

将状态发送为422,错误为内容。