曝光臺 注意防騙
網曝天貓店富美金盛家居專營店坑蒙拐騙欺詐消費者
創建一個調用有效載荷的函數如下:
程序清單11 - 1 0 3
第11章服服務器到服務器使用481 下載
調用響應函數只需要調用該調用有效載荷函數,使用被改動的方法名字:
程序清單11 - 1 0 4
一個調用的有效載荷相繼擁有所有的參數。addChild( )過程在通用模塊S O A P. a s p中,用于將
節點加到輸出上。addChild( )的第二個參數一般是將被給出節點的名字,但是在本例中,我們把
它空起來以表明我們想用數據類型的名字作為節點名字( a d dChild( )函數將在后面討論)。
注意我們使每一個參數“匿名”便于使用,在標準里并不需要這樣做。下面這個從標準規
范里得來的例子展示了將調用編碼的另一種方法,這次使用了被命名的參數:
程序清單11 - 1 0 5
但是,使用一個簡單的A S P實現,例如我們正在建造的,比起編碼參數名稱和其值要麻煩得
多(定義和命名接口的系統正向前發展,下面將要討論)。因此使用數據類型來命名參數是簡潔
明了的。在我們的系統里,如果有一個包含三個元素的數組,并且有與剛才給出的例子里相同
的值將得到:
程序清單11 - 1 0 6
(5) 方法參數
在S O A P規范敘述了參數可以“輸入”和“輸入/輸出”,這就意味著它們能夠賦值,并做
為信息被傳送到一個一般過程,該值也可以用于保存函數的結果。但是,在S O A P里沒有把一個
函數定義成這樣的模式—哪些參數用于輸入,哪些參數還能返回數據。
這意味著對于一個客戶實現,沒有辦法發現在一個調用過程中哪些參數是需要的,對于服
482使用XML 高級編程
下載
務器來說也沒有辦法在執行方法前檢查傳送的參數。當然,你能夠在自己的每個函數里檢查發
現是否接收到了所期望的參數。但是理想化的S O A P服務器層應該把這些對你隱藏起來。
盡管這種檢查是非常有用的,但這并不是S O A P一個部分。原因有二,其一是它將使X M L -
R P C愛好者們感到苦惱,你將不再能夠快速地將客戶或服務器模塊發布到任何平臺,現在將不
得不檢查參數的名字和那些參數的數據類型。但是如果客戶和服務器模塊均在你的控制之下,
那么就可不必如此費心,而可以保證這些參數是正確的。
第二個理由是已經有一些初始化的工作存在指定了一個函數的“足跡”。它們中的一些來自
于軟件設計領域。那里,對象和它們的方法可以自動地被多種工具所定義。另外一些是新的,
專用于如S O A P和X M L - P R C的以X M L為基礎的協議。一個這樣的初始化工作是C o m p o n e n t
Description Language ( 組件描述語言: C D L), 它來自于D e v e l o p M e n t o r, 在h t t p:
/ / w w w. d e v e l o p . c o m / s o a p / c d l . h t m,它允許指定參數的類型以及函數的返回值。
(6) 出錯響應
最后的有效載荷類型是針對錯誤的。如果S O A P層能夠檢查出錯誤,那么一個出錯響應就被
返回。在各種層次上都有可能發生錯誤,可能是一個消息包的錯誤,或者傳送的X M L的錯誤,
或者在有效載荷里方法的名字可能與報頭里的不匹配。S O A P本身并不能總是檢查出錯誤,例如,
如果一個錯誤存在于被傳送的X M L中,或者M - P O S T在沒有強制性的參數被傳送的情況下被使
用,那么直到這個消息包被S O A P處理,錯誤才被發現;另一方面,如果錯誤的命名空間被用于
特定的S O A P元素,那么S O A P將能夠識別該錯誤,并進行處理。
S O A P對它能夠識別的錯誤的返回指示如下所示:
程序清單11 - 1 0 7
這個例子來自于S O A P規范本身,僅有的不同在于在< f a u l t c o d e >、< f a u l t s t r i n g >和< r u n c o d e >
開始于一個簡單的命名空間前綴。該標準只要插入子元素,往往就省略名字前綴——這里是
< S O A P : F a u l t >—但是使用S O A P前綴并與S O A P有關的一些代碼除外。
< f a u l t >結構中幾個部分的含義如下:
• <faultcode>錯誤代碼號,如1 0 0代表調用使用了不被支持的S O A P版本。
• <faultstring>是錯誤的字符串表示,對錯誤1 0 0它顯示“Version Mismatch”(版本不匹配)。
• < r u n c o d e >被用于指示是否—盡管錯誤被報告—函數被送到了應用程序,值的范圍是0、
1和2,分別說明“可能”、“沒有”和“有”。
這三個元素是必須的,但是也可能有第四個元素—< d e t a i l >—它包含該應用程序想返回
的任何內容,例如關于為什么調用失敗的詳細描述。例如,如果被調用的應用程序失敗,那么
第11章服服務器到服務器使用483 下載
它將返回S O A P錯誤4 0 0(錯誤代碼),但是并沒有告訴調用者更多;該應用程序就能通過使用這
個參數提供更多的信息:
程序清單11 - 1 0 8
一個出錯的有效載荷在如下函數中得到準備:
程序清單11 - 1 0 9
該函數僅需要一個錯誤代碼和一個描述串來創建一個< F a u l t >結構,出錯串從代碼中創建,
并且運行代碼取決于一個全局變量。注意描述串僅在它確實被設置后才能被返回。
當使用所有的有效載荷函數時, a d d C h i l d()被用于在樹中創建節點,我們現在轉到這個函
數上來。
(7) addChild()
在前面的部分里簡要地對a d d c h i l d()進行了說明,在此我們將更加詳細地對它進行探討,
因為它正是S O A P系統的核心。a d d C h i l d()的目的是向一個X M L樹加入節點,節點的使用遵守
S O A P標準的數據規則,例如,如果有一個值為7的整數,可能創建如下代碼:
484使用XML 高級編程
下載
程序清單11 - 11 0
或:
這個函數是非常靈活的,可進行處理數組等工作,又因為它是遞歸的,因此它能夠處理數
組之間的嵌套和其他的復雜結構,它也能將某些V B對象轉化成X M L,例如作為數據庫查詢結果
中國航空網 www.k6050.com
航空翻譯 www.aviation.cn
本文鏈接地址:
XML高級編程上(150)