理论与实例,准确理解REST的无状态设计

来源:互联网 发布:30岁精华推荐知乎 编辑:程序博客网 时间:2024/05/17 04:15

REST含义为”表述性状态转移”, 基于REST的Web服务遵循一些基本的设计原则, 比较难理解的是服务器端的请求应该是无状态的。

简介:

REST 含义为“表述性状态转移”。REST是一种开发 Web 应用的架构风格,可以将其理解为一种设计模式。


设计原则:

1)通过 URI 来标识资源:
系统中的每一个对象或是资源都可以通过一个唯一的 URI 来进行寻址,URI 的结构应该简单、可预测且易于理解,比如定义目录结构式的 URI。
2)统一接口:
建立创建、检索、更新和删除操作与 HTTP 方法之间的一对一映射:
若要在服务器上创建资源,应该使用 POST 方法;
若要检索某个资源,应该使用 GET 方法;
若要更新或者添加资源,应该使用 PUT 方法;
若要删除某个资源,应该使用 DELETE 方法。
3)资源多重表述:
URI 所访问的每个资源都可以使用不同的形式加以表示(比如 XML 或者 JSON),具体的表现形式取决于访问资源的客户端。在 REST 的世界中,资源即状态,每个网页是其一个状态;URI 是状态的表述;REST 风格的应用则是从一个状态迁移到下一个状态的状态转移过程。早期互联网只有静态页面的时候,通过超链接在静态网页间浏览跳转的 page->link->page->link… 模式就是一种典型的状态转移过程。
4)无状态:
客户端对服务器端的请求应该是无状态的,请求不要求服务器在处理请求时检索任何类型的应用程序上下文或状态。无状态约束使服务器的变化对客户端是不可见的,因为在两次连续的请求中,客户端并不依赖于同一台服务器。


如何理解REST的无状态设计

每一个URI请求(例如网页)理解为一个状态,那么不同URI(网页)间的跳转可以理解为不同状态之间的转移。那么这个状态究竟如何实现转移的呢?
很关键的理解:

状态可以嵌入到应答消息里,这样一来状态在接下来的交互中仍然有效。
通过超链接实现有状态交互,请求消息的每次交互都包含完整的信息。有多种技术实现了不同请求间状态信息的传输,例如 URI ,cookies 和隐藏表单字段等。状态可以嵌入到应答消息里,这样一来状态在接下来的交互中仍然有效。

举例子:
状态记录在服务端设计:
a, 用户user登陆后,user的上下文信息例如记录该user已登陆的标识保存在服务器端session中,当用户发生下一次的请求,服务端会根据userId查找该session是否标记了该用户已登录的状态
b, 用户浏览书签页,当前用户浏览的页面是第3页,这个第3页的信息保存在服务器端session中,当用户请求下一页nextPage,服务端从session拿出当前阅读状态为第3页,基于此状态计算出下一页是第4页

RESTful的设计:
a, 用户user登陆后,服务器生成验证信息token,该token标记该用户已经登陆的状态,服务端不保存该token信息,而是token返回给客户端,
当用户发生下一次的请求,客户端把该token重新发送给服务端,于是服务端就根据该token知道用户已经登陆的状态(具体实现是:第一次登陆,token信息在数据库端缓存下来,第二次请求时候从数据库缓存查询该用户token。这样用户状态的信息就不需要保存在服务器端,保存了在数据库端,数据库端一般采用redis类型的缓存数据库)
b, 用户浏览书签页,当前用户浏览的页面是第3页,服务器返回当前页第3页这个状态给客户端,服务端不保存当前阅读页数的状态,当用户发生下一页的请求,客户端把当前页第3页和下一页操作给服务端,服务端基于客户端的状态信息计算出下一页是第4页

由此可以看出,
REST 风格应用可以实现交互,但它却天然地具有服务器无状态的特征。在状态迁移的过程中,服务器不需要记录任何 Session,所有的状态都通过 URI 的形式记录在了客户端。更准确地说,这里的无状态服务器,是指服务器不保存会话状态(Session);而资源本身则是天然的状态,通常是需要被保存的;这里所指无状态服务器均指无会话状态服务器。

补充一点:
REST表述性状态转移,个人认为可以简单理解为把服务端的状态迁移到客户端保存或者数据库端保存,从而应用服务器就可以设计成无状态。所以文章标题更严格来说应该是“准确理解REST在应用服务端的无状态设计”。


学习过程分享:

学习新技术,大致分两个阶段:

第一阶段:了解这个东西是什么,有什么功能,什么场景下使用

基于这个层次的理解,我们一般就可以进入应用阶段,所谓依葫芦画瓢。

第二阶段:这个东西为什么是这样的,功能原理是怎样的,如何实现,如何做到

基于这个层次的深入思考,就能对比出不同技术方案之间的区别,真正体会这门技术的要点。

如果永远停留在第一个层次,那你永远是技术的被动者,很难成为大师。现今浮躁社会的速成方法往往让开发工程师停留在第一阶段。

网上查了很多博客介绍REST或者RESTFUL,基本没有很满意的文章,感觉大部分都是抄袭,没有自己的理解。因为我看到的大部分是抄袭理论介绍,抄袭本无错,关键是经常缺少基于自己理解的例子。


REST和RESTFUL的区别,关系?

经过大量资料阅读,我只能这样举例解释:就好比Beauty和Beautiful的关系。

3 0
原创粉丝点击