REST(Representational State Transfer)是Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格,他是 HTTP 规范的主要编写者之一。因为REST模式的简洁性,越来越多的web服务开始采用REST风格设计和实现。
REST 指的是一组架构约束条件和原则,REST是设计风格而不是标准。。满足这些约束条件和原则的应用程序或设计就是 RESTful。
REST原则
REST的基本原则是:
- 客户端和服务器之间的交互在请求之间是无状态的。
- 从客户端到服务器的每个请求都必须包含理解请求所必需的信息。
- 如果服务器在请求之间的任何时间点重启,客户端不会得到通知
应用程序状态和功能可以分为各种资源及对资源的操作:
- 资源是由URI来指定。
- 对资源的操作包括获取、创建、修改和删除资源,这些操作正好对应HTTP协议提供的GET、POST、PUT和DELETE方法。
- 通过操作资源的表现形式来操作资源。
- 资源的表现形式则是XML或者HTML,取决于读者是机器还是人,是消费web服务的客户软件还是web浏览器。当然也可以是任何其他的格式。
RESTful Web服务
RESTful Web 服务(也称为 RESTful Web API)是一个使用HTTP并遵循REST原则的Web服务。它从以下三个方面资源进行定义:
- URI,比如:http://example.com/resources/。
- Web服务接受与返回的互联网媒体类型,比如:JSON,XML ,YAML 等。
- Web服务在该资源上所支持的一系列请求方法(比如:POST,GET,PUT或DELETE)。
表格:HTTP 请求方法在RESTful Web 服务中的典型应用
资源 | GET | POST | PUT | DELETE |
---|---|---|---|---|
一组资源的URI,比如http://example.com/resources/ | 列出 URI,以及该资源组中每个资源的详细信息(后者可选)。 | 使用给定的一组资源替换当前整组资源。 | 在本组资源中创建/追加一个新的资源。 该操作往往返回新资源的URL。 | 删除 整组资源。 |
单个资源的URI,比如http://example.com/resources/142 | 获取 指定的资源的详细信息,格式可以自选一个合适的网络媒体类型(比如:XML、JSON等) | 替换/创建 指定的资源。并将其追加到相应的资源组中。 | 把指定的资源当做一个资源组,并在其下创建/追加一个新的元素,使其隶属于当前资源。 | 删除 指定的元素。 |
RESTful实例
下面采用了复数形式的表示统一了URL的书写,增加了可读性。
GET /suppliers 获取列表
GET /suppliers/1 查看具体内容
POST /suppliers 建立一个新的供应商
PUT /suppliers/1 更新编号为1的供应商
DELETE /tickets/1 删除编号为1的供应商
REST的优点
- 可以利用缓存Cache来提高响应速度
- 通讯本身的无状态性可以让不同的服务器的处理一系列请求中的不同请求,提高服务器的扩展性
- 浏览器即可作为客户端,简化软件需求
- 相对于其他叠加在HTTP协议之上的机制,REST的软件依赖性更小
- 不需要额外的资源发现机制
- 在软件技术演进中的长期的兼容性更好
RESTful实践
返回结果和传入值
可以使用FORM、URL或者JSON作为传入值,除检索和限定使用URL方式外,其它的我一般使用JSON组织输入值。返回值建议使用JSON。
如何表示特定资源
当需要返回部分资源时可以在URL中加入参数作为属性及过滤条件。
使用HTTP响应状态代码来表达各种出错情况
资源安全
如果不是公开资源需要对资源的访问进行安全认证,通常有以下方面:
- 使用SSL保证传输内容安全;
- 对数据签名防止篡改;
- 进行客户端认证。
客户端认证
客户端认真一般使用标准的HTTP认证,如:Basic等;还有常用的OAuth认证。 由于REST是无状态的,要实现鉴权,必须每次传入鉴权信息。
POST和PUT及PATCH
PUT可以用于创建和更新资源,PUT是在指定资源路径的情况下建立和更新资源的(PUT更新内容是整体更新,否则就违反的HTTP的规定),完成后返回资源的URI。PUT是幂等的(也就是不管执行多少次资源的状态都是一样的)
POST创建资源是在某个资源下面创建资源,它是非幂等的,每次提交会产生一个新的资源;当POST用于更新资源时,可以部分更新资源。
PATCH是一个新的规范,用于部分更新。
使用缓存
由于GET是幂等的可以很好的利用HTTP缓存提高系统性能。
API版本
应用中经常要考虑新旧API同时运行,需要在设计时给予考虑,可以采用URL、参数和HTTP头中设置版本信息,一般建议URL和参数,这两种比较友好和直观。
相关内容
· REST