【发布时间】:2014-07-14 21:10:34
【问题描述】:
帮助我了解 REST 以资源为导向的重要性。 Fielding 论文的第 5.2.1.1 节说“REST 中信息的关键抽象是资源”。我一直认为这意味着对 REST 服务的资源导向。我有一个资源,比如司机、车辆或帐户。我可以通过 URI 与此资源进行交互,并且我的交互性质由 HTTP 动词描述。 POST 用于创建,PUT 用于更新等。
如果有人来找我设计一个名为“updateAddress”之类的 REST 服务,我的直觉会说它不是 REST。它的名字中有一个动词。资源应该用名词命名。您可以实现一个系统,允许消费者通过 HTTP 上的普通 XML 调用 updateAddress 操作,它会正常工作。但它不是 REST。要成为 REST,资源应该是“地址”。您可以使用 POST、PUT、GET 和 DELETE 创建、更新、检索和删除它。
只要您的应用程序所需的所有交互都是 CRUD,我的 REST 概念就可以正常工作。但并非一切都是 CRUD,这就是我偶然发现整个概念的地方。如果我有一个“转移资金”用例,我该怎么做?通过一次调用,我想更改两个资源 account1 和 account2 的状态。我是否将其作为代表 account1 的资源的 PUT,并将 account2 作为参数?我是否希望我的消费者对两个帐户资源都进行 PUT?我是否将我的交易解释为一个名词,例如“FundTranser”,并要求我的消费者发布?
对于业务域中的许多对象都会发生不同类型的更新这一事实如何?如果我有 25 个不同的用例来更新 ACCOUNT 的不同方面,我真的希望通过 PUT 到 ACCOUNT 资源来完成所有这些用例吗?
我的经验是,大多数人只是忽略了这一点。他们设计了一个名称中带有动词的操作,就像他们设计 SOAP 服务操作时所做的那样。该操作名称成为其消息正文中的根元素。他们对所有事情都使用 POST。甚至“deleteAccount”和“retrieveAccount”操作都是 POST。
在大多数人的心目中,REST 一词的意思是“非 SOAP”。在他们看来,任何基于 HTTP 的普通 XML 都是 REST。
我对你们所有人的问题是,归根结底,这重要吗?如果我与他们争辩说他们的设计不是“真正的 REST”,我是否只是坚持学术观点?通过 HTTP 执行 POX 是否会丢失任何内容?将其称为 REST 有什么害处吗?
【问题讨论】:
-
您说,在大多数人的心目中,休息已经意味着“不是肥皂”。我不确定你能否证明这一说法是正确的。我敢肯定,有些人使用他们所谓的休息来误解休息,但我不能确定它是“大多数”人。
-
我可能会说 REST 是 SOAP 想要成为的时髦版本?我认为这属于 Programmers Exchange,因为这个问题太宽泛,没有代码或具体问题,更多的是关于设计。