API返回多个错误

时间:2018-09-06 19:24:00

标签: java rest api domain-driven-design

我有这个REST API,可以在客户端上执行CRUD操作。

当我收到包含无效字段的请求时,例如,超过100个字符的“名称”字段,则会返回http错误代码以及详细信息:“名称字段必须少于100个字符!”

问题:我必须一次返回多个错误,例如,如果同一请求中的“姓名”和“生日”无效,则必须同时显示两个错误详细信息。

问题1 :返回多个错误的API是否是一种好的设计?还是应该依靠View来验证这些输入错误并保持API不变?

如果我最终实现了多个回报,那么我会遇到另一个问题:我的项目实现了领域驱动的设计。 这意味着存在一个域(类),并且对构造函数进行验证。如果出现问题,则会引发异常!

问题2 :如果我的流程因第一个例外而中断,该如何验证我的所有字段?

我希望能很清楚地了解并事先感谢!

4 个答案:

答案 0 :(得分:1)

输入验证是REST API设计的关键。这对您很重要,因为您可以避免不良的,可能是危险的数据,并可以在错误使用API​​的地方向API用户提供清晰的消息。

要回答第一个问题,我认为收集并返回所有输入验证错误没有什么错,这是一种详尽的方法。另一种已知的方法是返回遇到的第一个问题。第二步很重要,可以节省一些计算时间。

要回答第二个问题,您只需在每个验证步骤的try-catch子句中括起来,并在遇到某些异常时附加到错误中。

答案 1 :(得分:1)

  

问题1:返回多个以上的API是否是一种好的设计?   错误?还是我应该依靠View来验证那些输入错误并   保持我的API不变?

HTTP状态代码分为几类。只要所有错误都属于同一类(例如400 Bad Request),您就可以在响应正文中包含所有错误的描述。

  

问题2:如果流程中断,我应该如何验证我的所有字段   在第一个例外?

关于SO的问题已经多次提出。例如,请参见this Q

没有硬性规定。我的建议是,异常适用于意外情况,如果太多,try / catch子句会使您的代码混乱。因此,我通常不会在域方面检查与技术要求(例如最大字段长度)相关的内容。

答案 2 :(得分:1)

  

对于API来说,返回多个错误是一种很好的设计吗?

一点都没有错。 RFC 7807使用描述多个无效参数的响应作为其示例之一。

  

我应该依靠View来验证那些输入错误并保持API不变吗?

我不太确定您的意思,但是您肯定应该在接收端验证输入。参见Johnsson和Deogun的Domain Driven Security

  

如果我的流程因第一个例外而中断,我应该如何验证我的所有字段?

要认识的重要一点是,消息 validation 与域逻辑是分开的-不管当前状态如何,消息都是有效还是无效。

如果我们认为验证是一流的概念,那么我们可以认为验证是将RawMessage换成ValidatedMessage。前者是不可知的领域-JSON文档,application / x-www-form-urlencoded有效负载,键值对的集合。后者是一个值对象,由域模型将识别的值创建。

您的验证方法返回“或”类型:您收到已验证的消息,或者得到验证错误列表

Either<ValidatedMessage, Errors> validate(RawMessage m)

Scott Wlaschin的Domain Modeling Made Functional是这个想法的很好参考。

答案 3 :(得分:0)

您可以为OO声明创建域模型以实现目的,或者“更轻松”,您可以使用Monad应用功能性方法,例如,撰写业务错误。如果您使用了适当的工具(例如Scala或支持这些monad的任何其他语言),则已经提供了第二个。