使用Ajax調用SOAPWeb服務_第1頁
使用Ajax調用SOAPWeb服務_第2頁
使用Ajax調用SOAPWeb服務_第3頁
使用Ajax調用SOAPWeb服務_第4頁
使用Ajax調用SOAPWeb服務_第5頁
已閱讀5頁,還剩15頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、Ajax 已普遍用于許多知名的 Web 應用程序服務,例如 GMail、Google Maps、Flickr 和 O。通過使用異步 XML 消息傳遞,Ajax 為 Web 開發人員提供了一種擴展其 Web 應用程序價值和功能的途徑。這里介紹的 Web Services JavaScript Library 擴展了該基礎機制,其通過引入對調用基于 SOAP 的 Web 服務的支持來增強 Ajax 設計模式。從瀏覽器中調用 Web 服務請訪問 Ajax 技術資源中心,這是有關 Ajax 編程模型信息的一站式中心,包括很多文檔、教程、論壇、blog、wiki 和新聞。任何新信息都能在這里找到。從 W

2、eb 瀏覽器中調用 SOAP Web 服務可能會比較麻煩,這是因為大多數流行的 Web 瀏覽器在生成和處理 XML 方面都略有不同。所有瀏覽器都一致實現且用于 XML 處理的標準 API 或功能少之又少。瀏覽器實現人員一致支持的機制之一是 XMLHttpRequest API,它是 Ajax 設計模式的核心。developerWorks 網站最近發布的另一篇由 Philip McCarthy 撰寫的的文章詳細介紹了該 API。XMLHttpRequest 是一個用于執行異步 HTTP 請求的 JavaScript 對象。Philip McCarthy 在其文章中描述了一個順序圖(請參見圖 1)

3、,此圖對于理解 XMLHttpRequest 對象如何支持 Ajax 設計非常有幫助(請參閱參考資料,以獲得指向全文的鏈接)。圖 1. Philip McCarthy 的 Ajax 順序圖從此圖中,您可以清楚地看到 XMLHttpRequest 對象是如何工作的。一些運行在 Web 瀏覽器內的 JavaScript 創建了一個 XMLHttpRequest 實例和一個用于異步回調的函數。然后,該腳本使用 XMLHttpRequest 對象對服務器執行 HTTP 操作。在接收到響應后,調用回調函數。在該回調函數內,可能處理返回的數據。如果返回的數據碰巧是 XML,則 XMLHttpRequest

4、 對象將自動使用瀏覽器中內置的 XML 處理機制來解析該數據。遺憾的是,使用 Ajax 方法的主要難題在于 XMLHttpRequest 對象自動解析 XML 的詳細過程。例如,假設我正在請求的數據是一個 SOAP 信封,其包含來自許多不同 XML 命名空間的元素,并且我希望提取 yetAnotherElement 中屬性 attr 的值。(請參見清單 1)清單 1. 一個包含多個命名空間的 SOAP 信封 在 Mozilla 瀏覽器和 Firefox 瀏覽器中,提取 attr 屬性值非常簡單,如清單 2所示。清單 2. 在 Mozilla 和 Firefox 中檢索 attr 屬性值的方法不

5、能運用在 Internet Explorer 中var m = el.getElementsByTagNameNS( urn:example, yetAnotherElement)0. getAttributeNS( urn:foo, attr);alert(m); / displays abc關于安全性由于涉及許多實際安全問題,因此在缺省情況下,大多數 Web 瀏覽器中的 XMLHttpRequest 對象都限制為只能與用戶正在查看的 Web 頁所在的域中承載的資源和服務進行交互。例如,如果我正在訪問一個位于 /myapp/ 的頁面,則 XMLHttpRequest 將只允許訪問位于 域中的

6、資源。對于阻止惡意應用程序代碼潛在地對其不應該訪問的信息進行不適當的訪問,這種預防措施非常必要。因為這里介紹的 Web 服務客戶機基于 XMLHttpRequest,所以這種限制同樣適用于您將會調用的 Web 服務。如果您需要能夠訪問位于另一個域中的 Web 服務,您可以使用以下兩種合理的解決方案:對 JavaScript 進行數字簽名。通過對 JavaScript 腳本進行數字簽名,您就告訴了 Web 瀏覽器可以信任該腳本不會執行任何惡意的活動,并且對 XMLHttpRequest 可以訪問的數據的限制也應該取消。 使用代理。一個簡單的解決方案是,通過位于加載的頁面所在的域中的代理資源來傳遞

7、所有來自 XMLHttpRequest 的請求。該代理將 XMLHttpRequest 的請求轉發到遠程位置,并將結果返回給瀏覽器。從 XMLHttpRequest 對象的角度來看,這種交互發生在現有的安全配置之內。 遺憾的是,以上代碼無法在 Internet Explorer Version 6 中運行,因為該瀏覽器不僅沒有實現 getElementsByTagNameNS 功能,而且事實上還使用了一種很糟糕的方法將 XML 命名空間的前綴作為其元素和屬性名稱的一部分來對待。Internet Explorer 缺少對 XML 命名空間的支持,這使得它很難處理命名空間密集的 XML 格式,例如

8、采用獨立于瀏覽器的方式的 SOAP。即使要執行一些像提取結果中的屬性值這樣簡單的操作,您也必須編寫能夠在多個瀏覽器中實現一致預期行為的特殊代碼。幸運的是,這種特殊代碼可以封裝并重用。為了從 Web 瀏覽器中調用 Web 服務,并可靠地處理 SOAP 消息,您需要首先了解一些安全問題(請參見側欄“關于安全性”)。此外,您還需要編寫一個 JavaScript 腳本庫(圖 2),以便將底層瀏覽器 XML 實現中的不一致情況抽象出來,從而使您能夠直接處理 Web 服務數據。圖 2. 在使用 Web Services JavaScript Library 的 Web 瀏覽器中通過 Javascript

9、調用 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 Enve

10、lope 對象擴展了 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 響應。WS.Call 對象公開了以下三個方法:add_handler。向處理鏈添加請求/響應處理程序。處理程序對象在調用 Web 服務的前后被調用,以支持可擴展的預調用處理

11、和后調用處理。 invoke。將指定的 SOAP.Envelope 對象發送給 Web 服務,然后在接收到響應后調用回調函數。當調用使用文本 XML 編碼的文檔樣式的 Web 服務時,請使用此方法。 invoke_rpc。創建一個封裝 RPC 樣式請求的 SOAP.Envelope,并將其發送到 Web 服務。當接收到響應時,調用回調函數。 在通常情況下,WS.Call 對象只不過是位于 XMLHttpRequest 對象頂層的瘦包裝器 (thin wrapper),該包裝器能夠執行許多簡化處理的操作。這些操作包括設置 SOAP 1.1 規范要求的 SOAPAction HTTP Header

12、。使用 ws.jsWeb services JavaScript Library 提供的 API 非常簡單。SOAP.* 對象(SOAP.Element、SOAP.Envelope、SOAP.Header 和 SOAP.Body)提供了構建和讀取 SOAP 信封的方法,如清單 3所示,因而處理 XML 文檔對象模型的底層細節就順利地抽象出來。清單 3. 構建一個 SOAP 信封var envelope = new SOAP.Envelope();var body = envelope.create_body();var el = body.create_child(new WS.QName(m

13、ethod,urn:foo);el.create_child(new WS.QName(param,urn:foo).set_value(bar);清單 4顯示了由 清單 3中的代碼生成的 SOAP 信封。清單 4. 構建一個 SOAP 信封 bar 如果您正在創建的 SOAP 信封代表一個 RPC 樣式的請求,則 SOAP.Body 元素提供了一個簡便方法 set_rpc(如清單 5所示),該方法能夠構造一個完整的 RPC 請求包含一個指定的操作名稱、一個指定的輸入參數數組和一個 SOAP 編碼樣式的 URI。清單 5. 構建一個 RPC 請求信封var envelope = new SOA

14、P.Envelope();var body = envelope.create_body();body.set_rpc( new WS.QName(param,urn:foo), new Array( name:param,value:bar ), SOAP.NOENCODING);每個參數都作為一個 JavaScript 對象結構進行傳遞,且可能帶有以下屬性:name。一個指定參數名稱的字符串或 WS.QName 對象。必需。 value。參數的值。如果該值不是一個簡單數據類型(例如,字符串、整數或其他),則應該指定一個能將該值序列化為適當的 XML 結構的 WS.Binder。必需。 xs

15、itype:標識參數的 XML 模式實例類型的 WS.QName(例如,xsi:type=int 對應 xsitype:new WS.QName(int,/2000/10/XMLSchema))。可選。 encodingstyle:標識參數所使用的 SOAP 編碼樣式的 URI。可選。 binder:能夠將參數序列化為 XML 的 WS.Binder 實現。可選。 例如,如果要指定的參數名為“abc”、XML 命名空間為“urn:foo”、xsi:type 為“int”且值為“3”,則我會使用以下代碼:new Array(name:new WS.QName(abc,urn:foo), valu

16、e:3, xsitype:new WS.QName(int,/2000/10/XMLSchema)。一旦我為服務請求構建了 SOAP.Envelope,我就會將該 SOAP.Envelope 傳遞到 WS.Call 對象的 invoke 方法,以便調用該信封內編碼的方法: (new WS.Call(service_uri).invoke(envelope, callback)另一種可選方案是手動構建 SOAP.Envelope。我會將參數 WS.QName、參數數組和編碼樣式傳遞到 WS.Call 對象的 invoke_rpc 方法,如清單 6所示。清單 6. 使用 WS.Call 對象調用

17、Web 服務var call = new WS.Call(serviceURI); var nsuri = urn:foo;var qn_op = new WS.QName(method,nsuri);var qn_op_resp = new WS.QName(methodResponse,nsuri); call.invoke_rpc( qn_op, new Array( name:param,value:bar ),SOAP.NOENCODING, function(call,envelope) / envelope is the response SOAP.Envelope / the

18、XML Text of the response is in arguments2 );在調用 invoke 方法或 invoke_rpc 方法時,WS.Call 對象會創建一個基本的 XMLHttpRequest 對象,用包含 SOAP 信封的 XML 元素進行傳遞,并接收和解析響應,然后調用提供的回調函數。為了能夠擴展 SOAP 消息的預處理和后處理,WS.Call 對象允許您注冊一組 WS.Handler 對象,如清單 7所示。對于調用周期內的每個請求、每個響應和每個錯誤,都將調用這些對象。可以通過擴展 WS.Handler JavaScript 對象來實現新的處理程序。清單 7. 創建

19、和注冊響應/響應處理程序var MyHandler = Class.create();MyHtotype = (new WS.Handler().extend( on_request : function(envelope) / pre-request processing , on_response : function(call,envelope) / post-response, pre-callback processing , on_error : function(call,envelope) );var call = new WS.Call(.);call.add_handler

20、(new MyHandler();處理程序對插入或提取正在傳遞的 SOAP 信封中的信息最有用。例如,您可以設想一個處理程序自動向 SOAP Envelope 的 Header 插入適當的 Web 服務尋址 (Web Services Addressing) 元素,如清單 8中的示例所示。清單 8. 一個將 Web 服務尋址操作 Header 添加到請求中的處理程序示例var WSAddressingHandler = Class.create();WSAddressingHtotype = (new WS.Handler().extend( on_request : function(cal

21、l,envelope) envelope.create_header().create_child( new WS.QName(Action,http:/ws-addressing,wsa) ).set_value(); );WS.Binder 對象(清單 9)執行 SOAP.Element 對象的自定義序列化和反序列化。WS.Binder 的實現必須提供以下兩個方法:to_soap_element。將 JavaScript 對象序列化為 SOAP.Element。傳入的第一個參數是要序列化的值。第二個參數是 SOAP.Element,必須將要序列化的值序列化為 SOAP.Element。該方

22、法不返回任何值。 to_value_object。將 SOAP.Element 反序列化為 JavaScript 對象。該方法必須返回反序列化的值對象。 清單 9. WS.Binding 實現示例var MyBinding = Class.create();MyBtotype = (new WS.Binding().extend( to_soap_element : function(value,element) . , to_value_object : function(element) . );一個簡單示例我已經提供了一個示例項目來闡釋 Web Services JavaScript L

23、ibrary 的基本功能。該演示所使用的 Web 服務(如清單 10所示)已經在 WebSphere Application Server 中進行了實現,并提供了簡單的 Hello World 功能。清單 10. 一個簡單的基于 Java 的“Hello World”Web 服務package example;public class HelloWorld public String sayHello(String name) return Hello + name; 在實現了該服務并將其部署到 WebSphere Application Server 后,該服務(清單 11)的 WSDL 描

24、述定義了您需要傳遞的 SOAP 消息(用于調用 Hello World 服務)。清單 11. HelloWorld.wsdl 的代碼片段 通過使用 Web Services JavaScript Library,您可以實現一個調用 Hello World 服務的方法,如清單 12所示。清單 12. 使用 WS.Call 調用 HelloWorld 服務.function sayHello(name, container) var call = new WS.Call(/AjaxWS/services/HelloWorld); var nsuri = http:/example; var qn_

25、op = new WS.QName(sayHello,nsuri); var qn_op_resp = new WS.QName(sayHelloResponse,nsuri); call.invoke_rpc( qn_op, new Array( name:name,value:name ),null, function(call,envelope) var ret = envelope.get_body().get_all_children()0. get_all_children()0.get_value(); container.innerHTML = ret; $(soap).inn

26、erHTML = arguments2.escapeHTML(); );.然后,您可以在我們的 Web 應用程序中的任意位置通過調用 sayHello 函數來調用 Hello World 服務。請參見清單13。清單 13. 調用 sayHello 函數Result:調用成功后的結果如圖 3所示。在 Mozilla、Firefox 和 Internet Explorer 中運行該示例應該會得到相同的結果。圖 3. Firefox 中的 Hello World 示例后續部分使用 Web Services JavaScript Library,可以采用簡單的獨立于瀏覽器的方式將基本的 SOAP We

27、b 服務合并到 Web 應用程序中。在本系列的下一個部分中,您不僅可以探討如何使用該庫來調用更多基于 Web 服務資源框架 (WS-Resource Framework ) 系列規范的高級 Web 服務,而且還可以了解擴展該 Web 服務功能并將其集成到 Web 應用程序中的方法。下載描述名字大小下載方法Sample projectws-wsajaxcode.zip19 KB HYPERLINK /ibmdl/pub/software/dw/library/ws-wsajaxcode.zip HTTP HYPERLINK /developerworks/cn/whichmethod.html 關

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論