http不仅仅是传输协议,更是一种应用协议。REST,即Representational State Transfer的缩写。意为是"表现层状态转化"。RESTful表示一种风格,理解REST前需要理解资源,何谓资源,广义的资源是指可以操作的所有对象。可能是一个系统资源,如txt、jgp、xml …,亦可以是诸如自己定义的虚拟集合的抽象,如books、usrs、times。RESTfutl代表一种简洁、方便、快捷、高效、透明的架构,这取决于你怎样组合。具有如下特点:
1、规范化接口访问方式。这些http操作方法包括GET/POST/PUT/DELETE/OPTIONS等,每个操作方法都代表一个相同意义的操作,它向所有人透明地表明操作方式。比如GET只能读取/拉数据,当然你也可以是添加数据,但建议不要这么做,不然这样就失去了REST的意义。
1) GET 读取
2) POST 添加
3) PUT 修改
4) DELETE 删除
2、资源标识唯一。通过URI表示一个资源名称,形式/resource/patch。如/users,表示用户的组合,或用户群。当然还可以继续标识某个具体的一个用户,/users/11,表示id为11的用户。当然,你也可以又用一组/usrgroup/11的URI代表操作用户组,不过不建议这么做,因为这样从字面上重复了/users/11资源表示的内容。一个资源URI总是包含第一条实现的方法:
GET /users/11
POST /users/11
PUT /users/11
DELETE /users/11
当然,仅有这些还不足以包括资源操作的所有需求,所以还可以包含请求参数,如GET /users?type=list&page=1。
3、状态的转化。这就是REST的真实含义,指它允许资源URI具有不同的表现形式。同一个URI,根据不同请求方式,执行的动作不同;还可以根据请求的Header Accept的不同返回不同的结果,如text/html、text/css、text/xml等等。也可以理解为body不同。如查询快递一般,可以上次查询,物品还在仓库,而过一段时间已经在路上了。它表示的是一个互动过程。
4、所有信息都包含在当前请求中。请求的方式包含在 Request Header的Method中,还可以包含Accept、Accept-Encoding、Accept-Language,使用Authentication、Cookie等信息表明身份。同样,服务端通过发送Content-Length、Content-Type响应执行情况。最重要的是,需要返回Status Code通知执行状态,如200 201 400 404 500等http code。REST认为,所有信息都能通过请求一次性发送,而不必再采用方式保存状态,请求的信息本身已经说明了请求的意义。
5、无状态性。这是REST最重要的特性之一,这个状态指的是客户端与服务端无需为每次保存请求状态,客户端请求不必考虑当前状态,不必考虑上下文。具体上说,就是不必使用session等工具跟踪、保存请求的特殊性。比如,无论是谁,从哪里发送,几时发送,对同一个URI资源发送请求的结果都是一样的。据传,这样的设计是为当一台服务器宕机时,另一台服务器可以无差别地响应对方的请求。客户端请求只认URI,而不需理后台的设计。
实际上,在如今执行的RESTful设计当中,完全能执行这个要求的很少,最彻底的云服务,大部份为RESTful-like的风格。
6、可实现请求缓存。通过缓存减少请求次数,在HTTP响应里利用Cache-Control、Expires、Last-Modified三个头字段,可以让浏览器缓存资源一段时间。