5

当您考虑它时,面向资源的 REST 范式是否可以归结为面向对象(功能受限,尽可能利用 HTTP)?

我不一定说这是一件坏事,而是如果它们本质上是相同的非常相似,那么理解 REST 以及这种架构所带来的含义就会变得更加容易。

更新:以下是更具体的细节:

  1. REST 资源相当于公共类。私有类/资源根本没有公开。
  2. 资源状态相当于类公共方法或字段。私有方法/字段/状态根本没有公开(这并不意味着它不存在)。
  3. 虽然 REST 确实不会跨请求保留特定于客户端的状态,但它确实会跨所有客户端保留资源状态。资源状态,就像类有状态一样。
  4. REST 资源由 URI 全局唯一标识,就像服务器对象由其数据库地址、表名和主键全局唯一标识一样。诚然(还没有)一个 URI 来表示这一点,但您可以轻松地构建一个。
4

8 回答 8

22

REST 类似于 OO,因为它们都将世界建模为接受消息(即方法)的实体,但除此之外它们是不同的。

面向对象强调状态和不透明度的封装,使用尽可能多的不同方法对状态进行操作。REST 是关于状态和透明度的(表示)转移。REST 中使用的方法数量是有限的,并且在所有资源中都是统一的。与 OOP 中最接近的是与ToString()HTTP GET 非常大致等效的方法。

面向对象是有状态的——您引用一个对象并可以在其上调用方法,同时在对象仍在范围内的会话中保持状态。REST 是无状态的——您想要对资源执行的所有操作都在单个消息中指定,并且您需要知道的有关该消息的所有信息都在单个响应中发回。

在面向对象中,没有通用对象标识的概念——对象要么在任何特定时刻从它们的内存地址、特定于框架的 UUID 或从数据库键中获取标识。在 REST中,所有资源都用 URI 标识,不需要实例化或处置——它们始终存在于云中,除非服务器以404 Not Found410 Gone响应,在这种情况下,您知道没有资源URI。

REST 具有安全保证(例如,GET 消息不会改变状态)和幂等性(例如,多次发送的 PUT 请求与仅一次具有相同的效果)。尽管针对特定面向对象技术的一些指导方针对某些构造如何影响状态有所说明,但实际上并没有关于面向对象的任何内容来说明安全性和幂等性。

于 2008-09-30T14:13:32.250 回答
2

我认为说一个概念可以用对象来表达和说这个概念与面向对象相同是有区别的。

OO 提供了一种描述 REST 概念的方法。这并不意味着 REST 本身实现了 OO。

于 2008-09-30T14:33:06.603 回答
1

你说的对。Dan Connolly在 1997 年写了一篇关于它的文章。菲尔丁论文也谈到了它。

于 2008-09-30T12:49:49.863 回答
1

对象将状态和功能捆绑在一起。面向资源是关于显式建模状态(数据),将功能限制为具有通用语义的预定义动词(在 HTTP 的情况下,GET/PUT/POST/DELETE),并将其余处理留给客户端。

在面向对象的世界中,这些概念没有等价物。

于 2008-10-06T23:29:15.907 回答
0

仅当您的对象是 DTO(数据传输对象)时-因为除了持久性之外,您实际上没有其他行为。

于 2008-09-30T12:47:05.827 回答
0

是的,您与面向对象的平行是正确的。

问题是,大多数 web 服务(REST、RESTful、SOAP、..)都可以以对象的形式传递信息,所以这并不是它与众不同的原因。SOAP 往往会导致使用更多方法的服务更少。REST 往往会导致更多的服务(每种资源类型 1 个),每个服务只有几个调用。

于 2008-09-30T12:49:46.507 回答
0

是的,REST 是关于对象的传输。但这不是整个对象。只是对象的当前状态。隐含的假设是 REST 两侧的类定义可能相似;否则对象状态已被强制转换为某个新对象。

REST 只关心对象生命中的 4 个事件,创建 (POST)、检索 (GET)、更新 (PUT) 和删除。它们是重大事件,但只有这四个。

一个对象可以与许多其他对象一起参与许多其他事件。此行为的所有其余部分完全在 REST 方法之外。

有一个密切的关系——REST 移动对象——但是说它们是相同的会将你的对象减少为没有方法的被动位集合。

于 2008-09-30T13:00:20.990 回答
0

REST 不仅与对象有关,它还与属性有关 :: 使用新电话号码对 /users/john/phone_number 的发布请求不是添加新对象,而是设置用户对象“john”的属性

这甚至不是对象的全部状态,而只是对一小部分状态的改变。

这当然不是 1:1 的比赛。

于 2008-09-30T14:08:21.763 回答