用AJAX調用SOAP Web服務:構建Web服務客戶機(1)

來源:互聯網
上載者:User
ajax|web|web服務|客戶機

本文介紹如何使用非同步 JavaScript 和 XML (Asynchronous JavaScript and XML, AJAX) 設計模式來實現基於 網頁瀏覽器的 SOAP Web 服務客戶機。


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

從瀏覽器中調用 Web 服務

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

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

圖 1. Philip McCarthy 的 AJAX 順序圖

從此圖中,您可以清楚地看到 XMLHttpRequest 對象是如何工作的。一些運行在 網頁瀏覽器內的 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'

關於安全性

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

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

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

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

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

圖 2. 在使用 Web Services JavaScript Library 的 網頁瀏覽器中通過 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 響應。



相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.