??? 開(kāi)始之前,我想就本文即將討論的主題和讀者需要具備的起點(diǎn)知識(shí)做一些必需的描敘。本文的主題是討論SOAP技術(shù),我們將盡可能的講得通俗易懂一些,所以,我們引入了一個(gè)普通的“Hello World”范例來(lái)給讀者說(shuō)明它們是怎么運(yùn)作的,讓讀者知道它們的運(yùn)作方式。
??? 我認(rèn)為,如果光看官方文檔是很難開(kāi)始學(xué)習(xí)這門新技術(shù)的,官方文檔中包含大量的范例,并解釋了所有的特性和優(yōu)點(diǎn),但是沒(méi)解釋它們的運(yùn)作方式。在這篇文章中,我不打算只膚淺的解釋SOAP技術(shù)的定義,我們假設(shè)讀者熟悉Java語(yǔ)言,Web技術(shù),具有XML語(yǔ)言,XML Namespaces,XML Schema的基礎(chǔ)。在這種情況下,理解本文將不存在任何困難。然而,即使沒(méi)有這些知識(shí),你也不必?fù)?dān)心,我們將盡可能的解釋得簡(jiǎn)單,但是當(dāng)你開(kāi)始做自己的SOAP應(yīng)用程序時(shí)會(huì)遇到一些問(wèn)題和麻煩。因此,花費(fèi)一定時(shí)間來(lái)學(xué)習(xí)上面的知識(shí)是很有必要的。
??? 從技術(shù)的角度來(lái)說(shuō),有必要提一下我們的調(diào)試環(huán)境。我們使用的是Windows XP操作系統(tǒng),安裝有JAVA 2 SDK 1.4.1,Apache SOAP 2.3.1,JAF 1.0.2,JAVAMAIL 1.3.1和Xerces 2.6.0。上面所提及的都能在Tcomcat 4.1.29 jsp/Servlet容器中正常運(yùn)行。所有的軟件都是免費(fèi)自由軟件,因此你能夠很容易的下載它們并自己在任何你喜歡的平臺(tái)如Windows或UNIX上安裝它們。Java SDK,JAF和JAVAMAIL位于SUN的官方網(wǎng)站(http://java.sun.com),其他的軟件在Jakarta項(xiàng)目組的官方網(wǎng)站(http://jakarta.apache.org)上有down的。可能你在看到我們需要這么多不同的包(package)時(shí)已經(jīng)有點(diǎn)擔(dān)心和不安了,但是實(shí)際上你不應(yīng)該擔(dān)心這些的。一旦你懂了基礎(chǔ),那么對(duì)你將相當(dāng)容易。安裝不是一件很難的事情,你只需要在設(shè)置環(huán)境變量的時(shí)候仔細(xì)些,比如CATALINA_HOME, CLASSPATH, JAVA_HOME 等等,所有這些步驟都是手工的。由于我僅僅是想將你的注意力再次集中到它們身上,所以你能很快的就完成以上配置過(guò)程。我只是添加下面的一些字符串到Tomcat的bin/setclasspath.bat文件中:
??? 如果你的安裝路徑(installation paths)和上面使用的不同,你需要更正它們,然后關(guān)閉和重啟Tomcat以使它們生效。這樣,你就有為運(yùn)行SOAP作好了準(zhǔn)備。但是現(xiàn)在,我要忘記有關(guān)的技術(shù)部分,來(lái)學(xué)一點(diǎn)理論知識(shí)。
??? SOAP意思是簡(jiǎn)單對(duì)象訪問(wèn)協(xié)議(Simple Object Access Protocol)。的確如它的名字一樣,SOAP是很簡(jiǎn)單的。它是一個(gè)基于XML的協(xié)議,允許程序組件和應(yīng)用程序彼此使用一種標(biāo)準(zhǔn)的Internet協(xié)議--HTTP來(lái)通訊。SOAP是一種獨(dú)立的平臺(tái),它不依賴程序語(yǔ)言,它是簡(jiǎn)單的,彈性的,很容易擴(kuò)展的。目前,應(yīng)用程序能夠彼此使用一種基于DCOM和CORBA技術(shù)的遠(yuǎn)程過(guò)程調(diào)用(RPC)來(lái)進(jìn)行相互通訊,但HTTP不被設(shè)計(jì)為這個(gè)目的。RPC在Internet上應(yīng)用是非常困難的,它們會(huì)出現(xiàn)許多兼容性和安全性的問(wèn)題,因?yàn)榉阑饓痛矸?wù)器通常都會(huì)阻斷(block)這些類型的流量。應(yīng)用程序之間最好的通訊方式是通過(guò)HTTP協(xié)議,因?yàn)镠TTP是支持所有Internet瀏覽器和服務(wù)器的。基于這個(gè)目的,SOAP協(xié)議被創(chuàng)建出來(lái)。
??? 那么,它們是如何運(yùn)作的呢?比如,一個(gè)應(yīng)用程序(A)需要和另一個(gè)應(yīng)用程序(B)在SOAP的幫助下進(jìn)行彼此通訊。它們將使用下面的框架圖來(lái)完成這個(gè)過(guò)程:
???
??? 這個(gè)SOAP信封(SOAP envelope)是一個(gè)包含以下內(nèi)容的XML文檔:
???
??? 正如你看到的,它是非常簡(jiǎn)單的。它看起來(lái)確實(shí)就象一個(gè)普通的信封或者你的email。你想看看它們是如何動(dòng)作的嗎?下面跟我們一起來(lái)吧。其實(shí)我們有很多方法是不用SOAP來(lái)在創(chuàng)建和運(yùn)行我們自己的“Hello World”應(yīng)用程序的,但是因?yàn)槲覀円3炙暮?jiǎn)單性,我會(huì)給你一個(gè)它運(yùn)作方式的框架圖(scheme)。
??? 我們的“Hello World”范例會(huì)包含一個(gè)SOAP Service。我們的SOAP Client將發(fā)送它們的名字到該SOAP Service,并試圖得到一些答復(fù)或響應(yīng)。這個(gè)SOAP Service需要部署到一個(gè)SOAP Admin的工具,以至重定位所有請(qǐng)求的SOAP(Proxy) RPC Router能夠知道它們應(yīng)該使用哪種服務(wù)來(lái)運(yùn)作。總而言之,這個(gè)是以下面的方式來(lái)運(yùn)作的:
???
??? 現(xiàn)在,我們來(lái)一步步的看看到底發(fā)生了什么。在Step 1里,HelloWorldClient將連接一個(gè)SOAP RPC Router,請(qǐng)求我們的SOAP Service并將包含我們名字的一個(gè)字符串傳遞給它。該SOAP RPC Router會(huì)檢查是否它已經(jīng)部署了這個(gè)SOAP Service。如果它被發(fā)現(xiàn)是被部署的,那么它將傳遞數(shù)據(jù)到這個(gè)SOAP Service并調(diào)用特定的方法,這個(gè)是Step 2。然后SOAP Service方法會(huì)被執(zhí)行,將返回某個(gè)字符串值(該值就是SOAP Client的答復(fù)或者響應(yīng))(Step 3)。在Step4中,SOAP RPC Router將僅僅只是重定向這個(gè)數(shù)據(jù)到SOAP Client。所有在Step1和Step4里傳輸?shù)臄?shù)據(jù)是通過(guò)SOAP Envelope來(lái)完成的。正如你所看到的,算法是相當(dāng)簡(jiǎn)單的,因此我們只準(zhǔn)備關(guān)心實(shí)際的代碼。
首先,我們要?jiǎng)?chuàng)建一個(gè)SOAP Service。下面是它的代碼,請(qǐng)不要忘記將它放入HelloWorld/ 目錄中(必須被包含在你的CLASSPATH中):
??? 添加任何注釋也是很容易的。要編譯它,只需要用下列命令:
??? 第二步,一旦我們準(zhǔn)備好了SOAP Service,我們需要用SOAP Service Manager來(lái)部署它。這個(gè)可以通過(guò)很多方式來(lái)實(shí)現(xiàn),但是為了能讓初學(xué)SOAP的讀者更容易理解SOAP,我提供了一個(gè)最容易的方式。我們假設(shè)你的Web Server(Tomcat或其他)已經(jīng)正常運(yùn)行,并且你已經(jīng)正確安裝了SOAP。那么當(dāng)瀏覽器訪問(wèn)http://localhost:8080/soap/,你會(huì)看見(jiàn)Apache SOAP的歡迎頁(yè)面。點(diǎn)擊Run the admin client ,然后 Deploy。你會(huì)得到一個(gè)屏幕顯示,在那里你需要填入ID,Scope,Method,Provider Type和JAVA Provider的信息到表單域中。你能忽略其他所有的表單域,除非你真的需要它們的信息。我們的“HelloWorld”例子不需要它們,所以,我們填的下面的值:
??? 一些注釋:ID是我們要從SOAP Client標(biāo)識(shí)我們的SOAP Service的唯一名字。Method包含SOAP Service提供的一系列方法。JAVA Provider-Provider Class是SOAP Service Java類的名字。
??? 現(xiàn)在,點(diǎn)擊Deploy 按鈕,那么你的服務(wù)會(huì)被部署。再次強(qiáng)調(diào),請(qǐng)注意正確設(shè)置CLASSPATH環(huán)境變量。然后,你的HelloWorld.SOAPService類能夠被找到,并且所有必需的jar包也能被找到。這是個(gè)幾乎每個(gè)人都會(huì)犯的普通錯(cuò)誤。現(xiàn)在,你能夠點(diǎn)擊 List ,將會(huì)看見(jiàn)你的服務(wù)已經(jīng)被部署進(jìn)來(lái)。恭喜!
??? 最后,讓我們來(lái)創(chuàng)建一個(gè)SOAP Client。代碼看起來(lái)有點(diǎn)復(fù)雜,但是在現(xiàn)實(shí)中不會(huì)只有這么點(diǎn)長(zhǎng)。
??? 下面我要做一些解釋。在第13行,我們?cè)O(shè)置了我們的名字,這個(gè)名字將會(huì)傳遞給SOAP Service。在第14行,我們?cè)O(shè)置了我們將要調(diào)用的服務(wù)的ID(service ID),和第15行里設(shè)置的服務(wù)方法(service method)。有了這個(gè)ID,服務(wù)能夠被部署到SOAP服務(wù)管理器(SOAP Service Manager)中。我們沒(méi)有設(shè)置任何其他值,僅僅只用剛才那些基礎(chǔ)值就可以正常運(yùn)作了。你能從SOAP的官方文檔上得到相關(guān)信息,該文檔來(lái)自SOAP包中,它們的解釋超出了本文的范圍。
??? 用以下方式編譯這個(gè)SOAP Client:
??? 為了圓滿完成它,讓我們檢查一下針對(duì)我們的測(cè)試,是否所有事情都準(zhǔn)備就緒。Tomcat正在運(yùn)行,所有的環(huán)境變量都正確,SOAP Service被編譯和部署,SOAP Client被成功編譯。OK,讓我們運(yùn)行它,你將看到這個(gè)屏幕:
???
??? 正如你所看到的,我們的SOAP Client使用SOAP協(xié)議成功發(fā)送它的名字和接收了一個(gè)答復(fù)。正如前面所說(shuō)的,SOAP Service發(fā)送和接收的是SOAP envelope。這個(gè)是SOAP envelope的源代碼。
被發(fā)送到SOAP Service的SOAP Envelope
從SOAP Service接收的SOAP Envelope:
??? 要理解SOAP Envelope中的所有標(biāo)簽的含義,我建議你花一點(diǎn)時(shí)間閱讀http://www.w3.org/2001/06/soap-envelope 命名空間規(guī)范。
??? 我認(rèn)為,如果光看官方文檔是很難開(kāi)始學(xué)習(xí)這門新技術(shù)的,官方文檔中包含大量的范例,并解釋了所有的特性和優(yōu)點(diǎn),但是沒(méi)解釋它們的運(yùn)作方式。在這篇文章中,我不打算只膚淺的解釋SOAP技術(shù)的定義,我們假設(shè)讀者熟悉Java語(yǔ)言,Web技術(shù),具有XML語(yǔ)言,XML Namespaces,XML Schema的基礎(chǔ)。在這種情況下,理解本文將不存在任何困難。然而,即使沒(méi)有這些知識(shí),你也不必?fù)?dān)心,我們將盡可能的解釋得簡(jiǎn)單,但是當(dāng)你開(kāi)始做自己的SOAP應(yīng)用程序時(shí)會(huì)遇到一些問(wèn)題和麻煩。因此,花費(fèi)一定時(shí)間來(lái)學(xué)習(xí)上面的知識(shí)是很有必要的。
??? 從技術(shù)的角度來(lái)說(shuō),有必要提一下我們的調(diào)試環(huán)境。我們使用的是Windows XP操作系統(tǒng),安裝有JAVA 2 SDK 1.4.1,Apache SOAP 2.3.1,JAF 1.0.2,JAVAMAIL 1.3.1和Xerces 2.6.0。上面所提及的都能在Tcomcat 4.1.29 jsp/Servlet容器中正常運(yùn)行。所有的軟件都是免費(fèi)自由軟件,因此你能夠很容易的下載它們并自己在任何你喜歡的平臺(tái)如Windows或UNIX上安裝它們。Java SDK,JAF和JAVAMAIL位于SUN的官方網(wǎng)站(http://java.sun.com),其他的軟件在Jakarta項(xiàng)目組的官方網(wǎng)站(http://jakarta.apache.org)上有down的。可能你在看到我們需要這么多不同的包(package)時(shí)已經(jīng)有點(diǎn)擔(dān)心和不安了,但是實(shí)際上你不應(yīng)該擔(dān)心這些的。一旦你懂了基礎(chǔ),那么對(duì)你將相當(dāng)容易。安裝不是一件很難的事情,你只需要在設(shè)置環(huán)境變量的時(shí)候仔細(xì)些,比如CATALINA_HOME, CLASSPATH, JAVA_HOME 等等,所有這些步驟都是手工的。由于我僅僅是想將你的注意力再次集中到它們身上,所以你能很快的就完成以上配置過(guò)程。我只是添加下面的一些字符串到Tomcat的bin/setclasspath.bat文件中:
... set CATALINA_HOME=C:\Tomcat4.1.29 set CLASSPATH=%JAVA_HOME%\lib\tools.jar set CLASSPATH=%JAVA_HOME%\soap-2.3.1\lib\soap.jar set CLASSPATH=%CLASSPATH%;%JAVA_HOME%\javamail-1.3.1\mail.jar set CLASSPATH=%CLASSPATH%;%JAVA_HOME%\jaf-1.0.2\activation.jar set CLASSPATH=%CLASSPATH%;%JAVA_HOME%\xerces-2_6_0\xercesImpl.jar set CLASSPATH=%CLASSPATH%;%JAVA_HOME%\xerces-2_6_0\xercesSamples.jar set CLASSPATH=%CLASSPATH%;%JAVA_HOME%\xerces-2_6_0\xml-apis.jar set CLASSPATH=%CLASSPATH%;%JAVA_HOME%\xerces-2_6_0\xmlParserAPIs.jar set CLASSPATH=%CLASSPATH%;%CATALINA_HOME%\common\lib\servlet.jar set CLASSPATH=%CLASSPATH%;%CATALINA_HOME%\common\lib\tools.jar ...
??? 如果你的安裝路徑(installation paths)和上面使用的不同,你需要更正它們,然后關(guān)閉和重啟Tomcat以使它們生效。這樣,你就有為運(yùn)行SOAP作好了準(zhǔn)備。但是現(xiàn)在,我要忘記有關(guān)的技術(shù)部分,來(lái)學(xué)一點(diǎn)理論知識(shí)。
??? SOAP意思是簡(jiǎn)單對(duì)象訪問(wèn)協(xié)議(Simple Object Access Protocol)。的確如它的名字一樣,SOAP是很簡(jiǎn)單的。它是一個(gè)基于XML的協(xié)議,允許程序組件和應(yīng)用程序彼此使用一種標(biāo)準(zhǔn)的Internet協(xié)議--HTTP來(lái)通訊。SOAP是一種獨(dú)立的平臺(tái),它不依賴程序語(yǔ)言,它是簡(jiǎn)單的,彈性的,很容易擴(kuò)展的。目前,應(yīng)用程序能夠彼此使用一種基于DCOM和CORBA技術(shù)的遠(yuǎn)程過(guò)程調(diào)用(RPC)來(lái)進(jìn)行相互通訊,但HTTP不被設(shè)計(jì)為這個(gè)目的。RPC在Internet上應(yīng)用是非常困難的,它們會(huì)出現(xiàn)許多兼容性和安全性的問(wèn)題,因?yàn)榉阑饓痛矸?wù)器通常都會(huì)阻斷(block)這些類型的流量。應(yīng)用程序之間最好的通訊方式是通過(guò)HTTP協(xié)議,因?yàn)镠TTP是支持所有Internet瀏覽器和服務(wù)器的。基于這個(gè)目的,SOAP協(xié)議被創(chuàng)建出來(lái)。
??? 那么,它們是如何運(yùn)作的呢?比如,一個(gè)應(yīng)用程序(A)需要和另一個(gè)應(yīng)用程序(B)在SOAP的幫助下進(jìn)行彼此通訊。它們將使用下面的框架圖來(lái)完成這個(gè)過(guò)程:
???

??? 這個(gè)SOAP信封(SOAP envelope)是一個(gè)包含以下內(nèi)容的XML文檔:
???

??? 正如你看到的,它是非常簡(jiǎn)單的。它看起來(lái)確實(shí)就象一個(gè)普通的信封或者你的email。你想看看它們是如何動(dòng)作的嗎?下面跟我們一起來(lái)吧。其實(shí)我們有很多方法是不用SOAP來(lái)在創(chuàng)建和運(yùn)行我們自己的“Hello World”應(yīng)用程序的,但是因?yàn)槲覀円3炙暮?jiǎn)單性,我會(huì)給你一個(gè)它運(yùn)作方式的框架圖(scheme)。
??? 我們的“Hello World”范例會(huì)包含一個(gè)SOAP Service。我們的SOAP Client將發(fā)送它們的名字到該SOAP Service,并試圖得到一些答復(fù)或響應(yīng)。這個(gè)SOAP Service需要部署到一個(gè)SOAP Admin的工具,以至重定位所有請(qǐng)求的SOAP(Proxy) RPC Router能夠知道它們應(yīng)該使用哪種服務(wù)來(lái)運(yùn)作。總而言之,這個(gè)是以下面的方式來(lái)運(yùn)作的:
???

??? 現(xiàn)在,我們來(lái)一步步的看看到底發(fā)生了什么。在Step 1里,HelloWorldClient將連接一個(gè)SOAP RPC Router,請(qǐng)求我們的SOAP Service并將包含我們名字的一個(gè)字符串傳遞給它。該SOAP RPC Router會(huì)檢查是否它已經(jīng)部署了這個(gè)SOAP Service。如果它被發(fā)現(xiàn)是被部署的,那么它將傳遞數(shù)據(jù)到這個(gè)SOAP Service并調(diào)用特定的方法,這個(gè)是Step 2。然后SOAP Service方法會(huì)被執(zhí)行,將返回某個(gè)字符串值(該值就是SOAP Client的答復(fù)或者響應(yīng))(Step 3)。在Step4中,SOAP RPC Router將僅僅只是重定向這個(gè)數(shù)據(jù)到SOAP Client。所有在Step1和Step4里傳輸?shù)臄?shù)據(jù)是通過(guò)SOAP Envelope來(lái)完成的。正如你所看到的,算法是相當(dāng)簡(jiǎn)單的,因此我們只準(zhǔn)備關(guān)心實(shí)際的代碼。
首先,我們要?jiǎng)?chuàng)建一個(gè)SOAP Service。下面是它的代碼,請(qǐng)不要忘記將它放入HelloWorld/ 目錄中(必須被包含在你的CLASSPATH中):
// SOAPService.java package HelloWorld; public class SOAPService { public String sayHi(String x) { return("Hello my friend, " + x + "! Glad to see you!"); } }
??? 添加任何注釋也是很容易的。要編譯它,只需要用下列命令:
javac SOAPService.java
??? 第二步,一旦我們準(zhǔn)備好了SOAP Service,我們需要用SOAP Service Manager來(lái)部署它。這個(gè)可以通過(guò)很多方式來(lái)實(shí)現(xiàn),但是為了能讓初學(xué)SOAP的讀者更容易理解SOAP,我提供了一個(gè)最容易的方式。我們假設(shè)你的Web Server(Tomcat或其他)已經(jīng)正常運(yùn)行,并且你已經(jīng)正確安裝了SOAP。那么當(dāng)瀏覽器訪問(wèn)http://localhost:8080/soap/,你會(huì)看見(jiàn)Apache SOAP的歡迎頁(yè)面。點(diǎn)擊Run the admin client ,然后 Deploy。你會(huì)得到一個(gè)屏幕顯示,在那里你需要填入ID,Scope,Method,Provider Type和JAVA Provider的信息到表單域中。你能忽略其他所有的表單域,除非你真的需要它們的信息。我們的“HelloWorld”例子不需要它們,所以,我們填的下面的值:
ID: urn:HelloWorld_SOAPService Scope: Application Methods: sayHi Provider Type: java Java Provider - Provider Class: HelloWorld.SOAPService Java Provider - Static? No
??? 一些注釋:ID是我們要從SOAP Client標(biāo)識(shí)我們的SOAP Service的唯一名字。Method包含SOAP Service提供的一系列方法。JAVA Provider-Provider Class是SOAP Service Java類的名字。
??? 現(xiàn)在,點(diǎn)擊Deploy 按鈕,那么你的服務(wù)會(huì)被部署。再次強(qiáng)調(diào),請(qǐng)注意正確設(shè)置CLASSPATH環(huán)境變量。然后,你的HelloWorld.SOAPService類能夠被找到,并且所有必需的jar包也能被找到。這是個(gè)幾乎每個(gè)人都會(huì)犯的普通錯(cuò)誤。現(xiàn)在,你能夠點(diǎn)擊 List ,將會(huì)看見(jiàn)你的服務(wù)已經(jīng)被部署進(jìn)來(lái)。恭喜!
??? 最后,讓我們來(lái)創(chuàng)建一個(gè)SOAP Client。代碼看起來(lái)有點(diǎn)復(fù)雜,但是在現(xiàn)實(shí)中不會(huì)只有這么點(diǎn)長(zhǎng)。
// HelloWorldClient.java import java.io.*; import java.net.*; import java.util.*; import org.apache.soap.*; import org.apache.soap.rpc.*; public class HelloWorldClient { public static void main(String[] arg) throws Exception { Call c = null; URL url = null; Vector params = null; Response rep = null; String ourName = "Superman"; String ourUrn = "urn:HelloWorld_SOAPService"; String ourMethod = "sayHi"; url = new URL("http://localhost:8080/soap/servlet/rpcrouter"); System.out.println("Passing to our deployed "+ourUrn+"our name ("+ourName+"): "); c = new Call(); c.setTargetObjectURI(ourUrn); c.setMethodName(ourMethod); c.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC); params = new Vector(); params.addElement(new Parameter("ourName", String.class, ourName, null)); c.setParams(params); System.out.print("and its answer is: "); rep = c.invoke(url, ""); if (rep.generatedFault()) { Fault fault = rep.getFault(); System.out.println("\nCall failed!"); System.out.println("Code = " + fault.getFaultCode()); System.out.println("String = " + fault.getFaultString()); } else { Parameter result = rep.getReturnValue(); System.out.print(result.getValue()); System.out.println(); } } }
??? 下面我要做一些解釋。在第13行,我們?cè)O(shè)置了我們的名字,這個(gè)名字將會(huì)傳遞給SOAP Service。在第14行,我們?cè)O(shè)置了我們將要調(diào)用的服務(wù)的ID(service ID),和第15行里設(shè)置的服務(wù)方法(service method)。有了這個(gè)ID,服務(wù)能夠被部署到SOAP服務(wù)管理器(SOAP Service Manager)中。我們沒(méi)有設(shè)置任何其他值,僅僅只用剛才那些基礎(chǔ)值就可以正常運(yùn)作了。你能從SOAP的官方文檔上得到相關(guān)信息,該文檔來(lái)自SOAP包中,它們的解釋超出了本文的范圍。
??? 用以下方式編譯這個(gè)SOAP Client:
javac HelloWorldClient.java
??? 為了圓滿完成它,讓我們檢查一下針對(duì)我們的測(cè)試,是否所有事情都準(zhǔn)備就緒。Tomcat正在運(yùn)行,所有的環(huán)境變量都正確,SOAP Service被編譯和部署,SOAP Client被成功編譯。OK,讓我們運(yùn)行它,你將看到這個(gè)屏幕:
???

??? 正如你所看到的,我們的SOAP Client使用SOAP協(xié)議成功發(fā)送它的名字和接收了一個(gè)答復(fù)。正如前面所說(shuō)的,SOAP Service發(fā)送和接收的是SOAP envelope。這個(gè)是SOAP envelope的源代碼。
被發(fā)送到SOAP Service的SOAP Envelope
<?xml version='1.0' encoding='UTF-8'?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <SOAP-ENV:Body> <ns1:sayHi xmlns:ns1="urn:HelloWorld_SOAPService" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <ourName xsi:type="xsd:string">Superman</ourName> </ns1:sayHi> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
從SOAP Service接收的SOAP Envelope:
<?xml version='1.0' encoding='UTF-8'?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <SOAP-ENV:Body> <ns1:sayHiResponse xmlns:ns1="urn:HelloWorld_SOAPService" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <return xsi:type="xsd:string">Hello my friend, Superman! Glad to see you!</return> </ns1:sayHiResponse> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
??? 要理解SOAP Envelope中的所有標(biāo)簽的含義,我建議你花一點(diǎn)時(shí)間閱讀http://www.w3.org/2001/06/soap-envelope 命名空間規(guī)范。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
