摘要:Web Service是一種基于標準的應用集成方式,允許不同的客戶端使用它提供的服務。本文介紹通過Ajax使用異步消息傳遞,SOAP協議作為Web服務通信協議的基礎,實現Web Servcie架構的應用程序的開發。
關鍵詞:Web Service;Ajax;SOAP協議
中圖分類號:TP393文獻標識碼:A文章編號:1009-3044(2008)11-20341-02
1 前言
Web Service主要是為了使原來各孤立的站點之間的信息能夠相互通信、共享而提出的一種接口。Web Service所使用的是Internet上統一、開放的標準,如HTTP、XML、SOAP、WSDL等,所以Web Service可以在任何支持這些標準的環境(Windows、Linux)中使用。Web Service技術的不斷成熟,使得面向服務的架構(SOA)思想得到了很好的應用。
Ajax引擎實現無需頁面無刷新等待的情況下,進行與服務器之間的數據通信,使用它可以構建更為動態和響應更靈敏的Web應用程序。基于SOAP協議,通過Ajax調用Web服務,實現異構程序和平臺無關的數據通信。
2 關鍵技術
2.1 Ajax
在Ajax之前,WEB站點強制用戶進行提交、等待、重新加載的模式,用戶的動作和服務器的反應同步,Ajax提供與服務器異步通信的能力。通過Ajax用戶通過JavaScript和DHTML向服務器發出異步請求,執行更新或查詢數據,當請求返回時來更新UI,而不是刷新整個頁面,降低了與服務器之間通信的數據量,加快了用戶請求的反應時間。
在WEB瀏覽器使用SOAP服務比較困難,大多數流行的WEB瀏覽器在生成和處理XML方面會有不同,支持XML處理的API比較少。比較常見的方法是通過XMLHttpRequest API,XMLHttpRequest是一個用于執行異步HTTP請求的JavaScript對象。AJAX框架的關鍵是名為XMLHttpRequest的JavaScript對象,通過它客戶端開發人員可以在不打斷用戶操作或者在充分使用隱藏表單的情況下通過HTTP直接發送和接收XML文檔。現在常用的瀏覽器(IE, Mozilla, Safari, Opera)都特別提供了對XMLHttpRequest對象的支持,同時也廣泛支持XML DOM。
2.2 SOAP
目前有很多應用程序通過使用遠程過程調用(RPC)在諸如 DCOM 與 CORBA 等對象之間進行通信,但是,RPC會產生兼容性以及安全問題;防火墻和代理服務器通常會阻止此類流量。通過HTTP在應用程序間通信的就是更好的方法,因為HTTP被所有的因特網瀏覽器及服務器支持。SOAP(Simple Object Access Protocal,簡單對象訪問協議)可以完成這個任務的。SOAP提供了一種標準的方法,使得運行在不同的操作系統并使用不同的技術和編程語言的應用程序可以互相進行通信。SOAP技術用于實現異構程序和平臺間的數據交換,從而能夠使應用能被廣泛地訪問。SOAP是將基于HTTP的WEB技術與XML的靈活性和可擴展性組合在一起。
SOAP消息處理框架定義了一套XML元素,封裝XML消息以便在系統中間進行傳輸。該框架包含的核心XML元素有Envelope,Header,Body和Fault,目前常見SOAP消息有1.1和1.2兩個版本。Envelope是SOAP消息的根元素。Envelope元素包含一個可選的Header元素,一個必須的Body元素,Body元素包含所以的調用和響應信息。Fault元素提供處理此消息發生的錯誤。HTTP協議綁定定義了在HTTP上使用SOAP的規則。SOAP請求、響應映射到HTTP協議請求、響應模型。對于SOAP消息使用POST方式進行請求,SOAPAction表示該消息的意圖。
3 WEB Service架構
實現通過頁面異步調用目標服務器的一個Web服務,所用開發環境是Visual studio2005。首先創建ASP.NET Web服務,提供實現兩個整數相加的服務。繼承WebService實現MyService類,在WebService繼承類中可以提供Web方法和非Web方法,在方法前標注[WebMethod],表示該方法是一個Web方法,Add方法就是一個Web方法。示例代碼:
[WebService(Namespace = \"http://myweb.org/\")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class MyService : System.Web.Services.WebService{
[WebMethod]
public int Add(int i ,int j) {
return i + j;
}
}
然后在Web頁面中添加SOAP消息的請求,這里通過Ajax進行發送請求SOAP消息,由于XMLHttpRequest不是一個W3C標準,所以可以采用多種方法使用JavaScript來創建XMLHttpRequest的實例。Internet Explorer把XMLHttpRequest實現為一個ActiveX對象,其他瀏覽器(如Firefox、Safari和Opera)把它實現為一個本地JavaScript對象。示例代碼:
function getXmlHttpRequestObject() {
if (window.XMLHttpRequest) {
return new XMLHttpRequest(); //Not IE
} else if(window.ActiveXObject) {
return new ActiveXObject(\"Microsoft.XMLHTTP\"); //IE
} else {
alert(\"not supported\");
}
}
接著將SOAP消息發送,XMLHttpRequest的readyState屬性返回當前請求的狀態,0表示未初始化,4表示上次數據接受完畢,這兩個狀態下都可以開始一個新的請求。然后通過open方法創建一個新的Http請求,并指定此請求的方法。通過onreadystatechange設置readyState屬性改變時的事件處理句柄。示例代碼:
function sendRequest(){
if (receiveReq.readyState == 4 || receiveReq.readyState == 0) {
receiveReq.open(\"POST\", \"MyService.asmx\", true);
//SOAP1.1
receiveReq.setRequestHeader (\"Content-Type\",\"text/xml; charset=utf-8\")
receiveReq.setRequestHeader (\"SOAPAction\", \"http://myweb.org/Add\") ;
var msg=\"<?xml version=\\\"1.0\\\" encoding=\\\"utf-8\\\"?>\"
+\"<soap:Envelope xmlns:xsi=\\\"http://www.w3.org/2001/XMLSchema-instance\\\"
+\" xmlns:xsd=\\\"http://www.w3.org/2001/XMLSchema\\\"
+\" xmlns:soap=\\\"http://schemas.xmlsoap.org/soap/envelope/\\\">\"
+\" <soap:Body>\"
+\"<Add xmlns=\\\"http://myweb.org/\\\">\"
+\"<i>1</i>\"
+\"<j>2</j>\"
+\"</Add>\"
+\" </soap:Body>\"
+\"</soap:Envelope>\"
receiveReq.onreadystatechange = handleAdd;
receiveReq.send(msg);}
}
示例代碼中,setRequestHeader設置http封裝格式,變量msg的內容就是SOAP1.1格式的消息請求,進行兩個整數i和j的相加請求。將onreadystatechange設置為函數handleAdd,進行SOAP消息響應的處理。
最后是對SOAP消息響應的處理,readyState屬性為4表示接受完畢,根據http請求狀態status為200表示http響應成功,返回如果是字符串可以通過responseText屬性獲取,如果是xml文件可以通過responseXML屬性獲取。示例代碼:
function handleAdd() {
if (receiveReq.readyState == 4) {
if (receiveReq.status==200){
// 對receiveReq的響應responseXML或responseText進行處理
} else {
alert(\"status:\" + receiveReq.statusText);
}
}
}
4 結束語
本文中,介紹了基于SOAP協議架構WEB Service的步驟,但是這個過程沒有提供安全性解決方案。對于一個真正安全的WEB Service來說,證書、密鑰和加密同樣是必不可少的。最健壯的WEB Service安全性源于實現了使用來自認證機構的私鑰、公鑰進行身份驗證的加密消息傳遞。XML加密允許web服務用戶發送保留XML格式的加密SOAP消息。
參考文獻:
[1] W3C. SOAP:Simple Object Access Protocol Specification1.1 .2000.
[2] Nicholas C Zakas, Jeremy McPeak, Joe Fawcett. Professional Ajax .Wiley Publications, 2006.
[3] Christian Gross. Ajax Patterns and Best Practices[M]. Apress L P, 2006.
[4] 王東,孫彬. 基于Ajax的MVC框架的改造分析[J]. 計算機應用, 2007,(S1):293-295.
[5] 程亞娟, 趙政. XML數據存取技術[J]. 微型機與應用, 2002,(01):59-60.
[6] 張環宇,張建文. 基于AJAX技術的Web應用架構分析. 電腦知識與技術,2007,(15):745-746.
注:本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文