Rest概念学习

参考文章

http://www.cnblogs.com/shanyou/archive/2012/05/12/2496959.html

http://www.cnblogs.com/loveis715/p/4669091.html

 本文旨在分享学习。内容大多摘抄博友的文章。

1、REST 本身是设计风格而不是标准REST 谈论一件非常重要的事,如何正确地使用 Web标准,例如,HTTP 和 URI想要了解 REST 最好的方式就是思索与了解 Web 及其工作方式。如果你设计的应用程序能符合 REST 原则 (REST principles),这些符合 REST 原则的 REST 服务可称为 "RESTful web service" 也称 "RESTful Web API"。"-ful" 字尾强调它们的设计完全符合 REST 论文里的建议内容。

2、Client 的通过 URI 来获取资源的具体象征 (Representational)。Client 取得这些具体象征使这些应用程序转变其状态 (以 浏览器而言,取得 HTML、CSS、JavaScript … 来生成界面),随着不断取得资源的具体象征, Client 端不断地改变其状态,这样不断的反复 (iterations ) 过程就是所谓的 Representational State Transfer(表征状态传输)。

3、使用 WEB 标准
在 HTTP/1.1 RFC 2616第 5.1.1 Method 一节定义了八大类 HTTP 方法来操作资源,除了我们常用的 GET 与 POST 之外,在 REST 中常用的还有 PUT 与 DELETE。此 GET, POST, PUT, DELETE 正好可以对应我们 CRUD (Create, Read, Update, Delete) 四种数据操作。

4、我们可以发现REST其实是一种组织Web服务的架构,而并不是我们想象的那样是实现Web服务的一种新的技术,更没有要求一定要使用HTTP。其目标是为了创建具有良好扩展性的分布式系统。

  反过来,作为一种架构,其提出了一系列架构级约束。这些约束有:

(1)使用客户/服务器模型。客户和服务器之间通过一个统一的接口来互相通讯。

(2)层次化的系统。在一个REST系统中,客户端并不会固定地与一个服务器打交道。

(3)无状态。在一个REST系统中,服务端并不会保存有关客户的任何状态。也就是说,客户端自身负责用户状态的维持,并在每次发送请求时都需要提供足够的信息。

(4)可缓存。REST系统需要能够恰当地缓存请求,以尽量减少服务端和客户端之间的信息传输,以提高性能。

(5)统一的接口。一个REST系统需要使用一个统一的接口来完成子系统之间以及服务与用户之间的交互。这使得REST系统中的各个子系统可以独自完成演化。

  如果一个系统满足了上面所列出的五条约束,那么该系统就被称为是RESTful的。

下面我们再次通过电子商务网站egoods这个示例来帮助我们理解这些约束。首先,egoods是一个电子商务网站。用户需要通过浏览器,手机或者网站所发布的浏览应用来访问该网站的内容。因此其使用的自然是客户/服务器模型。而在浏览过程中,用户需要访问不同类型的数据,如商品描述、购物车等信息。这些信息可能由egoods网站服务中不同的服务器来提供的,因此在用户浏览过程中可能需要与不止一个服务器进行交互。如果在服务端保存了有关客户的任何状态,那么在用户与不同服务器进行交互的时候,客户的状态就需要在这些服务之间进行同步,大大地增加了系统的复杂度。因此,REST要求客户端自行维护状态,并在每次发送请求的时候提供自身所储存的处理该请求所必需的信息。而恰当地使用缓存这一条也非常容易理解。在客户端请求一个自上次请求后没有发生过变化的信息时,如产品分类列表,服务端仅仅需要返回一个304响应即可。

5、而第五条约束,统一接口,可以说是REST服务设计的核心所在,也是决定REST服务设计的成败之处。在实现一个基于HTTP的REST服务时,软件开发人员不仅仅需要考虑REST所设置的一系列约束,更需要考虑HTTP各组成的语意,HTTP相关技术如何与REST服务约束结合,如何保持前后向兼容性以及如何进行版本管理等问题,才能给出一个自然的,具有较高易用性和较强生命力的REST系统。

 而在介绍统一接口约束之前,我们则需要了解一下和REST密切相关的两个名词:资源和状态。可以说,资源是REST系统的核心概念。所有的设计都会以资源为中心,包括如何对资源进行添加,更新,查找以及修改等。而资源本身则拥有一系列状态。在每次对资源进行添加 ,删除或修改的时候,资源就将从一个状态转移到另外一个状态。

  比如说,在egoods中,商品的分类就是一种资源。该资源有很多实例,包括表示食品的分类,其所对应的URL是“/api/categories/1”。同样地,食品的品牌也是一种资源。这些资源的实例都对应着一个当前的状态。在修改了一个资源实例之后,比如修改了食品分类中的热搜关键字,那么其将对应着一个新的状态。这种状态之间的变化被称为是状态的转移

  在大概了解了REST系统中的资源和状态的定义后,我们来看看统一接口这个约束。该约束又包含了四个子约束

(1)每个资源都拥有一个资源标识。每个资源的资源标识可以用来唯一地标明该资源。

(2)消息的自描述性。在REST系统中所传递的消息需要能够提供自身如何被处理的足够信息。例如该消息所使用的MIME类型,是否可以被缓存等。

(3)资源的自描述性。一个REST系统所返回的资源需要能够描述自身,并提供足够的用于操作该资源的信息,如如何对资源进行添加,删除以及修改等操作。也就是说,一个典型的REST服务不需要额外的文档对如何操作资源进行说明。

(4)HATEOAS。即客户只可以通过服务端所返回各结果中所包含的信息来得到下一步操作所需要的信息,如到底是向哪个URL发送请求等。也就是说,一个典型的REST服务不需要额外的文档标示通过哪些URL访问特定类型的资源,而是通过服务端返回的响应来标示到底能在该资源上执行什么样的操作。一个REST服务的客户端也不需要知道任何有关哪里有什么样的资源这种信息。

原文地址:https://www.cnblogs.com/taoshengyujiu/p/6994007.html