restful接口的原理
REST全称是Representational State Transfer, 中文意思是表述性状态转移。
下面我们结合REST原则,围绕资源展开讨论,从资源的定义、获取、表述、关联、状态变迁等角度,列举一些关键概念并加以解释。
•资源与URI
•统一资源接口
•资源的表述
•资源的链接
•状态的转移
1.资源与URI
REST全程是表述性状态转移,表述就是资源(指客户端请求一个资源,服务器拿到的这个资源,就是表述)。资源可以是实体,也可以是一个抽象概念。
要让一个资源被识别,需要有个唯一的标识,在Web中这个唯一标识就是URI(Uniform Resourse Identifier)。URI既可以堪称是资源的地址,也可以看成是资源的名称。如果某些信息没有使用URI来表示,那它就不能算是一个资源,只能算资源的一些信息而已。URI的设计应该遵循 可寻址性原则,具有自描述性,需要在形式上给人以直觉上的关联。
2.统一资源接口
RESTful架构应该遵循统一接口原则,统一接口包含了一组受限的预定义的操作,不论什么样的资源,都是通过使用相同的接口进行资源的访问。接口应该使用标准的HTTP方法如GET,PUT和POST,并遵循这些方法的语义。
如果按照HTTP方法的语义来暴露资源,那么接口将会拥有安全性和幂等性的特性,例如GET和HEAD请求都是安全的, 无论请求多少次,都不会改变服务器状态。而GET、HEAD、PUT和DELETE请求都是幂等的,无论对资源操作多少次, 结果总是一样的,后面的请求并不会产生比第一次更多的影响。
下面列出了GET,DELETE,PUT和POST的典型用法:
GET
•安全且幂等
•获取表示
•变更时获取表示(缓存)
•200(OK) - 表示已在响应中发出
•204(无内容) - 资源有空表示
•301(Moved Permanently) - 资源的URI已被更新
•303(See Other) - 其他(如,负载均衡)
•304(not modified)- 资源未更改(缓存)
•400 (bad request)- 指代坏请求(如,参数错误)
•404 (not found)- 资源不存在
•406 (not acceptable)- 服务端不支持所需表示
•500 (internal server error)- 通用错误响应
•503 (Service Unavailable)- 服务端当前无法处理请求
POST
•不安全且不幂等
•使用服务端管理的(自动产生)的实例号创建资源
•创建子资源
•部分更新资源
•如果没有被修改,则不过更新资源(乐观锁)
•200(OK)- 如果现有资源已被更改
•201(created)- 如果新资源被创建
•202(accepted)- 已接受处理请求但尚未完成(异步处理)
•301(Moved Permanently)- 资源的URI被更新
•303(See Other)- 其他(如,负载均衡)
•400(bad request)- 指代坏请求
•404 (not found)- 资源不存在
•406 (not acceptable)- 服务端不支持所需表示
•409 (conflict)- 通用冲突
•412 (Precondition Failed)- 前置条件失败(如执行条件更新时的冲突)
•415 (unsupported media type)- 接受到的表示不受支持
•500 (internal server error)- 通用错误响应
•503 (Service Unavailable)- 服务当前无法处理请求
PUT
•不安全但幂等
•用客户端管理的实例号创建一个资源
•通过替换的方式更新资源
•如果未被修改,则更新资源(乐观锁)
•200 (OK)- 如果已存在资源被更改
•201 (created)- 如果新资源被创建
•301(Moved Permanently)- 资源的URI已更改
•303 (See Other)- 其他(如,负载均衡)
•400 (bad request)- 指代坏请求
•404 (not found)- 资源不存在
•406 (not acceptable)- 服务端不支持所需表示
•409 (conflict)- 通用冲突
•412 (Precondition Failed)- 前置条件失败(如执行条件更新时的冲突)
•415 (unsupported media type)- 接受到的表示不受支持
•500 (internal server error)- 通用错误响应
•503 (Service Unavailable)- 服务当前无法处理请求
DELETE
•不安全但幂等
•删除资源
•200 (OK)- 资源已被删除
•301 (Moved Permanently)- 资源的URI已更改
•303 (See Other)- 其他,如负载均衡
•400 (bad request)- 指代坏请求
•404 (not found)- 资源不存在
•409 (conflict)- 通用冲突
•500 (internal server error)- 通用错误响应
•503 (Service Unavailable)- 服务端当前无法处理请求
3.资源的表述
客户端获取的是资源的表述,而不是资源本身。例如文本资源有html、xml、json等格式。
客户端可以通过Accept头请求一种特定格式的表述,服务端则通过Content-Type告诉客户端资源的表述形式。