具象状态传输(REST,英文:Representational State Transfer)是Roy Thomas Fielding博士于2000年在他的博士论文中提出来的一种万维网软件架构风格,目的是便于不同软件/程序在网络(例如互联网)中互相传递信息。
目前在三种主流的Web服务实现方案中,因为REST模式与复杂的SOAP和XML-RPC相比更加简洁,越来越多的web服务开始采用REST风格设计和实现。例如,Amazon.com提供接近REST风格的Web服务运行图书查询;雅虎提供的Web服务也是REST风格的。
简介需要注意的是,具象状态传输是设计风格而不是标准。REST通常基于使用HTTP,URI,和XML以及HTML这些现有的广泛流行的协议和标准。
资源是由URI来指定。
对资源的操作包括获取、创建、修改和删除资源,这些操作正好对应HTTP协议提供的GET、POST、PUT和DELETE方法。
通过操作资源的表现形式来操作资源。
资源的表现形式则是XML或者HTML,取决于读者是机器还是人,是消费web服务的客户软件还是web浏览器。当然也可以是任何其他的格式。1
特征特征说明统一接口(Uniform Interface)
1. 以资源为基础
每个资源都可以通过URI访问到。也就是一个个可以认知的资源,比如文档,音乐,视频等信息,都可以通过唯一的URI确定。
2. 通过重表达的客户端可以管理原资源
就是我们通过客户端可以修改原资源的状态。
3. 返回信息足够描述自己
这样重表达的客户端可以知道如何处理。
4. 超媒体是应用状态的引擎
处理以超媒体为基础的状态变化。
Stateless
无状态。
Cacheable
可缓存。
Client-Server
客户服务器分离模式,任何一个客户端与服务器都是可替换的。
Layered System
分层的系统,客户端不知道他联系的是不是最终服务器。
Code on Demand (optional)
服务器可以将能力扩展到客户端,如果客户端可以执行的话。这个功能是可选择的。1
具体说明具象状态传输架构风格最重要的架构约束有6个:
客户-服务器(Client-Server)
通信只能由客户端单方面发起,表现为请求-响应的形式。
无状态(Stateless)
通信的会话状态(Session State)应该全部由客户端负责维护。
缓存(Cache)
响应内容可以在通信链的某处被缓存,以改善网络效率。
统一接口(Uniform Interface)
通信链的组件之间通过统一的接口相互通信,以提高交互的可见性。
分层系统(Layered System)
通过限制组件的行为(即每个组件只能“看到”与其交互的紧邻层),将架构分解为若干等级的层。
按需代码(Code-On-Demand,可选)
支持通过下载并执行一些代码(例如Java Applet、Flash或JavaScript),对客户端的功能进行扩展。1
关于状态应该注意区别应用的状态和连接协议的状态。HTTP连接是无状态的(也就是不记录每个连接的信息),而REST传输会包含应用的所有状态信息,因此可以大幅降低对HTTP连接的重复请求资源消耗。1
应用于Web服务匹配具象状态传输设计风格的Web API称为RESTful API。它从以下三个方面资源进行定义:
直观简短的资源地址:URI,比如:http://example.com/resources/。
传输的资源:Web服务接受与返回的互联网媒体类型,比如:JSON,XML,YAML等。
对资源的操作:Web服务在该资源上所支持的一系列请求方法(比如:POST,GET,PUT或DELETE)。1
具象状态传输优点可更高效利用缓存来提高响应速度
通讯本身的无状态性可以让不同的服务器的处理一系列请求中的不同请求,提高服务器的扩展性
浏览器即可作为客户端,简化软件需求
相对于其他叠加在HTTP协议之上的机制,REST的软件依赖性更小
不需要额外的资源发现机制
在软件技术演进中的长期的兼容性更好1
实现举例例如,一个简单的网络商店应用,列举所有商品,
GET http://www.store.com/products
呈现某一件商品,
GET http://www.store.com/products/12345
下单购买,
POST http://www.store.com/orders ... 1
本词条内容贡献者为:
李嘉骞 - 博士 - 同济大学