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

时间:2020-03-06 14:55:13  来源:igfitidea点击:

当我们考虑它时,面向资源的REST范式是否可以归结为面向对象(具有受约束的功能,尽可能多地利用HTTP)?

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

更新:这里是更具体的细节:

  • REST资源等效于公共类。私有类/资源根本不公开。
  • 资源状态等效于类公共方法或者字段。私有方法/字段/状态根本不公开(这并不意味着它不存在)。
  • 尽管REST确实不会在请求中保留特定于客户端的状态,但是它确实会在所有客户端中保留资源状态。资源具有状态,就像类具有状态一样。
  • REST资源由URI全局唯一标识,就像服务器对象由数据库地址,表名和主键全局唯一标识一样。尽管还没有一个URI来表示这个,但是我们可以轻松地构造一个。

解决方案

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

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

关键是,大多数Web服务(REST,RESTful,SOAP等)都可以以对象的形式传递信息,因此并没有什么不同。 SOAP倾向于使用更多方法导致更少的服务。 REST往往会带来更多的服务(每种资源类型1个),每个服务只有几个调用。

你说的对。丹·康诺利(Dan Connolly)在1997年撰写了一篇有关它的文章。菲尔丁(Fielding)论文也谈到了它。

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

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

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

有一个紧密的关系-REST移动对象-但说它们相同,就可以将对象简化为无方法的被动位集合。

REST不仅与对象有关,而且与属性有关:::向具有新电话号码的/ users / john / phone_number的发布请求未添加新对象,它设置了用户对象'john'的属性

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

当然不是1:1的比赛。

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

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

面向对象是有状态的-我们引用一个对象并可以在其上调用方法,同时在该对象仍在作用域内的会话中保持状态。 REST是无状态的-我们想要处理的所有资源都在一条消息中指定,而我们所需要知道的关于该消息的所有信息都将在单个响应中发送回去。

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

REST保证了安全性(例如GET消息不会更改状态)和幂等性(例如,多次发送的PUT请求的作用与一次相同)。尽管针对特定的面向对象技术的一些准则对某些构造如何影响状态有话要说,但是关于面向对象的问题实际上并没有说明安全性和幂等性。

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

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

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

在面向对象的世界中,这些概念是无与伦比的。