用Java實現(xiàn)SOAP的XML文檔網(wǎng)絡(luò)傳輸及遠(yuǎn)程過程調(diào)用RPC_第1頁
用Java實現(xiàn)SOAP的XML文檔網(wǎng)絡(luò)傳輸及遠(yuǎn)程過程調(diào)用RPC_第2頁
用Java實現(xiàn)SOAP的XML文檔網(wǎng)絡(luò)傳輸及遠(yuǎn)程過程調(diào)用RPC_第3頁
用Java實現(xiàn)SOAP的XML文檔網(wǎng)絡(luò)傳輸及遠(yuǎn)程過程調(diào)用RPC_第4頁
用Java實現(xiàn)SOAP的XML文檔網(wǎng)絡(luò)傳輸及遠(yuǎn)程過程調(diào)用RPC_第5頁
已閱讀5頁,還剩20頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、用Java實現(xiàn)基于SOAP的XML文檔網(wǎng)絡(luò)傳輸及遠(yuǎn)程過程調(diào)用(RPC)SOAP(Simple Object Access Protocol,簡單對象訪問協(xié)議) 是一種基于XML的,用于計算機(jī)之間交換信息的協(xié)議。SOAP能應(yīng)用于各種消息接發(fā)系統(tǒng),并能通過各種傳輸協(xié)議進(jìn)行消息傳遞,但最初的側(cè)重點(diǎn)是通過HTTP傳輸?shù)倪h(yuǎn)程過程調(diào)用。SOAP是Web service的一個重要組成部份,如果把Web service比喻成Internet,那么SOAP就可以比喻成TCP/IP。SOAP是一種協(xié)議而非具體產(chǎn)品,微軟也有自己的SOAP實現(xiàn)產(chǎn)品,而Java下比較流行的SOAP實現(xiàn)產(chǎn)品就是Apache SOAP,不

2、過它的下一個版本已經(jīng)改名成AXIS了。 SOAP是用XML文件來做為數(shù)據(jù)轉(zhuǎn)輸?shù)妮d體的,走HTTP的線路。一般企業(yè)的防火墻都開放HTTP的80端口,所以SOAP不會被防火墻阻斷,這算是SOAP的一個優(yōu)點(diǎn)。信息轉(zhuǎn)輸?shù)碾p方都要求支持SOAP服務(wù),因為XML文件發(fā)過去,則對方需要有SOAP服務(wù)來接收,然后對方會有反饋也是XML文件,這時你也需要安裝SOAP服務(wù)來接收。 1. 環(huán)境配置 為了運(yùn)行程序,我們首先必須配置好環(huán)境: 共要下載四個軟件包,它們都是開源免費(fèi)的。其中,前兩個是Apache的,后兩個是SUN網(wǎng)站的,如下所示: n      &

3、#160; SOAP:/ n        Xerces: n        JavaMail: n        JAF: 下載后將它們分別解壓縮。分別在這四個包的解壓目錄中找到:xerces.jar、soap.jar、mail.jar、activation.jar(JAF的),則是四個jar文件是我們所需要的。 本機(jī)安裝環(huán)境:WindowsXP(SP2) + JDK_06 + Tom

4、cat5.0.28 + SOAP2.3.1 配置步驟: 1、安裝JDK和Tomcat。過程比較簡單,這里不再詳述。 2、將剛才所找到的四個jar文件復(fù)制到Tomcat的“Tomcat 5.0commonlib”目錄下,這個目錄是Tomcat的默認(rèn)包目錄,在這個目錄中的所有包在Tomcat啟動時都會被自動加載。 3、將 JDKlib路徑下的tools.jar也復(fù)制到Tomcat的“Tomcat 5.0commonlib”目錄下。 4、將soap解壓目錄的webapps目錄下的soap.war文件,復(fù)制到Tomcat的“Tomcat 5.0webapps”目錄下,這個目錄是Tomcat的WEB應(yīng)用

5、所在目錄。重新啟動Tomcat,Tomcat會自動將其解壓,并配置好路徑。可以嘗試在瀏覽器中輸入“http:/localhost:8080/soap/”, 看SOAP是否安裝好。 5、注意在編寫程序時,需要將所得到的四個jar文件路徑設(shè)置到所使用的Java編程環(huán)境中,因為在程序中需要用到其中的類文件。具體步驟略。 6、重啟Tomcat服務(wù)。這時Tomcat會將“Tomcat 5.0commonlib”目錄下新加入的包加載到內(nèi)存中。 到此,我們已經(jīng)配置好了程序運(yùn)行所需要的環(huán)境。  2. 基于SOAP的XML文檔網(wǎng)絡(luò)傳輸 SOAP規(guī)范主要定義了四個元素:SOAP信封規(guī)范,傳輸和協(xié)議綁定,

6、編碼規(guī)則和一個RPC協(xié)定。用于實現(xiàn)消息的網(wǎng)絡(luò)傳輸。 n        SOAP信封規(guī)范,SOAP信封規(guī)范對計算機(jī)間傳遞的數(shù)據(jù)如何封裝定義了具體的規(guī)則。這包括應(yīng)用特定的數(shù)據(jù),如要調(diào)用的方法名,方法參數(shù)和返回值;還包括誰將處理封裝內(nèi)容,失敗時如何編碼錯誤消息等信息。 n        數(shù)據(jù)編碼規(guī)則,為了交換數(shù)據(jù),計算機(jī)必須在編碼特定數(shù)據(jù)類型的規(guī)則上達(dá)成一致,SOAP也有自己的一套編碼數(shù)據(jù)類型的約定。大部分約定都基于W3C XML Schema規(guī)范。 n

7、0;       RPC協(xié)定,SOAP能用于單向和雙向等各種消息接發(fā)系統(tǒng)。SOAP為雙向消息接發(fā)定義了一個簡單的協(xié)定來進(jìn)行遠(yuǎn)程過程調(diào)用和響應(yīng),這使得客戶端應(yīng)用可以指定遠(yuǎn)程方法名,獲取任意多個參數(shù)并接受來自服務(wù)器的響應(yīng)。 n        傳輸和協(xié)議綁定,提供了更底層協(xié)議傳輸SOAP封套的一套通用機(jī)制。 而以上四個部分統(tǒng)稱為一個SOAP消息。我們先來看一篇XML文檔是如何變成SOAP的。采用一個簡單的購物訂單文件PO.xml 。內(nèi)容為: <?xml versio

8、n="1.0" encoding="UTF-8"?> <PurchaseOrder xmlns="urn:oreilly-jaws-samples"> <shipTo country="US"> <name>Joe Smith</name> <street>14 Oak Park</street> <city>Bedford</city> <state>MA</state> <zip&

9、gt;01730</zip> </shipTo> <items> <item partNum="872-AA"> <productName>Candy Canes</productName> <quantity>444</quantity> <price>1.68</price> <comment>I want candy!</comment> </item> </items> </PurchaseOr

10、der> 其對應(yīng)的SOAP消息為: POST /ServletTemp/HTTPReceive HTTP/1.0 Host: localhost Content-Type: text/xml; charset=utf-8 Content-Length: 939 SOAPAction: "urn:oreilly-jaws-samples"  <?xml version=1.0 encoding=UTF-8?> <SOAP-ENV:Envelope /soap/envelope/" xmlns:xsi=&

11、quot;/2001/XMLSchema-instance" xmlns:xsd="/2001/XMLSchema"> <SOAP-ENV:Header> <jaws:MessageHeader xmlns:jaws="urn:oreilly-jaws-samples" SOAP-ENV:mustUnderstand="1" xmlns:SOAP-ENV="urn:oreilly-jaws-samples">&l

12、t;From>Me</From><To>You</To><MessageId>9999</MessageId></jaws:MessageHeader> </SOAP-ENV:Header> <SOAP-ENV:Body> <PurchaseOrder xmlns="urn:oreilly-jaws-samples"> <shipTo country="US"> <name>Joe Smith</name>

13、 <street>14 Oak Park</street> <city>Bedford</city> <state>MA</state> <zip>01730</zip> </shipTo> <items> <item partNum="872-AA"> <productName>Candy Canes</productName> <quantity>444</quantity> <pric

14、e>1.68</price> <comment>I want candy!</comment> </item> </items> </PurchaseOrder> </SOAP-ENV:Body> </SOAP-ENV:Envelope> 一個SOAP消息包括:SOAP封套,SOAP頭(可選),SOAP主體。 我們首先將XML文檔包裝到一個SOAP體中,然后再把SOAP體包裝到一個SOAP封套中,可以在封套中再添加一個SOAP頭(不是必須),最后將SOAP封套綁定到一個協(xié)議中。我們來仔細(xì)分析一

15、下代碼。 n       SOAP封套 SOAP封套的聲明在XML標(biāo)簽的最外層,它表明了一個SOAP文檔的邊界。下面的封套標(biāo)簽顯示了三個必要的屬性,這些屬性指明了封套中使用的名字空間和語法。 <SOAP-ENV:Envelope xmlns:SOAP-ENV="/soap/envelope/" xmlns:xsi="/2001/XMLSchema-instance" xmlns:xsd="http:

16、//2001/XMLSchema"> </SOAP-ENV:Envelope> 其中第一個屬性:xmlns:SOAP-ENV="/soap/envelope/" 是一個名字空間聲明,防止多個XML文件組合時發(fā)生標(biāo)簽名字的沖突。第二個屬性聲明了XML模式實例的名字空間。前綴xsi必須放在這個名字空間定義的所有元素和屬性之前。最后一個屬性是另外一個名字空間聲明,它定義了XML Schema名字空間,這個名字空間下的元素用來指定xsi:type 屬性的值(如xsd:string)。

17、n       SOAP頭 SOAP頭和體在語法上非常類似。SOAP1.1和SOAP1.2都沒有頭里應(yīng)該有些什么,它就是簡單的存放一些指令,提供給接收消息的SOAP處理器。建立在SOAP之上的更高級協(xié)議(比如ebXML消息服務(wù))就通過定義一些特殊元素來規(guī)范SOAP頭的格式。另外當(dāng)對RPC使用SOAP時,頭部也可以用來表示一些底層信息。 <SOAP-ENV:Header> <jaws:MessageHeader xmlns:jaws="urn:oreilly-jaws-samples" SOAP-E

18、NV:mustUnderstand="1" xmlns:SOAP-ENV="urn:oreilly-jaws-samples"><From>Me</From><To>You</To><MessageId>9999</MessageId></jaws:MessageHeader> </SOAP-ENV:Header>  n       SOAP主體 SOAP主體用來存放實際數(shù)據(jù)或消息的有

19、效負(fù)載(本例中為XML文檔),從而提供給最終的接受者使用或處理。 n       SOAP協(xié)議綁定 當(dāng)綁定到一個HTTP協(xié)議時,需要在SOAP封套前面添加HTTP頭的信息。 POST /ServletTemp/HTTPReceive HTTP/1.0 Host: localhost Content-Type: text/xml; charset=utf-8 Content-Length: 939 SOAPAction: "urn:oreilly-jaws-samples" 在SOAP1.1中SOAPAction是H

20、TTP綁定所必須的部分,它的目的是讓那些路由或分派的信息知道該做些什么,即使它們根本不知道SOAP或者沒有解析SOAP封套的方法。而在SOAP1.2中SOAPAction已變成可選的了。 n       SOAP消息的發(fā)送與接收 我們已經(jīng)看到了一個SOAP消息的各個組成塊,接下來我們要了解消息是怎樣被創(chuàng)建的,以及怎樣在兩個端點(diǎn)之間進(jìn)行傳輸?shù)摹?SOAP的發(fā)送端的代碼: package javaSoap01;  import java.io.*; import java.util.*;  public class G

21、enericHTTPSoapClient Private static final StringDEFAULT_HOST_URL = "http:/localhost:8080/ServletTemp/HTTPReceive" private static final String DEFAULT_DATA_FILENAME = "./PO.xml" private static final String URI = "urn:oreilly-jaws-samples"   private String m_hostURL;

22、 private String m_dataFileName;   public GenericHTTPSoapClient(String hostURL, String dataFileName) throws Exception m_hostURL = hostURL; m_dataFileName = dataFileName;  System.out.println(); System.out.println("_"); System.out.println("Starting GenericHTTPSoapClient:")

23、; System.out.println(" host url = " + m_hostURL); System.out.println(" data file = " + m_dataFileName); System.out.println("_"); System.out.println();  /實際的傳送工作是由sendSOAPMessage()方法完成的 public void sendSOAPMessage() try / 首先讀取XML文檔,將其解析成DOM樹。 FileReader fr = new Fil

24、eReader (m_dataFileName);  /通過調(diào)用Apache getXMlDocBuilder()方法得到一個解析器,它返回一個DocumentBuilder對象。 javax.xml.parsers.DocumentBuilder xdb = org.apache.soap.util.xml.XMLParserUtils.getXMLDocBuilder();  /通過解析器解析文檔,得到一個Document對象。 org.w3c.dom.Document doc = xdb.parse (new org.xml.sax.InputSource (fr);

25、 if (doc = null) throw new org.apache.soap.SOAPException (org.apache.soap.Constants.FAULT_CODE_CLIENT, "parsing error");   / create a vector for collecting the header elements Vector headerElements = new Vector();   / Create a header element in a namespace org.w3c.dom.Element hea

26、derElement = doc.createElementNS(URI,"jaws:MessageHeader");   headerElement.setAttributeNS(URI,"SOAP-ENV:mustUnderstand","1");   / Create subnodes within the MessageHeader org.w3c.dom.Element ele = doc.createElement("From"); org.w3c.dom.Text textNode

27、 = doc.createTextNode("Me"); org.w3c.dom.Node tempNode = ele.appendChild(textNode); tempNode = headerElement.appendChild(ele);   ele = doc.createElement("To"); textNode = doc.createTextNode("You"); tempNode = ele.appendChild(textNode); tempNode = headerElement.appe

28、ndChild(ele);   ele = doc.createElement("MessageId"); textNode = doc.createTextNode("9999"); tempNode = ele.appendChild(textNode); tempNode = headerElement.appendChild(ele);   headerElements.add(headerElement);   / create a vector for collecting the body elements V

29、ector bodyElements = new Vector(); /獲取頂層DOM元素,放到向量中。頂層節(jié)點(diǎn)的下層節(jié)點(diǎn)元素的創(chuàng)建和添加工作由DOM解析器負(fù)責(zé)。 bodyElements.add(doc.getDocumentElement ();   /Create the SOAP envelope org.apache.soap.Envelope envelope = new org.apache.soap.Envelope();   /Add the SOAP header element to the envelope org.apache.soap.Heade

30、r header = new org.apache.soap.Header(); header.setHeaderEntries(headerElements); envelope.setHeader(header);   /Create the SOAP body element org.apache.soap.Body body = new org.apache.soap.Body(); body.setBodyEntries(bodyElements);   /Add the SOAP body element to the envelope envelope.set

31、Body(body);   / Build the Message. org.apache.soap.messaging.Message msg = new org.apache.soap.messaging.Message();   msg.send (new .URL(m_hostURL), URI, envelope); System.out.println("Sent SOAP Message with Apache HTTP SOAP Client.");   / 從傳輸中接受響應(yīng)并將其打印到屏幕上 System.out.printl

32、n("Waiting for response."); org.apache.soap.transport.SOAPTransport st = msg.getSOAPTransport (); BufferedReader br = st.receive (); String line = br.readLine(); if(line = null) System.out.println("HTTP POST was successful. n"); else while (line != null) System.out.println (line)

33、; line = br.readLine(); catch(Exception e) e.printStackTrace();   public static void main(String args) /省略 在上述程序中,當(dāng)我們構(gòu)造好SOAP封套后,它需要被送到一個目的地去。在ApacheSOAP中,有一個Message對象來處理異步的單向傳送。Message.send()方法有三個參數(shù):一個URL,用于指明傳送地點(diǎn);一個URI,用于表示SOAPAction頭的值;還有一個SOAP封套。SOAPActionURI實際上是綁定HTTP的一部分,用來指定當(dāng)一個消息到達(dá)傳送目的地的時

34、候調(diào)用哪個函數(shù)或服務(wù)。 Message接口用于異步單向通信,Message.seng()函數(shù)的返回值為void型。但這并不妨礙它在雙向同步會話中使用。當(dāng)這個Message接口是基于一個雙向傳輸協(xié)議(例如HTTP)實現(xiàn)的時候,SOAPTransport.receive()方法就能用來接收一個響應(yīng)。在SOAPTransport是基于HTTP實現(xiàn)的情況下,receive()方法阻塞并等待一個錯誤(例如一個HTTP請求超時),或者一個正確的返回代碼(例如“HTTP 1.0 200 OK”)。 SOAP接收端代碼: public class HTTPReceive extends HttpServlet

35、 . /SOAP請求以HTTP POST形式接收 public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException System.out.println("Received request."); System.out.println("-");  / Traverse the HTTP headers and show them on the screen for(Enumerati

36、on enum = request.getHeaderNames(); enum.hasMoreElements(); ) String header = (String)enum.nextElement(); String value = request.getHeader(header); System.out.println(" " + header + " = " + value); System.out.println("-");   if(request.getContentLength() > 0) tr

37、y java.io.BufferedReader reader = request.getReader();   / 獲取DocumentBuilder javax.xml.parsers.DocumentBuilder xdb = org.apache.soap.util.xml.XMLParserUtils.getXMLDocBuilder(); / 接下來我們將文件解析為一個DOM樹,得到一個Document對象。 org.w3c.dom.Document doc = xdb.parse (new org.xml.sax.InputSource (reader); if (do

38、c = null) / Error occured System.out.println("Doc is null!"); throw new org.apache.soap.SOAPException (org.apache.soap.Constants.FAULT_CODE_CLIENT, "parsing error"); else /在接收端我們已經(jīng)有了一個發(fā)送過來的SOAP封套。SOAP封套是SOAP文檔的最外層元素,也是根元素。我們可以遍歷這個DOM樹從而直接得到封套以及它的子節(jié)點(diǎn)。通過調(diào)用unmarshall()方法從文件中得到一個Enve

39、lope實例。 org.apache.soap.Envelope env = org.apache.soap.Envelope.unmarshall(doc.getDocumentElement();   / 現(xiàn)在我們得到了一個封套,我們按照和前面相反的過程來操作它:從Envelope中取得BodyEntrys的向量Vector,然后從向量中取得Body。 org.apache.soap.Body body = env.getBody(); java.util.Vector bodyEntries = body.getBodyEntries();   java.io.Str

40、ingWriter writer = new java.io.StringWriter();   for (java.util.Enumeration e = bodyEntries.elements(); e.hasMoreElements();) org.w3c.dom.Element el = (org.w3c.dom.Element)e.nextElement();   /在當(dāng)前情況下,向量中只有一個條目:<PurchaseOrder>元素。從而我們也就得到了一個DOM對象。這個DOM對象和前面我們?yōu)榻O.xml而建立的DOM對象完全一樣。我們調(diào)用靜

41、態(tài)方法DOM2Writer.serializeAsXML()將PurchaseOrder元素及其子元素全部序列化為一個StringWriter對象。 e)el, writer); System.out.println(writer.toString(); catch(Exception e) System.out.println(e);   System.out.println("_");   response.setContentType("text/xml"); / Need this to prevent Apache SOAP

42、 from gacking n       帶附件的SOAP消息 XML和SOAP能夠很好的描述數(shù)據(jù),但是許多應(yīng)用程序的數(shù)據(jù)并不適合XML來描述,比如圖像的二進(jìn)制數(shù)據(jù)。SWA(SOAP With Attachments)可以解決這個問題。SWA把SOAP協(xié)議和MIME格式組合到一起,從而使SOAP消息可以包含任意的數(shù)據(jù)。這個模型和在email中包含附件的方法是一樣的。 MIME協(xié)議允許在消息中包含任意多個數(shù)據(jù)塊。每個數(shù)據(jù)塊都被一個MIME頭分開。在SWA中,整個消息包含多個MIME部分,第一部分(部分0)是SOAP封套,剩下的部分(1

43、- n)都是附件。所有這些部分都包裝在底層協(xié)議中。 構(gòu)造帶附件的SOAP:SOAP封套的創(chuàng)建和組裝和以前一樣,消息的創(chuàng)建議和以前一樣。下面給出心田代碼,它創(chuàng)建一個MimeBodyPart對象,然后我們從附件中讀出文本作為它的內(nèi)容體(假定附件為一個TXT文本文件)。 /創(chuàng)建消息 org.apache.soap.messaging.Message msg = new org.apache.soap.messaging.Message();   /添加附件 if(m_attachment != null) BufferedReader attachmentReader = new Buff

44、eredReader(new FileReader(m_attachment); StringBuffer buffer = new StringBuffer(); for(String line = attachmentReader.readLine(); line != null; line = attachmentReader.readLine() buffer.append(line); MimeBodyPart attachment = new MimeBodyPart(); attachment.setText(buffer.toString(); 接下來,我們需要讓接收端能夠引用

45、附件。為了使接收端能夠分析這個消息,我們在XML文檔中添加了一個元素,它用the-attachment作為href的值。我們用這個值作為附件的content-id. attachment.setHeader("Content-ID", "the-attachment"); 最后,我們在消息中添加附件部分然后發(fā)送。Apache SOAP會知道你在消息中添加了附件,并且會正確的轉(zhuǎn)化為消息格式: msg.addBodyPart(attachment); msg.send (new .URL(m_hostURL), URI, envelope); System.

46、out.println("Sent SOAP Message with Apache HTTP SOAP Client."); 接收帶附件的SOAP: /處理SOAP體 org.apache.soap.Body body = requestEnvelope.getBody(); java.util.Vector bodyEntries = body.getBodyEntries(); writer.write("nBody=>n"); for (java.util.Enumeration e = bodyEntries.elements(); e.

47、hasMoreElements();) org.w3c.dom.Element el = (org.w3c.dom.Element)e.nextElement(); org.apache.soap.util.xml.DOM2Writer.serializeAsXML(org.w3c.dom.Node)el, writer); 我們通過XML文檔中的<attachment href=“cid:the-attachment”/>元素來查找附件。首先我們通過名字查找attachment>元素。然后我們?nèi)〕鰄ref屬性中的content-id的值。一旦我們得到了id,就能夠使用SOA

48、PContext對象中的getBodyPart()方法,通過content-id來查找MIME附件。 org.w3c.dom.Element attachmentEl = (org.w3c.dom.Element)el.getElementsByTagName("attachment").item(0); if (attachmentEl != null) writer.write("nAttachment=>n"); cid = attachmentEl.getAttribute("href").substring(4);/g

49、et rid of cid: writer.write("Content-ID = "+cid+"n"); MimeBodyPart attachment = requestContext.getBodyPart(cid); try writer.write("The attachment is.n"+attachment.getContent()+"n"); catch(Exception ex) throw new SOAPException(Constants.FAULT_CODE_SERVER, "

50、;Error writing response", ex); else writer.write("The Content-ID is null!n"); System.out.println(writer.toString(); 3. 基于SOAP的遠(yuǎn)程過程調(diào)用(RPC) SOAP-RPC使用SOAP底層結(jié)構(gòu)定義了一個用來表示RPC以及RPC響應(yīng)的模型。它并不要求一定要緊緊地綁定一個同步的請求/響應(yīng)模型或者一個HTTP協(xié)議。實際上SOAP1.1和1.2規(guī)范都明確聲明了SOAP-RPC的使用和協(xié)議的綁定是無關(guān)的。規(guī)范承認(rèn),當(dāng)SOAP-RPC綁定到HTTP時,RPC

51、調(diào)用就自動和HTTP請求相匹配,但是這個匹配純粹是偶然的。因此真正重要的是SOAP定義了一個統(tǒng)一的模型,來表示RPC及其一個或多個返回值。RPC調(diào)用的基本要求是,體元素包含方法名和參數(shù),并且參數(shù)可以通過存取方法來訪問。SOAP還提供了對方法簽名,頭數(shù)據(jù)和代表目的地的URI進(jìn)行編碼的方法。 我們先來看一個SOAP-RPC的發(fā)送端內(nèi)容: POST /soap/servlet/rpcrouter HTTP/1.0 Host: localhost:5555 Content-Type: text/xml; charset=utf-8 Content-Length: 678 SOAPAction: &qu

52、ot;"  <?xml version=1.0 encoding=UTF-8?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="/soap/envelope/" xmlns:xsi="/2001/XMLSchema-instance" xmlns:xsd="/2001/XMLSchema"> <SOAP-ENV:Body> <ns1:ge

53、tPriceList xmlns:ns1="urn:examples:pricelistservice" SOAP-ENV:encodingStyle="/soap/encoding/"> <sku xmlns:ns2="/soap/encoding/" xsi:type="ns2:Array" ns2:arrayType="xsd:string3"> <item xsi:

54、type="xsd:string">A350001</item> <item xsi:type="xsd:string">A350002</item> <item xsi:type="xsd:string">A350005</item> </sku> </ns1:getPriceList> </SOAP-ENV:Body> </SOAP-ENV:Envelope> 可以看到,在封套體內(nèi)包含了方法名以及過程調(diào)用所需的參數(shù)。如

55、在這個SOAP消息中, <ns1:getPriceList>是自動產(chǎn)生的標(biāo)簽,它代表方法名。<sku>參數(shù)用xsi:type="ns2:Array"類型表示。 n       SOAP-Encoding屬性 SOAP編碼是一套規(guī)則,說明線路上傳輸?shù)臄?shù)據(jù)類型如何進(jìn)行編碼或者序列化。在上面這個消息中,encodingStyle屬性值設(shè)為"/soap/encoding/"。這個特定的URL定義了基于SOAP1.1模式的編碼規(guī)則。

56、SOAP編碼包括了序列化任何數(shù)據(jù)類型的規(guī)則,從簡單的標(biāo)量類型到復(fù)雜的數(shù)據(jù)類型。 n       SOAP-RPC方法簽名 方法簽名只是簡單的聲明body元素包含一個SOAP結(jié)構(gòu)。結(jié)構(gòu)中的每一個元素都可被一個存取方法所引用。在SOAP中,帶有存取方法的元素能夠直接用命名的標(biāo)簽或者一個順序值來標(biāo)識。如果有多個參數(shù),它們必須和所調(diào)用的方法中的參數(shù)列表的順序一致,類型也必須匹配。響應(yīng)的規(guī)則也是類似的。響應(yīng)端返回的內(nèi)容為: HTTP/1.1 200 OK Set-Cookie: JSESSIONID=AAD5E6B20535EDACC7637062DF663979; Path=/soap Content-Type: text/xml; chars

溫馨提示

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

最新文檔

評論

0/150

提交評論