http://www.ruanyifeng.com/blog/2011/09/restful.html
http://www.williamlong.info/archives/1728.html
http://leechan.me/?p=1714
先前我曾经介绍过利用Apache Axis实现基于SOAP的Web Service实现技术和相关代码,总的来说,SOAP的Web Service解决方案虽然较为成熟,且安全性较好,但是使用门槛较高,在大并发情况下会有性能问题,在互联网上使用不太普及,因此并不太适合Web 2.0网站服务使用,目前大量的Web 2.0网站使用另外一种解决方案——REST。
REST的架构设计
REST(Representational State Transfer)是一种轻量级的Web Service架构风格,其实现和操作明显比SOAP和XML-RPC更为简洁,可以完全通过HTTP协议实现,还可以利用缓存Cache来提高响应速度,性能、效率和易用性上都优于SOAP协议。
REST架构遵循了CRUD原则,CRUD原则对于资源只需要四种行为:Create(创建)、Read(读取)、Update(更新)和Delete(删除)就可以完成对其操作和处理。这四个操作是一种原子操作,即一种无法再分的操作,通过它们可以构造复杂的操作过程,正如数学上四则运算是数字的最基本的运算一样。
REST架构让人们真正理解我们的网络协议HTTP本来面貌,对资源的操作包括获取、创建、修改和删除资源的操作正好对应HTTP协议提供的GET、POST、PUT和DELETE方法,因此REST把HTTP对一个URL资源的操作限制在GET、POST、PUT和DELETE这四个之内。这种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性。
REST的设计准则
REST架构是针对Web应用而设计的,其目的是为了降低开发的复杂性,提高系统的可伸缩性。REST提出了如下设计准则:
网络上的所有事物都被抽象为资源(resource);
每个资源对应一个唯一的资源标识符(resource identifier);
通过通用的连接器接口(generic connector interface)对资源进行操作;
对资源的各种操作不会改变资源标识符;
所有的操作都是无状态的(stateless)。
使用REST架构
对于开发人员来说,关心的是如何使用REST架构,这里我们来简单谈谈这个问题。REST不仅仅是一种崭新的架构,它带来的更是一种全新的Web开发过程中的思维方式:通过URL来设计系统结构。REST是一套简单的设计原则、一种架构风格(或模式),不是一种具体的标准或架构。REST有很多成功的使用案例,著名的Delicious和Flickr都提供基于REST风格的API使用,客户端调用也极其方便,下面是我用ASP写的一个很简单的REST举例,从中可以看出REST是多么的简单易用。
客户端代码:
Private Function httpGet(url, method, data)
Dim xmlhttp
Set xmlhttp = Server.CreateObject("MSXML2.ServerXMLHTTP")
xmlhttp.open method, url + "?" + data, False
xmlhttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"
xmlhttp.setRequestHeader "Content-Length", Len(data)
xmlhttp.send (Null)
If (xmlhttp.Status = 200) Then httpGet = xmlhttp.responseText
Set xmlhttp = Nothing
End Function
Private Function httpPost(url, method, data)
Dim xmlhttp
Set xmlhttp = Server.CreateObject("MSXML2.ServerXMLHTTP")
xmlhttp.open method, url, False
xmlhttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"
xmlhttp.setRequestHeader "Content-Length", Len(data)
xmlhttp.send (data)
If (xmlhttp.Status = 200) Then httpPost = xmlhttp.responseText
Set xmlhttp = Nothing
End Function
Private Function httpPut(url, method, data)
Dim xmlhttp
Set xmlhttp = Server.CreateObject("MSXML2.ServerXMLHTTP")
xmlhttp.open method, url, False
xmlhttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"
xmlhttp.setRequestHeader "Content-Length", Len(data)
xmlhttp.send (data)
If xmlhttp.Status >= 400 And xmlhttp.Status <= 599 Then
response.write " Error Occurred : " & xmlhttp.Status & " - " & xmlhttp.statusText
Else
response.write xmlhttp.responseText
End If
If (xmlhttp.Status = 200) Then httpPut = xmlhttp.responseText
Set xmlhttp = Nothing
End Function
Private Function httpDelete(url, method, data)
Dim xmlhttp
Set xmlhttp = Server.CreateObject("MSXML2.ServerXMLHTTP")
xmlhttp.open method, url + "?" + data, False
xmlhttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"
xmlhttp.setRequestHeader "Content-Length", Len(data)
xmlhttp.send (Null)
If xmlhttp.Status >= 400 And xmlhttp.Status <= 599 Then
response.write " Error Occurred : " & xmlhttp.Status & " - " & xmlhttp.statusText
Else
response.write xmlhttp.responseText
End If
If (xmlhttp.Status = 200) Then httpDelete = xmlhttp.responseText
Set xmlhttp = Nothing
End Function
response.write httpPost("http://localhost/rest/service.asp", "POST", "do=POST")
response.write httpGet("http://localhost/rest/service.asp", "GET", "do=GET")
response.write httpPut("http://localhost/rest/service.asp", "PUT", "do=PUT")
response.write httpDelete("http://localhost/rest/service.asp", "DELETE", "do=DELETE")
服务端代码:
If (Request.ServerVariables("REQUEST_METHOD")="GET") Then
Response.Write "DO GET" + Request("do")
ElseIf (Request.ServerVariables("REQUEST_METHOD")="POST") Then
Response.Write "DO POST" + Request("do")
ElseIf (Request.ServerVariables("REQUEST_METHOD")="PUT") Then
Response.Write "DO PUT" + Request("do")
ElseIf (Request.ServerVariables("REQUEST_METHOD")="DELETE") Then
Response.Write "DO DELETE" + Request("do")
End if
需要注意的是,IIS服务器默认是不支持ASP文件的PUT和DELETE操作,默认会返回“403 - Forbidden”错误,因此需要修改IIS的设置,修改方法是:管理根据-IIS信息服务器-网站-属性-主目录-应用程序配置-配置-映射,选择ASP - 编辑 - 修改为全部动作。
关于更多关于REST方面的知识,建议阅读《RESTful Web Services》这本书。
===============
RESTful API对我并不是一个全新的像是突然蹦出来的词汇,我印象中工作上出现过好几次,但是每次我都没有真正理解这个东西。我不知道什么样的接口类型可以称得上是一种RESTful API,不知道RESTful API好在哪儿?那么今天这篇文章就是用来解决我的这些困惑的。要声明的是我只会站在前端使用者的角度来说说RESTful API看起来的样子,至于后端如何实现RESTful API接口的事我则不会涉及。
先从Web Service说起。Service就是提供可利用的资源,那么再加上Web这张网就可以对资源利用得到极大延伸,不在局限于你的本地或四邻。这时就应运而生一种信息交换协议——SOAP(简单对象访问协议,Simple Object Access Protocol)。SOAP有着严格的协议,内容至今也基本齐全,然而随着时间的推进,它的弊端也逐渐暴露出来。SOAP消息基于很老的XML格式,显得厚重,同时支持多种传输协议如HTTP、TCP/UDP等等,其内容涉及封装以及状态维持等等,总而言之,言而总之,就是它的复杂程度已经违背了起初设计Web Service的简明原则了,所以在2000年Roy Thomas Fielding提出了REST(Representational State Transfer)架构。算是打响改善的第一枪。如果一个架构符合REST原则,就称它为RESTful架构。
通过对比SOAP和RESTful API的不同点,大致可以让我们了解到RESTful API的样子。
首先SOAP是一种严格的协议,而REST却并非协议,而是一种指导原则。而我个人认为它们最大的不同点在于SOAP是基于事务,而RESTful API是基于资源,然后利用HTTP的方法(GET、POST、PUT、DELETE)来表征行为。
一个SOAP接口可能如下:
GET http://www.example.com/getBook
POST http://www.example.com/addBook
POST http://www.example.com/updateBook
POST http://www.example.com/deleteBook
而对应的RESTful接口可能如下:
GET http://www.example.com/book
POST http://www.example.com/book
PUT http://www.example.com/book
DELETE http://www.example.com/book
以上接口的作用依次为获取书籍、添加书籍、更新书籍、删除书籍,你会发现SOAP提供的接口基本是以动词加名词结尾,是基于做什么事的,而RESTful风格的接口则是名词结尾,把服务看成资源,然后完全利用HTTP的请求方法来做行为判断。SOAP接口返回XML格式,而RESTful API没有明确应答的格式要求。因为RESTful API只针对HTTP使用设计,所以他能更好的适用于浏览器,以及js的httpRequest请求。
RESTful API轻便的一个原因就是它是无状态的,所以它可以做缓存处理,增进性能,然而这也成为了它的一个短板。其实现在很多Web Service都不是随便可以滥用的,都需要身份验证,权限设置。如果把身份信息放在HTTP head里面,如何保证身份不被伪造?那么在这种情况下RESTful API就无法适用了,反而SOAP可以很好的适应。REST也在不断的完善,也许有一天他也可以做到状态维持,那么是否表明它也成了另一个SOAP呢?所以没有什么东西是十全十美的,但是却有单一场景下十全十美的东西。
不管怎么说,RESTful API已经流传深远,对SOAP产生了巨大冲击。以上只是个人简单片面的理解,如果要想求真知,还望大家自行查阅资料,涨姿势。