转至http://lelglin.iteye.com/blog/1852092

Representational State Transfer的缩写。我对这个词组的翻译是"表现层状态转化"。

降低开发的复杂性,提高系统的可伸缩性

  • 资源
  • 表现层
  • 状态转化

资源

REST的名称"表现层状态转化"中,省略了主语。"表现层"其实指的是"资源"(Resources)的"表现层"。所谓"资源",就是网络上的一个实体,或者说是网络上的一个具体信息。它可以是一段文本、一张图片、一首歌曲、一种服务,总之就是一个具体的实在。你可以用一个URI(统一资源定位符)指向它,每种资源对应一个特定的URI。要获取这个资源,访问它的URI就可以,因此URI就成了每一个资源的地址或独一无二的识别符。

表现层(Representation)

URI只代表资源的实体,不代表它的形式。严格地说,有些网址最后的".html"后缀名是不必要的,因为这个后缀名表示格式,属于"表现层"范畴,而URI应该只代表"资源"的位置。它的具体表现形式,应该在HTTP请求的头信息中用Accept和Content-Type字段指定,这两个字段才是对"表现层"的描述。

状态转化(State Transfer)

互联网通信协议HTTP协议,是一个无状态协议。这意味着,所有的状态都保存在服务器端。因此,如果客户端想要操作服务器,必须通过某种手段,让服务器端发生"状态转化"(State Transfer)。而这种转化是建立在表现层之上的,所以就是"表现层状态转化"。

就是HTTP协议里面,四个表示操作方式的动词:GET、POST、PUT、DELETE。它们分别对应四种基本操作:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源。

几种误区

最常见的一种设计错误,就是URI包含动词--》 /posts/show/1,正确的写法应该是/posts/1,然后用GET方法表示show。

资源不能是动词,但是可以是一种服务

POST /accounts/1/transfer/500/to/2 --》

POST /transaction HTTP/1.1
  from=1&to=2&amount=500.00

为什么在请求中传递SessionID被普遍认为是unRESTful的,而将用户的credentials包含在每个请求里又是一种非常RESTful的做法

无状态指的是任意一个Web请求必须完全与其他请求隔离,当请求端提出请求时,请求本身包含了相应端为相应这一请求所需的全部信息。

RESTful架构对于state的两个不同的解释: 应用状态(Application State)和资源状态(Resource State)。

  • 应用状态:指的是与某一特定请求相关的状态信息
  • 资源状态:则反映了某一存储在服务器端资源在某一时刻的特定状态,该状态不会因为用户请求而改变,任何用户在同一时刻对该资源的请求都会获得这一状态的表现(Representation)。

RESTful架构要求服务器端不保有任何与特定HTTP请求相关的资源,所以应用状态必须由请求方在请求过程中提供。

在Session ID可以被认为是一个用来标识某一会话状态的Key,将其传递给服务器端意味着这样一个请求:“请帮我取出这个状态信息”,也就是说这个请求假设响应方保有着状态信息。由于与某一特定请求相关的状态属于应用状态,而RESTful架构要求任何此类状态由请求方负责提供,所以传递Session ID被认为是unRESTful的做法。反过来,user credential作为一种应用状态,是被期望由请求方提供的,所以在请求中传递user credentials(姑且忽略安全性问题)是符合RESTful架构规范的。

最新文章

  1. [poj2155]Matrix(二维树状数组)
  2. 安全框架 - Shiro与springMVC整合的注解以及JSP标签
  3. 架设 OpenLDAP服务器(转)
  4. OSPF LSA的详解
  5. VB6.0连接MySQL数据库
  6. POJ3255--次短路
  7. 创建oracle数据库的表空间、用户、目录、导入\导出文件等信息
  8. Struts2---Result(传统Web应用程序与Ajax应用程序的异同)
  9. 本机安装mysql服务,步骤教程(另附SQLyog和Navicat工具)
  10. 数值积分之Simpson公式与梯形公式
  11. J2SE学习历程
  12. Redis(三)-数据类型
  13. 两种语言实现设计模式(C++和Java)(一:工厂模式)
  14. 参考信息 - Serverless
  15. 20165305 苏振龙《Java程序设计》第八周课上测试补做
  16. ETL数据清洗工具总结
  17. Orchard模块开发全接触1:起步
  18. python+selenium:iframe框架中多种定位
  19. 通过jaxws-ri创建webservice服务端和客户端
  20. e640. 使一个组件可拖动

热门文章

  1. PostgreSQL的checkpoint能否并行
  2. sqlserver2008 数据库
  3. 创龙6748开发板加载.out出现a data verification error occurred, file load failed
  4. 【RAC搭建报错】在RAC搭建到grid安装前的检查时,报错
  5. redis 为什么快
  6. Hexo博客 云服务器搭建
  7. ES6的新特性(22)——Reflect
  8. Chrome 鲜为人知的秘籍(内部协议)&&Chrome功能指令大全
  9. apply新用法,最大值查找
  10. 后端编程语言PHP