RESTful

RESTFUL

RESTful架构,就是目前最流行的一种互联网软件架构。它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。




起源

REST这个词,是Roy Thomas Fielding在他2000年的博士论文中提出的。

"本文研究计算机科学两大前沿----软件和网络----的交叉点。长期以来,软件研究主要关注软件设计的分类、设计方法的演化,很少客观地评估不同的设计选择对系统行为的影响。而相反地,网络研究主要关注系统之间通信行为的细节、如何改进特定通信机制的表现,常常忽视了一个事实,那就是改变应用程序的互动风格比改变互动协议,对整体表现有更大的影响。我这篇文章的写作目的,就是想在符合架构原理的前提下,理解和评估以网络为基础的应用软件的架构设计,得到一个功能强、性能好、适宜通信的架构。"

(This dissertation explores a junction on the frontiers of two research disciplines in computer science: software and networking. Software research has long been concerned with the categorization of software designs and the development of design methodologies, but has rarely been able to objectively evaluate the impact of various design choices on system behavior. Networking research, in contrast, is focused on the details of generic communication behavior between systems and improving the performance of particular communication techniques, often ignoring the fact that changing the interaction style of an application can have more impact on performance than the communication protocols used for that interaction. My work is motivated by the desire to understand and evaluate the architectural design of network-based application software through principled use of architectural constraints, thereby obtaining the functional, performance, and social properties desired of an architecture. )




REST

  • REST不是一种协议,不是一种文件格式,更不是一种开发框架。
  • REST是一系列的设计约束的集合,包括无状态性、将超媒体作为应用状态引擎等,我们将这些约束 称为 Fielding 约束。
  • 表述性状态移交(REpresentational State Transfer)--- REST



资源和表述

资源:任何足够重要并被引用的事物都可以是资源

如果你的用户“想要建立指向它的超文本链接,提出或者反对关于它的断言,获取或者缓存它的表述, 供另外的表述引用它的全部或者部分,给它增加注释信息,或者对它执行某些操作1” ,你都应该将它 定义为资源。

资源可以是任何事物,唯一的条件是每个资源必须拥有URL。

从客户端的角度,它并不关心资源是什么,因为它从来看不到资源,它看到的永远是资源的表述。

表述:一种以机器可读的方式对资源当前状态的说明。表述可以是任何机器可读的包含资 源相关信息的文档。

服务器发送的表述用于描述资源当前的状态,客户端发送的表述用于描述客户端希望资源拥有的状态, 这就是表述性状态移交(REST)。

(资源可以有多种表述,JSON、XML、CSV。)




客户端如何指定哪种表述?

  • 内容协商的方式:通过HTTP报头的值来区分

  • 分配不同URL的方式:一个URL对应一种表述




HTTP 协议语义(非应用语义)




GET、DELETE和幂等性

GET 被定义为安全的HTTP方法,它仅仅是对信息的一次请求,发与不发对服务器的资源没有任何影响。

客户端绝对不要希望发起的GET请求能改变资源的状态。

Delete 客户端希望销毁服务器的某个资源,但服务器并没有义务删除一些它不希望的资源。

幂等性(发送两次请求对资源状态的影响和发送一次请求的影响是一样的)

DELETE方法是幂等的(idempotent),一旦删除一个资源,资源消失,状态永久改变。可以再次发送一 条DELETE请求,可能会收到404错误,但资源的状态和第一次发送DELETE请求后的状态是一致的,这就 是幂等性。 当然,PUT也是幂等的。




PATCH 解决表述的信息量可能太大的问题。

和通过PUT方法发送表述不同,PATCH是建立一个diff表述作为其负载发送给服务器。 (类似为代码通过补丁的形式更新)

HEAD 轻量级的GET,服务器不需要发送消息体,只发送HTTP状态码和报头。

posted @ 2020-06-10 23:03  FenixG  阅读(300)  评论(0编辑  收藏  举报