使用RESTful API进行客户端和服务器端验证

3
假设我有一个POST /orders操作,它以订单项集合作为输入。一个订单不能包含超过50个项目,但我应该在哪里执行此验证?
在客户端和服务器端都验证订单大小是冗余的,并且如果我决定更改订单大小限制,会增加维护成本。
仅在服务器端验证可以防止客户端"快速失败"(即,您将一千个项目添加到订单中,并在完成订单时才被告知限制)。
我假设客户端仅验证不是选项,因为API可能有其他客户端。
如果我有动态验证规则,问题会变得更加复杂。假设零售客户可以拥有50个项目的订单,而批发客户可以在其订单中拥有500个项目。API是否应公开操作,以便客户端可以获取当前的验证规则?

你必须在服务器端进行验证,因为你不能简单地信任客户端。你想要在客户端进行验证以减少服务器的工作量。管理这些事情可能会很繁琐,也许可以通过REST API公开验证值,让客户端使用该信息来改善客户端体验(例如,在提交之前通知他们已经订购了太多物品)。 - thecoshman
2个回答

0

你必须同时做这两个事情,但方式不同。

为了保证有效的操作,所有关键验证都必须在服务器/ Web 服务端进行。客户端 UI 只是一个用户界面,使与 Web 服务交互对人来说更加方便。一旦 Web 服务稳定且安全,创建一个默认方法将 Web 服务错误通过客户端传递给用户。之后,UI 层中的功能是可用性问题,应基于测试(即使是通过观察用户或听取反馈进行的非正式测试)。


0

我同意before所说的话。

不过,如果你能预测用户可能遇到的几乎所有情况,你也可以创建客户端验证。

就像你关于批发/零售的例子一样,你可以先创建一个下拉菜单,让客户选择他们是批发还是零售,然后根据第一个选项在输入框中应用500/50规则。

显而易见的问题在于,如果你的API发布给其他开发者使用,他们可能不知道50/500规则,这就是我赞同之前答案中关于关键验证发生在服务器上的原因。如果你正在为自己使用构建API,那么你可以选择任何一种方式,因为你知道输入限制。如果应用程序非常大(在服务器上进行验证将会很费力),这也将节省相当多的服务器成本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接