DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> JavaScript入門知識 >> AJAX入門 >> AJAX詳解 >> 用AJAX調用SOAP Web服務:構建Web服務客戶機(1)
用AJAX調用SOAP Web服務:構建Web服務客戶機(1)
編輯:AJAX詳解     

本文介紹如何使用異步 Javascript 和 XML (Asynchronous JavaScript and XML, AJax) 設計模式來實現基於 Web 浏覽器的 SOAP Web 服務客戶機。


AJax 已普遍用於許多知名的 Web 應用程序服務,例如 GMail、Google Maps、Flickr 和 Odeo.com。通過使用異步 XML 消息傳遞,AJax 為 Web 開發人員提供了一種擴展其 Web 應用程序價值和功能的途徑。這裡介紹的 Web Services JavaScript Library 擴展了該基礎機制,其通過引入對調用基於 SOAP 的 Web 服務的支持來增強 AJax 設計模式。

從浏覽器中調用 Web 服務

從 Web 浏覽器中調用 SOAP Web 服務可能會比較麻煩,這是因為大多數流行的 Web 浏覽器在生成和處理 XML 方面都略有不同。所有浏覽器都一致實現且用於 XML 處理的標准 API 或功能少之又少。

浏覽器實現人員一致支持的機制之一是 XMLHttpRequest API,它是 AJax 設計模式的核心。developerWorks 網站最近發布的另一篇由 Philip McCarthy 撰寫的的文章詳細介紹了該 API。XMLHttpRequest 是一個用於執行異步 HTTP 請求的 JavaScript 對象。Philip McCarthy 在其文章中描述了一個順序圖(請參見圖 1),此圖對於理解 XMLHttpRequest 對象如何支持 AJax 設計非常有幫助(請參閱參考資料,以獲得指向全文的鏈接)。

圖 1. Philip McCarthy 的 AJax 順序圖

從此圖中,您可以清楚地看到 XMLHttpRequest 對象是如何工作的。一些運行在 Web 浏覽器內的 JavaScript 創建了一個 XMLHttpRequest 實例和一個用於異步回調的函數。然後,該腳本使用 XMLHttpRequest 對象對服務器執行 HTTP 操作。在接收到響應後,調用回調函數。在該回調函數內,可能處理返回的數據。如果返回的數據碰巧是 XML,則 XMLHttpRequest 對象將自動使用浏覽器中內置的 XML 處理機制來解析該數據。

遺憾的是,使用 AJax 方法的主要難題在於 XMLHttpRequest 對象自動解析 XML 的詳細過程。例如,假設我正在請求的數據是一個 SOAP 信封,其包含來自許多不同 XML 命名空間的元素,並且我希望提取 yetAnotherElement 中屬性 attr 的值。(請參見清單 1)

清單 1. 一個包含多個命名空間的 SOAP 信封


xmlns:s="http://schemas.XMLsoap.org/soap/envelope/"

xmlns:xsd="http://www.w3.org/2001/XMLSchema"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">








XMLns:n="http://example"

XMLns:m="urn:example">


n:attr="abc"

XMLns:n="urn:foo"/>







在 Mozilla 浏覽器和 Firefox 浏覽器中,提取 attr 屬性值非常簡單,如清單 2所示。

清單 2. 在 Mozilla 和 Firefox 中檢索 attr 屬性值的方法不能運用在 Internet Explorer 中

var m = el.getElementsByTagNameNS(

'urn:example',

'yetAnotherElement')[0].

getAttributeNS(

'urn:foo',

'attr')

alert(m); // displays 'abc'

關於安全性

由於涉及許多實際安全問題,因此在缺省情況下,大多數 Web 浏覽器中的 XMLHttpRequest 對象都限制為只能與用戶正在查看的 Web 頁所在的域中承載的資源和服務進行交互。例如,如果我正在訪問一個位於 http://example.com/myapp/ 的頁面,則 XMLHttpRequest 將只允許訪問位於 example.com 域中的資源。對於阻止惡意應用程序代碼潛在地對其不應該訪問的信息進行不適當的訪問,這種預防措施非常必要。因為這裡介紹的 Web 服務客戶機基於 XMLHttpRequest,所以這種限制同樣適用於您將會調用的 Web 服務。

如果您需要能夠訪問位於另一個域中的 Web 服務,您可以使用以下兩種合理的解決方案:

對 Javascript 進行數字簽名。通過對 JavaScript 腳本進行數字簽名,您就告訴了 Web 浏覽器可以信任該腳本不會執行任何惡意的活動,並且對 XMLHttpRequest 可以訪問的數據的限制也應該取消。
使用代理。一個簡單的解決方案是,通過位於加載的頁面所在的域中的代理資源來傳遞所有來自 XMLHttpRequest 的請求。該代理將 XMLHttpRequest 的請求轉發到遠程位置,並將結果返回給浏覽器。從 XMLHttpRequest 對象的角度來看,這種交互發生在現有的安全配置之內。
遺憾的是,以上代碼無法在 Internet Explorer Version 6 中運行,因為該浏覽器不僅沒有實現 getElementsByTagNameNS 功能,而且事實上還使用了一種很糟糕的方法——將 XML 命名空間的前綴作為其元素和屬性名稱的一部分來對待。

Internet Explorer 缺少對 XML 命名空間的支持,這使得它很難處理命名空間密集的 XML 格式,例如采用獨立於浏覽器的方式的 SOAP。即使要執行一些像提取結果中的屬性值這樣簡單的操作,您也必須編寫能夠在多個浏覽器中實現一致預期行為的特殊代碼。幸運的是,這種特殊代碼可以封裝並重用。

為了從 Web 浏覽器中調用 Web 服務,並可靠地處理 SOAP 消息,您需要首先了解一些安全問題(請參見側欄“關於安全性”)。此外,您還需要編寫一個 JavaScript 腳本庫(圖 2),以便將底層浏覽器 XML 實現中的不一致情況抽象出來,從而使您能夠直接處理 Web 服務數據。

圖 2. 在使用 Web Services Javascript Library 的 Web 浏覽器中通過 Javascript 調用 Web 服務

圖 2 中的 Web Services Javascript Library (ws.JS) 是一組 JavaScript 對象和實用功能,它們為基於 SOAP 1.1 的 Web 服務提供了基本的支持。Ws.JS 定義了下列對象:

•WS.Call:一個包裝了 XMLHttpRequest 的 Web 服務客戶機

•WS.QName:XML 限定名實現

•WS.Binder:自定義 XML 序列化器/反序列化器的基礎

•WS.Handler:請求/響應處理程序的基礎

•SOAP.Element:包裝了 XML DOM 的基本 SOAP 元素

•SOAP.Envelope:SOAP Envelope 對象擴展了 SOAP.Element

•SOAP.Header:SOAP Header 對象擴展了 SOAP.Element

•SOAP.Body:SOAP Body 對象擴展了 SOAP.Element

•XML:用於處理 XML 的跨平台實用方法

ws.JS 的核心是 WS.Call 對象,該對象提供了調用 Web 服務的方法。WS.Call 主要負責與 XMLHttpRequest 對象進行交互,並處理 SOAP 響應。

XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved