先前我曾經(jīng)介紹過(guò)利用Apache Axis實(shí)現基于SOAP的Web Service實(shí)現技術(shù)和相關(guān)代碼,總的來(lái)說(shuō),SOAP的WebService解決方案雖然較為成熟,且安全性較好,但是使用門(mén)檻較高,在大并發(fā)情況下會(huì )有性能問(wèn)題,在互聯(lián)網(wǎng)上使用不太普及,因此并不太適合Web2.0網(wǎng)站服務(wù)使用,目前大量的Web 2.0網(wǎng)站使用另外一種解決方案——REST。
REST的架構設計
REST(Representational State Transfer)是一種輕量級的WebService架構風(fēng)格,其實(shí)現和操作明顯比SOAP和XML-RPC更為簡(jiǎn)潔,可以完全通過(guò)HTTP協(xié)議實(shí)現,還可以利用緩存Cache來(lái)提高響應速度,性能、效率和易用性上都優(yōu)于SOAP協(xié)議。
REST架構遵循了CRUD原則,CRUD原則對于資源只需要四種行為:Create(創(chuàng )建)、Read(讀?。?、Update(更新)和Delete(刪除)就可以完成對其操作和處理。這四個(gè)操作是一種原子操作,即一種無(wú)法再分的操作,通過(guò)它們可以構造復雜的操作過(guò)程,正如數學(xué)上四則運算是數字的最基本的運算一樣。
REST架構讓人們真正理解我們的網(wǎng)絡(luò )協(xié)議HTTP本來(lái)面貌,對資源的操作包括獲取、創(chuàng )建、修改和刪除資源的操作正好對應HTTP協(xié)議提供的GET、POST、PUT和DELETE方法,因此REST把HTTP對一個(gè)URL資源的操作限制在GET、POST、PUT和DELETE這四個(gè)之內。這種針對網(wǎng)絡(luò )應用的設計和開(kāi)發(fā)方式,可以降低開(kāi)發(fā)的復雜性,提高系統的可伸縮性。
REST的設計準則
REST架構是針對Web應用而設計的,其目的是為了降低開(kāi)發(fā)的復雜性,提高系統的可伸縮性。REST提出了如下設計準則:
網(wǎng)絡(luò )上的所有事物都被抽象為資源(resource);
每個(gè)資源對應一個(gè)唯一的資源標識符(resource identifier);
通過(guò)通用的連接器接口(generic connector interface)對資源進(jìn)行操作;
對資源的各種操作不會(huì )改變資源標識符;
所有的操作都是無(wú)狀態(tài)的(stateless)。
使用REST架構
對于開(kāi)發(fā)人員來(lái)說(shuō),關(guān)心的是如何使用REST架構,這里我們來(lái)簡(jiǎn)單談?wù)勥@個(gè)問(wèn)題。REST不僅僅是一種嶄新的架構,它帶來(lái)的更是一種全新的Web開(kāi)發(fā)過(guò)程中的思維方式:通過(guò)URL來(lái)設計系統結構。REST是一套簡(jiǎn)單的設計原則、一種架構風(fēng)格(或模式),不是一種具體的標準或架構。REST有很多成功的使用案例,著(zhù)名的Delicious和Flickr都提供基于REST風(fēng)格的API使用,客戶(hù)端調用也極其方便,下面是我用ASP寫(xiě)的一個(gè)很簡(jiǎn)單的REST舉例,從中可以看出REST是多么的簡(jiǎn)單易用。
客戶(hù)端代碼:
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")
服務(wù)端代碼:
需要注意的是,IIS服務(wù)器默認是不支持ASP文件的PUT和DELETE操作,默認會(huì )返回“403 -Forbidden”錯誤,因此需要修改IIS的設置,修改方法是:管理根據-IIS信息服務(wù)器-網(wǎng)站-屬性-主目錄-應用程序配置-配置-映射,選擇ASP - 編輯 - 修改為全部動(dòng)作。
關(guān)于更多關(guān)于REST方面的知識,建議閱讀《RESTful Web Services》這本書(shū)。
聯(lián)系客服