含状态传输(英文:Representational State Transfer,简称REST)
目前三种主流的Web服务实现方案中
需要注意的是,REST是设计风格而不是标准。REST通常基于使用HTTP,URI,和XML以及HTML这些现有的广泛流行的协议和标准。
- 资源是由URI来指定。
- 对资源的操作包括获取、创建、修改和删除资源,这些操作正好对应HTTP协议提供的GET、POST、PUT和DELETE方法。
- 通过操作资源的表现形式来操作资源。
- 资源的表现形式则是XML或者HTML,取决于读者是机器还是人,是消费web服务的客户软件还是web浏览器。当然也可以是任何其他的格式
含状态传输的Web服务(Restful Web API)是一个使用Http并遵循Rest原则的Web服务。它从以下三个方面资源进行定义:
- 直观简短的资源地址:URI,比如:
http://example.com/resources/
。 - 传输的资源:Web服务接受与返回的互联网媒体类型,比如:JSON,XML ,YAML 等。
- 对资源的操作:Web服务在该资源上所支持的一系列请求方法(比如:POST,GET,PUT或DELETE)。
下表列出了在实现 含状态传输的 Web 服务时HTTP请求方法的典型用途。
资源 | GET | PUT | POST | DELETE |
---|---|---|---|---|
一组资源的URI,比如http://example.com/resources/ |
列出 URI,以及该资源组中每个资源的详细信息(后者可选)。 | 使用给定的一组资源替换当前整组资源。 | 在本组资源中创建/追加一个新的资源。 该操作往往返回新资源的URL。 |
删除 整组资源。 |
单个资源的URI,比如http://example.com/resources/142 |
获取 指定的资源的详细信息,格式可以自选一个合适的网络媒体类型(比如:XML、JSON等) | 替换/创建指定的资源。并将其追加到相应的资源组中。 | 把指定的资源当做一个资源组,并在其下创建/追加一个新的元素,使其隶属于当前资源。 | 删除 指定的元素。 |
REST的优点
- 可更高效利用缓存来提高响应速度,通常Post方式是没有缓存机制的,因此不是查询数据的首选。
- 通讯本身的无状态性可以让不同的服务器的处理一系列请求中的不同请求,提高服务器的扩展性
- 浏览器即可作为客户端,简化软件需求
- 相对于其他叠加在HTTP协议之上的机制,REST的软件依赖性更小
- 不需要额外的资源发现机制
- 在软件技术演进中的长期的兼容性更好
REST API 设计方面的最佳实践:
- 如何规划资源标识结构与 URI 模式
- 如何根据应用场景提供内容协商
- 如何正确的使用 HTTP 响应代码
- 如何处理缓存和并发请求
- 如何利用数据冗余和链接元素
参考资料:
RestAPI最佳实践:https://www.ibm.com/developerworks/cn/web/1103_chenyan_restapi/
Http Head Feild:http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
Http头中有Cache-control:http://www.cnblogs.com/yuyii/archive/2008/10/16/1312238.html
缓存控制:
缓存控制通常是需要客户端,缓存服务器 / 代理服务器与业务服务器一起发生作用。
HTTP 头中有“Cache-control”字段来控制如何使用缓存,常见的取值有 private、no-cache、max-age、must-revalidate 等。比如当你给返回的数据内容设置 max-age=600,那么当用户隔了 30 秒再次请求的时候,就不会导致重新请求后台数据。
另外,也可以通过“Expires”字段来指定内容过期时间,在此时间前的请求都不会导致后台程序重新请求数据。
下图展示了 max-age 是如何工作的。
图 2. 缓存控制工作方式的简单范例
- 阅读 RFC 文档,以了解 HTTP 1.1 标准:http://www.w3.org/Protocols/rfc2616/rfc2616.html
- 阅读 RFC 文档,以了解 URI 标准:http://www.ietf.org/rfc/rfc3986.txt
- 阅读 HTTP 响应状态码相关文档,以了解标准的状态码,包括可以执行的后续方法以及响应需要的信息:http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
- 阅读 developerWorks 文章 : 基于 REST 的 Web 服务,以学习 REST 的基础知识:http://www.ibm.com/developerworks/cn/webservices/ws-restful/