我有这个REST API,可以在客户端上执行CRUD操作。
当我收到包含无效字段的请求时,例如,超过100个字符的“名称”字段,则会返回http错误代码以及详细信息:“名称字段必须少于100个字符!”
问题:我必须一次返回多个错误,例如,如果同一请求中的“姓名”和“生日”无效,则必须同时显示两个错误详细信息。
问题1 :返回多个错误的API是否是一种好的设计?还是应该依靠View来验证这些输入错误并保持API不变?
如果我最终实现了多个回报,那么我会遇到另一个问题:我的项目实现了领域驱动的设计。 这意味着存在一个域(类),并且对构造函数进行验证。如果出现问题,则会引发异常!
问题2 :如果我的流程因第一个例外而中断,该如何验证我的所有字段?
我希望能很清楚地了解并事先感谢!
答案 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的任何其他语言),则已经提供了第二个。