曝光臺 注意防騙
網曝天貓店富美金盛家居專營店坑蒙拐騙欺詐消費者
S O A P,并且它們都能夠使用帶有“ t e x t / x m l”內容類型的動詞P O S T。防火墻通過迫使
SOAP使用強制性方法以至WebDAV請求被完全阻止。
S O A P的0 . 9版本使用“t e x t / x m l - S O A P”內容類型來解決這個混淆,但是這已經很少提及。
第11章服服務器到服務器使用477 下載
作為一個有用的分辨器,我認為它將成為最終正確的選擇,因為對內容類型的提出并不
是隨意的。0 . 9版本也有另一個解決方案,它對S O A P請求報頭進行限制。它可能成為一個
對X M L - R P C愛好者的讓步。即允許一個S O A P請求與一個簡單的P O S T一樣,在起始部分
什么也沒有。但是如我所說,這將無法分辨一個請求是否為SOAP請求。
11.4.2 實現
我們將關注S O A P實現中較X M L - R P C的高明之處。現在,不再孤立地定義S O A P規范,將逐
步建立了一個S O A P客戶和服務器。在這個過程中,將介紹該標準中的一些關鍵點。
這一節的代碼包括在網上本書的可下載代碼部分。
模塊結構
有兩個我們必需建立的模塊—一個用于客戶系統,另一個用于服務器系統。因為有某些
函數同時在客戶和服務器上執行—例如建立有效載荷—那么我們也需要創建一個普通處理
模塊。
(1) 客戶模塊
我們將從顯示一個調用的代碼開始。盡管遠程調用的思想是在另一個服務器上執行一個函
數,我們仍希望盡可能地像一個正常的功能調用那樣實現遠程調用。例如,一個用來在數據庫
里得到第一個作者的名字本地調用可能有如下形式:
程序清單11 - 9 5
那么我們希望遠程調用有如下的形式:
如果你使用某種語言如C或者C + +(請參見本章后面部分的C + +實現例子)來實現S O A P客戶
和服務器,那么將很容易通過參數數量的變化來處理調用。但是,我們將演示用A S P來建立一個
S O A P實現工具,因此僅能夠傳送預先給定數量的參數。為了避免該種限制,我們總是傳送一個
參數,它是一個數組。該數組將包含真實的參數。這樣,參數的多少就可如你所愿。
一個客戶請求的例子如下:
程序清單11 - 9 6
478使用XML 高級編程
下載
在這個例子里我們向遠程過程( g e t A u t h o r)傳送兩個參數。從該調用的任何返回值將放在
變量o R e t里,任何成功或失敗的狀態信息將放在變量i R e t里。該遠程過程被函數S O A P()激活,
如果你正在實現自己的系統,那么能夠使用任何你認為有意義的名字。
在遠程服務器上這個過程做了些什么呢?它返回了一批作者名,他們的I D都是大于或等于
第一個參數的。在這個例子里,該參數的值來自于一個可變的表單。至于確切地返回作者的數
量,將通過第二個參數設置—在這里用“1”。這個程序將在后面被用到。
你可能注意到這里有兩個i n c l u d e文件,并想知道為什么我們不包含S O A P C l i e n t . a s p中的
基本模塊S O A P. a s p,這樣就而只需要包含一個。在絕大多數情況可以這樣做,但是,后
面我將向你展示這樣一種情形,即我們想建立一個既是客戶又是服務器的應用程序。在
這種情況下,將使基本模塊被包含兩次。因此,最好將此模塊獨立于客戶和服務器模塊
之外,是否包含,依需要而定。當然,如果你使用的是一個比A S P更高級的環境,那么
你能使用條件包含來避免這個問題。
(2) 調用
讓我們看一看當執行調用時發生了什么。下面這段代碼在S O A P C l i e n t . a s p內:
程序清單11 - 9 7
該調用被傳送到另一個函數—d oCall( )—它做實際的處理過程。SOAP( )過程必須包含
它自己,讓調用者知道處理是成功還是失敗。
那么遠程調用實際做了什么呢?這是一個過程的開始,如你所見,首先的任務是準備一個
調用的有效載荷:
程序清單11 - 9 8
第11章服服務器到服務器使用479 下載
(3) 有效載荷
創建一個有效載荷是在客戶和服務器雙方都需要做的工作,因此,有效載荷函數存在于通
用模塊—S O A P. a s p內。
像使用X M L - R P C,有效載荷由一些實際的數據組成,這些數據是我們將要傳送的。它們被
包含在一個非常嚴格的消息包里以保證這些數據能夠被正確地抽取。有效載荷的實際格式隨著
對有效載荷的不同請求情況而不同。例如,承擔一個方法調用消息的有效載荷與傳送調用結果
的有效載荷不同。S O A P為調用、返回和錯誤報告提供不同的有效載荷。
盡管有三種形式的有效載荷,但它們還是有一些共同的特征:
• 它們都包含于叫做< E n v e l o p e>的元素。這個元素必須屬于S O A P命名空間。
• <E n v e l o p e>元素順序包含一個< B o d y>元素,它也是在S O A P命名空間內。這些條件意
味著總是有如下這種模式:
程序清單11 - 9 9
現在能夠編碼有效載荷函數,它包含任何已經定義過的子元素,不論是一個調用、一個響
應或是一個錯誤:
程序清單11 - 1 0 0
480使用XML 高級編程
下載
注意<E n v e l o p e>元素也包含對于數據類型的命名空間定義,像早些時候討論的那樣。正常
情況下,僅需要加入x s d命名空間,但作為一個過渡性的方法,也為X M L - D R加了命名空間,因
此能從Microsoft XML DO M(在第7章有全面的解釋)得到分類的數據。這個元素可以包含任意
數量的命名空間定義,只要你想要。并且它也包含另外的屬性,這些屬性也滿足命名空間的要
求。
我們已經有了創建一個有效載荷的函數,該有效載荷又是包含了任意子元素的,因此需要
一個一般過程來創建那些子元素。一個用于調用,一個用于對調用的響應,一個用于錯誤指示。
(4) 方法調用和響應
調用和它們的響應使用方法的名字,該名字位于傳輸的命名空間。響應將“ R e s p o n s e”附
加到方法的名字上,因此我們可有如下調用:
程序清單11 - 1 0 1
得到響應如下:
程序清單11 - 1 0 2
中國航空網 www.k6050.com
航空翻譯 www.aviation.cn
本文鏈接地址:
XML高級編程上(149)