到底什么是REST?

1、到底是什么?

困惑我已久的一个问题,RESTRESTfulRESTful API……

以下是来自官方的定义:

REST即表述性状态传递(英文:Representational State Transfer,简称REST)是Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格。它是一种针对网络应用的设计开发方式,可以降低开发的复杂性,提高系统的可伸缩性。

忽略上面这段话,因为反正说了也等于没说,但有几个关键词值得注意:“设计”“开发方式”,好了暂且放一放,换个角度了解一下。

2、相对谁而言?

再次引用百度百科的一段话:

在三种主流的Web服务实现方案中,因为REST模式的Web服务与复杂的SOAPXML-RPC对比来讲明显的更加简洁,越来越多的web服务开始采用REST风格设计和实现。例如,Amazon.com提供接近REST风格的Web服务进行图书查找;雅虎提供的Web服务也是REST风格的。

也就是说,REST模式是一种Web服务实现方案,与之对应的是SOAPXML-RPC

2.1、XML-RPC

什么是RPC?参考链接1参考链接2

在网络世界里,不同机器要怎么互相通信?最基础的方法是基于 TCP/IP 通过 Socket 编程去实现调用方和被调用方。但是 Socket 编程的难度大,需要比较强的专业性,实现又复杂,如果每一次机器之间要通信时,程序员都要手动去处理这么多,这就让新手能做的,变成了要精通网络的老师傅才能完成。有没有什么更好的办法呢?

在 1984 年,Bruce Jay Nelson 发表了奠定基础性的论文 Implementing Remote Procedure Call,定义了机器之间互通这种远程调用的标准。RPC (Remote Procedure Call) 即远程过程调用,有了它,客户端可以像调用本地接口一样调用远程的服务端。

怎么实现远程调用像本地调用一样呢?RPC 模式分为三层,RPCRuntime负责最底层的网络传输,Stub处理客户端和服务端约定好的语法、语义的封装和解封装,这些调用远程的细节都被这两层搞定了,用户和服务器这层就只要负责处理业务逻辑,调用本地 Stub 就可以调用远程。

不同于复杂的Socket通信方式,RPC的初心是设计一套远程通信的通用框架,这个框架能够自动处理通信协议对象序列化网络传输等复杂细节,并且希望开发者使用这个框架以后,调用一个远程机器上的接口代码与以本地方法调用的代码“看起来没有什么区别”,从而降低分布式系统开发难度。

为了将一个传统的程序改写成RPC程序,要在程序里加入另外一些代码,这个过程叫作stub过程。

编写一个完成的RPC框架,涉及的技术:
* 高性能网络编程技术;
* 对象序列化与反序列化;
* 自动代码生成或者动态代理编程技术;

我的理解是:RPC是一个标准或叫约定,这个标准可以让我们调用远程资源像本地调用一样简单方便。XML-RPC是RPC的一个实现,以XML做为数据载体,是基于socket的封装。

2.2、SOAP

简单对象访问协议(Simple Object Access Protocol),SOAP 是基于 XML 的简易协议,可使应用程序在 HTTP 之上进行信息交换。或者更简单地说:SOAP 是用于访问网络服务的协议。

我的理解是:首先,这是一个协议,类似http这种应用层协议,它是基于http的,在http的数据部分再封装SOAP,双方以此进行数据交互,SOAP同样是以XML为数据载体,相比RPC,SOAP是基于http的封装。

3、解决什么问题?

参考链接

抛开R. T. Fielding博士论文里晦涩的理论不说,REST应该满足这样的特点:
* 客户端和服务器结构;
* 连接协议具有无状态性;
* 能够利用Cache机制增进性能;
* 层次化的系统;
* 按需代码。

大多数SOAP是运行在HTTP上,使用URI标识服务(一个服务对应着一个URI),SOAP也仅仅使用POST方法发送请求,用一个唯一的URI标识服务的入口。

举一个图书馆在线查询管理系统为例,服务提供者必须为每一本书提供一个内部标识,然后可能定义一个listBooks操作来返回一系列图书,一个getBook操作来返回指定的图书,一个createBook操作来向数据库加入新增的图书,一个deleteBook操作来删除作废的图书,每个操作都有各自的参数,尤其是用内部标识来标识操作的图书。

这种设计被诟病之处,在于deleteBook操作也要用POST方法来发送,而其实HTTP协议有更和逻辑的DELETE方法可用。REST正是这样设计的,REST为每一个资源(此处是图书)指定一个唯一的URI,

而用HTTP的4种方法GET、POST、PUT、DELETE直观地表示获取、创建、更新和删除图书。

同时图书集合也是和单本的图书不同的资源,如果用/books来代表图书列表,/books/ID来代表标识为ID的图书,那么对/books的GET操作就代表返回整个图书列表,对/books/ID的DELETE操作代表删除指定的图书,等等。

4、小结

  • REST是一套规范,不是协议;
  • REST基于http高度融合在http中,甚至状态码都复用http现有的;
  • REST以资源为核心,同一个资源的不同动作能呈现出不同的结果;
  • REST无状态,所以状态均由调用者自行维护;
  • 为什么叫表述性状态转换,因为我们所有的操作都是为了让同一个“资源”对外表达的状态发生转换,即CRUD操作。

Leave a Reply