这里有一些很好的答案,但是我不确定它们是否可以帮助您说服您的同事。正如许多人指出的那样,您的建议并不意味着放弃RESTful设计,而我认为这是使它们符合您的建议的关键。
REST 并不是要确保您的API仅允许存储和检索数据。相反,它与将动作建模为资源有关。您的API 应该允许采取措施(毕竟,它是一个应用程序编程接口)。问题是如何为这些行为建模。
举个例子,而不是提出一个术语,可能是向您的同事解释这个问题的最好方法。通过这种方式,您可以显示他们现在正在做的事情,这将导致什么问题,解决该问题的解决方案以及如何仍然保持RESTful。
让我们看一下您的Customer对象。
问题:
UI将POST客户,但后续表尚未更新。如果后续调用之一由于您的UI代码错误(或浏览器插件的行为异常)而失败,该怎么办?现在,您的数据处于不一致状态。它甚至可能会破坏您的API或UI的其他部分,更不用说它只是无效了。您如何恢复?您必须测试每种可能的状态,以确保这不会破坏某些内容,但是要知道什么是可能的却很难。
解:
创建一个API端点以创建客户。您知道您不想拥有“ / customer / create”甚至“ / create-customer”端点,因为create是一个动词,会违反REST。因此将其名词化。“ / customer-creation”可能有效。现在,当您发布CustomerCreation对象时,它将发送所有需要的字段以完全创建客户。端点将确保数据完整且有效(例如,如果验证失败,则返回400或类似值),并且可以将所有数据持久保存在单个db事务中。
如果您还需要一个端点来获取/ customer对象,那很好。您可以同时拥有。诀窍是创建可满足消费者需求的端点。
好处:
- 您保证您不会陷入不良状态
- 实际上,如果UI开发人员不必“知道”请求的顺序,验证问题等,则实际上更容易
- 它不像API那样健谈,减少了网络请求的延迟
- 更容易测试和概念化方案(UI中丢失/格式错误的数据不会分散在请求中,其中一些可能会失败)
- 它可以更好地封装业务逻辑
- 通常使安全性更容易(因为用户可以修改UI中的业务和业务流程逻辑)
- 可能会减少逻辑重复(与2个以上可以访问相同数据的API相比,您有2个以上的API使用者)
- 仍然100%RESTful
缺点:
- 对于后端开发人员来说,这可能需要做更多的工作(但从长远来看可能不会)
人们可能很难理解这种范例,如果他们没有尝试过,对它有什么好处。希望您可以通过使用自己代码中的示例来帮助他们了解。
我自己的经验是,一旦我团队中的开发人员开始实施该策略,他们几乎会立即看到好处。
进一步研究:
Thoughtworks的这篇文章确实帮助我有了使用实际示例将动作建模为对象的想法:https : //www.thoughtworks.com/insights/blog/rest-api-design-resource-modeling
我还建议您阅读CQRS和事件源,因为它们恰恰与此类事情有关(即,使API与实际的持久性逻辑脱节)。我不知道您的同事会多么愿意阅读此类内容,但这可能会使您更加清楚并帮助您向他们解释。