曝光臺 注意防騙
網曝天貓店富美金盛家居專營店坑蒙拐騙欺詐消費者
的記錄集,該函數涉及到支持文檔,篇幅很長。這里只展示該例程的一部分。
被傳送的參數是將要加入的節點,包括新節點的名字和將轉換成節點的實際條目。如果節
點名字為空,那么使用被傳送的條目類型作為元素名字:
程序清單11 - 111
下面是創建包含數據的節點。注意如果我們有一個變量數組,那么我們A r r a y o f語法:
程序清單11 - 11 2
依照數據類型,正確設置新的元素:
程序清單11 - 11 3
將一個記錄集作為一個參數的能力使之成為一個功能較強的函數。注意對于每一個領域都
第11章服服務器到服務器使用485 下載
遞歸調用a d d C h i l d(),于是得到了條目的正確數據類型。它的另一項功能是,通過它也能處理
嵌套的記錄集:
程序清單11 - 11 4
最后,不匹配的只有參數數組,或不可識別的形式。如果是一個數組,我們將把它看作成
一個變量數組:
程序清單11 - 11 5
有效載荷功能的最后部分是低層次的例程,它對一個特定數據類型設置了一個節點:
程序清單11 - 11 6
486使用XML 高級編程
下載
為了運用Microsoft XML DOM中的X M L - D M工具,我在n o d e Ty p e d Va l u e屬性內放了一個值,
同時也設置了x s d : t y p e值作為X M L模式第二部分的請求。我猜想,當M i c r o s o f t發布下一個X M L
D O M版本時,d t : d t語法將被x s d : t y p e語法所取代。在這種語法里,函數的第一行可以不要。
(8) 有效載荷的提交
已經闡明了如何建立一個有效載荷,現在回到所關注的遠程調用上來。為了不用來回翻看,
現把代碼寫在下面:
程序清單11 - 11 7
如果成功調用了有效載荷,那現在將把有效載荷發送到遠程服務器上。記住我們在S O A P
的增強功能敘述里討論過,必須在進行M - P O S T之前先試一個P O S T。下面是代碼的開始部
分:
程序清單11 - 11 8
如果你正在寫自己的S O A P模塊,那么記住S O A P標準列出了一些必須被處理的H T T P返回代
碼。例如,重定向代碼3 0 2必須被實現。處理H T T P請求的一些組件將為你做這些工作,但是對
它進行一下檢查是有必要的。
在執行了一個P O S T后(或M - P O S T),可以檢查返回值。如果收到2 0 0,那么至少知道H T T P
處理了調用—盡管在S O A P的層次上仍可能有一些錯誤。除了2 0 0外的任何值都表示出錯,最
有可能的錯誤代碼是5 0 1—沒有執行或者5 1 0—沒有擴展:
第11章服服務器到服務器使用487 下載
程序清單11 - 11 9
實現P O S T或M - P O S T的函數如下:
程序清單11 - 1 2 0
如果被實現的P O S T類型是強制性的—一個M - P O S T—那么要保證出現所有的報頭。
需要去做的任務僅剩下檢查返回的數據,這是在S O A P函數的頂層。C h e c k P a y l o a d()函數
用于檢查一個有效載荷,來確定在報頭和有效載荷中的方法名是否一致,并確定命名空間是正
確的等等。這個函數在客戶端也用于檢查從一個調用返回的有效載荷,而在服務器端用于檢查
激活一個調用的有效載荷。該函數返回在S O A P里的重要節點,或者在D O M參數里的一個錯誤
結構:
程序清單11 - 1 2 1
注意,選擇開始于根節點,這是因為在這里要處理兩種情況:一是當實際的根節點是一個
488使用XML 高級編程
下載
< S O A P : F a u l t >元素,如果遠程服務器返回一個< S O A P : F a u l t >和C h e c k P a y l o a d(),就是這種情形。
二是如果在返回的有效載荷里有錯誤,在這處情況下,將從C h e c k P a y l o a d()得到一個錯誤的
有效載荷。此時,根元素將是< S O A P : E n v e l o p e >。如果發現了一個< S O A P : F a u l t >元素,那么將
找出錯誤代碼和另外的信息,并把它顯示出來:
程序清單11 - 1 2 2
如果一切O K,那么將使用X M LTo Va l u e()把返回的X M L轉變成普通變量—a d d C h i l d()
函數的反轉功能是很有效的:
程序清單11 - 1 2 3
(9) 服務器模塊
現在我們開始構建服務器端。第一個要做是創建一個XML DOM對象,并用提交已給我們發
送的數據來裝載它:
程序清單11 - 1 2 4
下一個得到的是調用者使用的方法。如果它是一個M - P O S T,那么我們需要得到M a n報頭,
它包含了命名空間用以區別強制性報頭,如果在命名空間兩邊有引用的話,那么要把它們刪除:
程序清單11 - 1 2 5
我們將檢查命名空間是否與在S O A P標準里的定義相同,但在此時,什么也沒有做:
第11章服服務器到服務器使用489 下載
程序清單11 - 1 2 6
實際的命名空間標識符—與X M L里的前綴相似—以“n s =”打頭,一旦其被重新得到,
就能創建報頭名字,進而我們能夠得到方法的名字:
程序清單11 - 1 2 7
有了方法的名字,我們需要將命名空間分開;因為需要將它與有效載荷的命名空間值核對:
程序清單11 - 1 2 8
下面這個片斷并不是S O A P標準的一部分,但是用于檢測目的的有用的代碼片斷。當方法是
E C H O()并且命名空間是S O A P時,它所做的就是返給用戶一個實際傳送的內容:
程序清單11 - 1 2 9
在確定執行需要的函數之前,需要檢查有效載荷的一致性:
程序清單11 - 1 3 0
490使用XML 高級編程
下載
如果有效載荷O K,在傳送它們到回調例程之前, o X M L將包含參數節點,并把它們轉換成
變量:
程序清單11 - 1 3 1
如果調用成功執行,那么將創建一個響應有效載荷,并且它將被返回到調用者。另一方面,
如果有錯誤,那么創建一個錯誤有效包:
程序清單11 - 1 3 2
最后將被執行的是一系列的實際的例程。回憶一下我們已經創建的調用:
程序清單11 - 1 3 3
現在,需要創建m y S e r v e r. a s p模塊, S O A P服務器模塊需要包含進來以使我們有權使用所有
中國航空網 www.k6050.com
航空翻譯 www.aviation.cn
本文鏈接地址:
XML高級編程上(151)