REST是新一代的web service设计标准,关于REST的定义,以及同传统SOAP相比较的优略,这里就不罗嗦了,以后可以直接google。
这里先总结一下目前学到的REST相关知识。
REST中存在两个很重要的概念:资源 和 状态转移,一定要以这两个概念为核心,再去了解其他的如缓存、安全等方面。好了,废话少说,直接看总结:
1. 定义资源
REST的首要步骤之一就是定义资源。将客户端对URL的访问定义成对不同资源的访问。
2. 定义统一接口
HTTP是一种应用协议,而不仅仅是传输协议。HTTP定义了诸如GET、PUT、DELETE、POST等方法对资源进行操作。有了他们,我们无需创造createOrder, getStatus, updateStatus等应用程序特定的操作了。
所以,能否从HTTP基础设施中获得多少利益,主要取决于您把它当做应用层协议用的有多好。
GET用于获取资源
PUT用于更新资源
POST用于创建资源
DELETE用于删除资源
3. 定义表述(Representation)
资源是一个抽象的实体,因此需要在响应时定义一种对资源的表述。表述的类型有很多种格式,常见的有xml、json、PDF、CSV等等
4. 使用链接(link)实现状态转移
链接(link)提供了一种方式,帮助你从一种资源转移到另外一种资源,这种方式正好解释了REST中Transfer的含义。譬如,当使用GET获取一个1000条资源的列表时,如果当前的表述无法包括所有的的资源,则可以在当前表述中加上-“前页”/“后页”等的内部链接,从而帮助客户端完成对剩余资源获取的转移。
如下定义的表述中返回一组书籍的列表,同时在结果中定义了对"prev"和"next"等状态的转移。
{
"results": [{
"price": "25"
"name": "java in action",
"title": "java in action",
"category": "IT",
"isbn": "109422476",
"description": "xxxx"},
{
"price": "40"
"name": "Ruby in action",
"title": "Ruby in action",
"category": "IT",
"isbn": "109422479",
"description": "xxxx"}
]
"links": [
{
"uri": "xxxx",
"rel": "prev"
},
{
"uri": "xxxx",
"rel": "next"
}],
"available-results": 200
}
另外,关于流程的状态迁移,可以一步一步按照客户端发出的请求返回符合条件的链接。
比如流程是A->B->C->D,当请求A时,实际上并不知道接下来能否满足条件访问B,只有当服务器成功响应请求A后,在A的响应中加入对资源B的链接,此时,客户端才可以继续访问B的请求。
以此类推,达到了流程化中对多种资源状态转移的实现。
5. 安全
可以采用2种方式:
1)当客户端访问一个受保护资源时,可以设置Authenticate头,对<认证用户名>:<Secret>采用base64编码,发送给服务器端.此种方式可以详见HTTP协议。
2)客户端先发送请求,包括用户名和加密过的密码,服务器响应后,返回特殊的key,客户端下次访问时候,携带上该key,例如
客户端采用POST发送请求:
{
"email":"xxxxx",
"password":"xxxx"
}
服务器端返回请求:
{
"email":"xxxx"
key:"xxxxxxxxxxxxx"
}
当客户端需要再次访问受限资源时,可以附带上该key,这样服务器端就知道请求的操作是否能访问受限资源了。
6. 缓存
缓存可以帮助增加可靠性、减少服务器开销、降低成本等。REST的缓存主要是利用HTTP协议的缓存机制,如Header中的no-cache、Expire、Cache-Control等