资源导向是不是真的面向对象?

时间:2008-09-30 12:42:34

标签: rest oop

当你考虑它时,面向资源的REST范式是不是归结为面向对象(具有受限制的功能,尽可能地利用HTTP)?

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

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

  1. REST资源等同于公共类。私人课程/资源根本不会暴露。
  2. 资源状态等同于类公共方法或字段。私有方法/字段/状态根本不会暴露(这并不意味着它不存在)。
  3. 虽然REST不会在请求之间保留特定于客户端的状态,但确实保留所有客户端的资源状态。资源具有状态,与类状态相同。
  4. REST资源由URI全局唯一标识,其方式与服务器对象由其数据库地址,表名和主键全局唯一标识的方式相同。虽然没有(还)一个URI来表示这个,但你可以很容易地构建一个。

8 个答案:

答案 0 :(得分:21)

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

对象方向强调封装状态和不透明度,使用操作状态所需的许多不同方法。 REST是关于(表示)状态和透明度的转移。 REST中使用的方法数量在所有资源中受到约束和统一。与OOP中最接近的是ToString()方法,它大致相当于HTTP GET。

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

在面向对象中,没有通用对象标识的概念 - 对象要么在任何特定时刻从其内存地址获取标识,要么是特定于框架的UUID,要么是从数据库密钥获取。在REST 所有资源都使用URI 标识,并且不需要实例化或处置 - 除非服务器以 404 Not Found 响应,否则它们始终存在于云中或者 410 Gone ,在任何情况下你都知道没有带有该URI的资源。

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

答案 1 :(得分:2)

我认为说一个概念可以用对象表达并且说概念是相同和面向对象之间存在区别。

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

答案 2 :(得分:1)

你是对的。 Dan Connolly在1997年写了an articleFielding thesis也谈到了它。

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

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

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

对象可以参与许多其他具有大量其他对象的事件。所有其余的这种行为完全不在REST方法之外。

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

答案 7 :(得分:0)

REST不只是关于对象,它还关于属性::对带有新电话号码的/ users / john / phone_number的发布请求不添加新对象,它设置用户对象'john'的属性< / p>

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

肯定不是1:1比赛。