版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、WebService CXF學(xué)習(xí)(入門篇1):CXF由來WebService介紹 WebService讓一個(gè)程序可以透明地調(diào)用互聯(lián)網(wǎng)程序,不用管具體的實(shí)現(xiàn)細(xì)節(jié)。只要WebService公開了服務(wù)接口,遠(yuǎn)程客戶端就可以調(diào)用服務(wù)。WebService是基于http協(xié)議的組件服務(wù),WebService是分散式應(yīng)用程序的發(fā)展趨勢。 WebService的開源實(shí)現(xiàn) WebService更多是一種標(biāo)準(zhǔn),而不是一種具體的技術(shù)。不同的平臺(tái),不同的語言大都提供WebService的開發(fā)實(shí)現(xiàn)。在JAVA領(lǐng)域,WebService的框架很多,例如:AXIS,XFi
2、re,CXF等。AXIS,XFire相對(duì)比較成熟,資料相對(duì)較多。在這里我們只對(duì)CXF進(jìn)行講解,其他大家想學(xué)習(xí)到互聯(lián)網(wǎng)找相關(guān)資料學(xué)習(xí)。 CXF框架由來 ApacheCXF項(xiàng)目是由ObjectWeb Celtix和CodeHaus XFire合并成立。ObjectWeb Celtix是由IONA公司贊助,于2005年成立的開源Java ESB產(chǎn)品,XFire則是業(yè)界知名的SOAP堆棧。合并后的ApacheCXF融合該兩個(gè)開源項(xiàng)目的功能精華,提供了實(shí)現(xiàn)SOA所需要的核心ESB功能框架,包括SOA服務(wù)創(chuàng)建,服務(wù)路由,及一系列企業(yè)級(jí)QoS功能。 ApacheCXF架框的目標(biāo) &
3、#160; 1.概述 <>高性能 <>可擴(kuò)展 <>直觀易用 2.支持標(biāo)準(zhǔn) <> JAX-WS, JSR-181, SAAJ, JAX-RS <> SOAP 1.1, 1.2, WS-I BasicProfile, WS-Security, WS-Addressing, WS-RM, WS-Policy <
4、;> WSDL 1.1 <> MTOM 3.傳輸方式,綁定,數(shù)據(jù)綁定,傳送數(shù)據(jù)格式 <> 綁定: SOAP, REST/HTTP <> 數(shù)據(jù)綁定: JAXB 2.x, Aegis, XMLBeans, SDO <> 傳送數(shù)據(jù)格式: XML, JSON, FastInfoset <> 傳輸方式: HTTP, Servl
5、et, JMS 4.部署靈活 <> 輕量級(jí): 可以將服務(wù)部署到 Tomcat或其支持Spring的容器中 <> JBI整合: 部署一個(gè)服務(wù)引擎到JBI容器,例如: ServiceMix, OpenESB or Petals <> J2EE集成: 可以將服務(wù)部署到J2EE應(yīng)用服務(wù)器上,例如:Geronimo, JOnAS, JBoss, WebLogic, 及WebSphere <
6、;> Java 客戶端/服務(wù)端可以獨(dú)立性 5.支持多種編程語言 <> 完全支持 JAX-WS 2.x 客戶端/服務(wù)端模式 <> JAX-WS 2.x synchronous, asynchronous and one-way API's <> JAX-WS 2.x Dynamic Invocation Interface (DII) API <> 支持 wr
7、apped and non-wrapped 數(shù)據(jù)格式 <> XML messaging API <> 支持JavaScript 和 ECMAScript 4 XML (E4X) <> 支持CORBA <> 支持JBI及ServiceMix 6.可編程環(huán)境 <> Java to WSDL
8、 <> WSDL to Java <> XSD to WSDL <> WSDL to XML <> WSDL to SOAP <> WSDL to serviceWebService CXF學(xué)習(xí)(入門篇2):HelloWorld理論聯(lián)系實(shí)際,單單只講理論那就成了紙上談兵,用一個(gè)HelloWorld Demo可來說明事更加直觀。那下面咱們就開始進(jìn)行講解: 首先到
9、apache官方網(wǎng)下載apache-cxf-2.2.2,地址:/ 新建一個(gè)Java Project,導(dǎo)入cxf常用.jar包 Java代碼 1. commons-logging-1.1.1.jar 2. geronimo-activation_1.1_spec-1.0.2.jar (or Sun's Activation jar) 3. geronimo-annotation_1.0_spec-1.1.1.jar (JSR&
10、#160;250) 4. geronimo-javamail_1.4_spec-1.6.jar (or Sun's JavaMail jar) 5. geronimo-servlet_2.5_spec-1.2.jar (or Sun's Servlet jar) 6. geronimo-ws-metadata_2.0_spec-1.1.2.jar (JSR 181) 7. geroni
11、mo-jaxws_2.1_spec-1.0.jar (or Sun's jaxws-api-2.1.jar) 8. geronimo-stax-api_1.0_spec-1.0.1.jar (or other stax-api jar) 9. jaxb-api-2.1.jar 10. jaxb-impl-2.1.12.jar 11. jetty-6.1.21.jar 12. jetty-util-6
12、.1.21.jar 13. neethi-2.0.4.jar 14. saaj-api-1.3.jar 15. saaj-impl-1.3.2.jar 16. wsdl4j-1.6.2.jar 17. wstx-asl-3.2.8.jar 18. XmlSchema-1.4.5.jar 19. xml-resolver-1.2.jar 20. cxf-2.2.2.jar commo
13、ns-logging-1.1.1.jar geronimo-activation_1.1_spec-1.0.2.jar (or Sun's Activation jar) geronimo-annotation_1.0_spec-1.1.1.jar (JSR 250) geronimo-javamail_1.4_spec-1.6.jar (or Sun's JavaMail jar) geronimo-servlet_2.5_spec-1.2.jar (or Sun's Servlet jar) geronimo-ws-metadata_2.0_spec-1.1.2.j
14、ar (JSR 181) geronimo-jaxws_2.1_spec-1.0.jar (or Sun's jaxws-api-2.1.jar) geronimo-stax-api_1.0_spec-1.0.1.jar (or other stax-api jar) jaxb-api-2.1.jar jaxb-impl-2.1.12.jar jetty-6.1.21.jar jetty-util-6.1.21.jar neethi-2.0.4.jar saaj-api-1.3.jar saaj-impl-1.3.2.jar wsdl4j-1.6.2.jar wstx-asl-3.2.
15、8.jar XmlSchema-1.4.5.jar xml-resolver-1.2.jar cxf-2.2.2.jar 接下就是HelloWorld Demo開發(fā)了 第一步:新建一個(gè)webservice接口 Java代碼 1. WebService 2. public interface IHelloWorld 3. /WebParam給參數(shù)命名,提高可代碼可讀性。此項(xiàng)可選 4. blic
16、60;String sayHi(WebParam(name="text") String text); 5. WebService public interface IHelloWorld /WebParam給參數(shù)命名,提高可代碼可讀性。此項(xiàng)可選public String sayHi(WebParam(name="text") String text); 通過注解WebService申明為webservice接口 第二步,實(shí)
17、現(xiàn)WebService接口 Java代碼 1. WebService 2. public class HelloWorldImpl implements IHelloWorld 3. 4. public String sayHi(String name) 5. System.out.println("sa
18、yHello is called by " + name); 6. return "Hello " + name; 7. 8. 9. WebService public class HelloWorldImpl implements IHelloWorld pub
19、lic String sayHi(String name) System.out.println("sayHello is called by " + name);return "Hello " + name; 第三步,創(chuàng)建服務(wù)端 Java代碼 1. public class Server 2. 3. private Server() 4. IH
20、elloWorld helloWorld = new HelloWorldImpl(); 5. /創(chuàng)建WebService服務(wù)工廠 6. JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean(); 7. /注冊(cè)WebService接口 &
21、#160; 8. factory.setServiceClass(IHelloWorld.class); 9. /發(fā)布接口 10. factory.setAddress("http:/localhost:9000/HelloWorld"); 11. factory.setServiceBean(hello
22、World); 12. /創(chuàng)建WebService 13. factory.create(); 14. ; 15. 16. public static void main(String args) throws InterruptedException 17. &
23、#160; /啟動(dòng)服務(wù)端 18. new Server(); 19. System.out.println("Server ready."); 20. /休眠一分鐘,便于測試 &
24、#160;21. Thread.sleep(1000*60); 22. System.out.println("Server exit."); 23. System.exit(0); 24. 25.
25、 public class Server private Server()IHelloWorld helloWorld = new HelloWorldImpl();/創(chuàng)建WebService服務(wù)工廠JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();/注冊(cè)WebService接口factory.setServiceClass(IHelloWorld.class);/發(fā)布接口factory.setAddress("http:/localhost:900
26、0/HelloWorld");factory.setServiceBean(helloWorld);/創(chuàng)建WebServicefactory.create();public static void main(String args) throws InterruptedException /啟動(dòng)服務(wù)端 new Server();System.out.println("Server ready.");/休眠一分鐘,便于測試 Thread.sleep(1000*60);System.out.println("Server exit.");Syste
27、m.exit(0); 第四步,創(chuàng)建客戶端 Java代碼 1. public class Client 2. 3. private Client(); 4. 5. public static void main(String args) 6. /創(chuàng)建W
28、ebService客戶端代理工廠 7. JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean(); 8. /注冊(cè)WebService接口 9. factory.setServiceClass(HelloWorld.class); 10.
29、0; /設(shè)置WebService地址 11. factory.setAddress("http:/localhost:9000/HelloWorld"); 12. IHelloWorld iHelloWorld = (IHelloWorld)factory.create(); 13. &
30、#160; System.out.println("invoke webservice."); 14. System.out.println("message context is:"+iHelloWorld.sayHi(" 15.
31、 Josen"); 16. System.exit(0); 17. 18. 19. public class Client private Client();public static void main(String args)/創(chuàng)建WebService客戶端代理工廠JaxWsProxyFacto
32、ryBean factory = new JaxWsProxyFactoryBean();/注冊(cè)WebService接口factory.setServiceClass(HelloWorld.class);/設(shè)置WebService地址factory.setAddress("http:/localhost:9000/HelloWorld");IHelloWorld iHelloWorld = (IHelloWorld)factory.create();System.out.println("invoke webservice.");System.out.p
33、rintln("message context is:"+iHelloWorld.sayHi(" Josen");System.exit(0); 最后是萬事俱備,只欠測試了 首先,運(yùn)行服務(wù)端程序 其次,打開瀏覽器,在地址欄中輸入http:/localhost:9000/HelloWorld?wsdl(因?yàn)閏xf自帶了一個(gè)jetty服務(wù)器),查看接口是否發(fā)布成功,如里瀏覽器頁面顯示下面內(nèi)容,證明接口發(fā)布成功 Java代碼 1.
34、160; <wsdl:definitions name="IHelloWorldService" targetNamespace=" 2. <wsdl:types> 3. <xsd:schema attributeFormDefault="unqualified" elementFormDefault="unqualified" targetNamespace="
35、0;4. <xsd:element name="sayHi" type="tns:sayHi"/> 5. <xsd:complexType name="sayHi"> 6. <xsd:sequence> 7. <xsd:element minOccurs="0" name="text" type="xsd:stri
36、ng"/> 8. </xsd:sequence> 9. </xsd:complexType> 10. <xsd:element name="sayHiResponse" type="tns:sayHiResponse"/> 11. <xsd:complexType name="sayHiResponse"> 12. <
37、xsd:sequence> 13. <xsd:element minOccurs="0" name="return" type="xsd:string"/> 14. </xsd:sequence> 15. </xsd:complexType> 16. </xsd:schema> 17. </wsdl:types>
38、0; 18. <wsdl:message name="sayHi"> 19. <wsdl:part element="tns:sayHi" name="parameters"> 20. </wsdl:part> 21. </wsdl:message> 22. <wsdl:message na
39、me="sayHiResponse"> 23. <wsdl:part element="tns:sayHiResponse" name="parameters"> 24. </wsdl:part> 25. </wsdl:message> 26. <wsdl:portType name="IHelloWorl
40、d"> 27. <wsdl:operation name="sayHi"> 28. <wsdl:input message="tns:sayHi" name="sayHi"> 29. </wsdl:input> 30. <wsdl:output message="tns:sayHiRes
41、ponse" name="sayHiResponse"> 31. </wsdl:output> 32. </wsdl:operation> 33. </wsdl:portType> 34. <wsdl:binding name="IHelloWorldServiceSoapBinding" type="tns:IHe
42、lloWorld"> 35. <soap:binding style="document" transport="/soap/http"/> 36. <wsdl:operation name="sayHi"> 37. <soap:operation soapAction="" style="
43、document"/> 38. <wsdl:input name="sayHi"> 39. <soap:body use="literal"/> 40. </wsdl:input> 41. <wsdl:output name="sayHiResponse"> 42. <soap:body use="
44、literal"/> 43. </wsdl:output> 44. </wsdl:operation> 45. </wsdl:binding> 46. <wsdl:service name="IHelloWorldService"> 47. <wsdl:port binding="tns:IHelloWorldServiceSoapBinding"
45、 name="IHelloWorldPort"> 48. <soap:address location="http:/localhost:9000/HelloWorld"/> 49. </wsdl:port> 50. </wsdl:service> 51. </wsdl:definitions> <wsdl:definitions name="IH
46、elloWorldService" targetNamespace="<wsdl:types><xsd:schema attributeFormDefault="unqualified" elementFormDefault="unqualified" targetNamespace="<xsd:element name="sayHi" type="tns:sayHi"/><xsd:complexType name="sayHi"
47、><xsd:sequence><xsd:element minOccurs="0" name="text" type="xsd:string"/></xsd:sequence></xsd:complexType><xsd:element name="sayHiResponse" type="tns:sayHiResponse"/><xsd:complexType name="sayHiResponse"&
48、gt;<xsd:sequence><xsd:element minOccurs="0" name="return" type="xsd:string"/></xsd:sequence></xsd:complexType></xsd:schema></wsdl:types><wsdl:message name="sayHi"><wsdl:part element="tns:sayHi" name="
49、parameters"> </wsdl:part></wsdl:message><wsdl:message name="sayHiResponse"><wsdl:part element="tns:sayHiResponse" name="parameters"> </wsdl:part></wsdl:message><wsdl:portType name="IHelloWorld"><wsdl:operati
50、on name="sayHi"><wsdl:input message="tns:sayHi" name="sayHi"> </wsdl:input><wsdl:output message="tns:sayHiResponse" name="sayHiResponse"> </wsdl:output></wsdl:operation></wsdl:portType><wsdl:binding name=&quo
51、t;IHelloWorldServiceSoapBinding" type="tns:IHelloWorld"><soap:binding style="document" transport="/soap/http"/><wsdl:operation name="sayHi"><soap:operation soapAction="" style="document"/>&
52、lt;wsdl:input name="sayHi"><soap:body use="literal"/></wsdl:input><wsdl:output name="sayHiResponse"><soap:body use="literal"/></wsdl:output></wsdl:operation></wsdl:binding><wsdl:service name="IHelloWorldServ
53、ice"><wsdl:port binding="tns:IHelloWorldServiceSoapBinding" name="IHelloWorldPort"><soap:address location="http:/localhost:9000/HelloWorld"/></wsdl:port></wsdl:service></wsdl:definitions> 最后,運(yùn)行客戶端程序,看看效果如果。 &
54、#160; 這一節(jié)就講到此為止,下節(jié)對(duì)WSDL定義進(jìn)行講解,便于對(duì)上面這個(gè)Demo進(jìn)行很好的消化,同時(shí)對(duì)后面章節(jié)啟個(gè)輔塾作用。WebService CXF學(xué)習(xí)(入門篇3):WSDL描述由于網(wǎng)上有很多相關(guān)這方面的資料,在這里我就轉(zhuǎn)載 本文初步介紹了Web Service 'stack'中對(duì)于Web服務(wù)即時(shí)裝配,自動(dòng)集成起著關(guān)鍵作用的WSDL規(guī)范,首先介紹了WSDL的作用和意義,其次對(duì)WSDL文檔的結(jié)構(gòu)作出概要地介紹,對(duì)每個(gè)元素的作用作了探討,分析了其開放和復(fù)用的體系設(shè)計(jì)的思想,最后通過一個(gè)實(shí)例詳細(xì)說明了WSDL的工作模式。
55、60; 本文所引用的資源主要包括兩類,一類是Web服務(wù)的技術(shù)資源網(wǎng)站,包含了大量Web服務(wù)的技術(shù)信息,另一類是Web服務(wù)“stack"系列技術(shù)規(guī)范,他們是一個(gè)整體的技術(shù)體系,包括UDDI、SOAP、WSDL、XML等。本文的最后給出了這些資源的鏈接,有興趣的讀者可以通過這些資源鏈接找到所需的內(nèi)容。 Web Service "Stack" 在我的先前的文章中,我已經(jīng)介紹過Web服務(wù)的整個(gè)技術(shù)體系Web Service "stack",如下圖: Figure 1. Web Service
56、 "stack" 其中,綠色部分是先前已經(jīng)定義好的并且廣泛使用的傳輸層和網(wǎng)絡(luò)層的標(biāo)準(zhǔn):IP、HTTP、SMTP等。而藍(lán)色部分是目前開發(fā)的Web服務(wù)的相關(guān)標(biāo)準(zhǔn)協(xié)議,包括服務(wù)調(diào)用協(xié)議SOAP、服務(wù)描述協(xié)議WSDL和服務(wù)發(fā)現(xiàn)/集成協(xié)議UDDI,以及服務(wù)工作流描述語言WSFL。而橙色部分描述的是更高層的待開發(fā)的關(guān)于路由、可靠性以及事務(wù)等方面的協(xié)議。黃色部分是各個(gè)協(xié)議層的公用機(jī)制,這些機(jī)制一般由外部的正交機(jī)制來完成。 其中,一個(gè)可以使用的Web服務(wù)應(yīng)當(dāng)按照需要選用若干層次的功能,而無需所有的特性。但是無論如何為了實(shí)現(xiàn)一個(gè)一般意義上的Web服務(wù),具備Web服務(wù)的基礎(chǔ)特性:跨平臺(tái)調(diào)用和接
57、口可機(jī)器識(shí)別,那么必需使用WSDL和SOAP。SOAP是用來最終完成Web服務(wù)調(diào)用的,而WSDL則是用于描述如何使用 SOAP來調(diào)用Web服務(wù)的。 WSDL 是一種XML Application,他將Web服務(wù)描述定義為一組服務(wù)訪問點(diǎn),客戶端可以通過這些服務(wù)訪問點(diǎn)對(duì)包含面向文檔信息或面向過程調(diào)用的服務(wù)進(jìn)行訪問(類似遠(yuǎn)程過程調(diào)用)。WSDL首先對(duì)訪問的操作和訪問時(shí)使用的請(qǐng)求/響應(yīng)消息進(jìn)行抽象描述,然后將其綁定到具體的傳輸協(xié)議和消息格式上以最終定義具體部署的服務(wù)訪問點(diǎn)。相關(guān)的具體部署的服務(wù)訪問點(diǎn)通過組合就成為抽象的Web服務(wù)。
58、0; 在具體使用中,我們可以對(duì) WSDL 進(jìn)行擴(kuò)展(類似SOAP的可擴(kuò)展性),這樣無論通信時(shí)使用何種消息格式或網(wǎng)絡(luò)協(xié)議,都可以對(duì)服務(wù)訪問點(diǎn)及其使用的消息格式進(jìn)行描述。在WSDL的框架中,可以使用任意的消息格式和網(wǎng)絡(luò)協(xié)議,如同SOAP中可以使用任意的網(wǎng)絡(luò)協(xié)議一樣。在WSDL規(guī)范中,定義了如何使用SOAP消息格式、HTTP GET/POST消息格式以及MIME格式來完成Web服務(wù)交互的規(guī)范。 WSDL概述 由于通信協(xié)議和消息格式在 Web 技術(shù)圈子里已經(jīng)達(dá)到了標(biāo)準(zhǔn)化,我們知道在通常的開發(fā)過程中,對(duì)于對(duì)象的Interface一定具備相應(yīng)的SDK描述文檔,Web服
59、務(wù)也是一種對(duì)象,只不過它是被部署在Web上而已。很自然的,我們也完全需要有對(duì)Web服務(wù)這個(gè)對(duì)象的界面的SDK描述文檔。然而這兩者又不盡相同,一來目前在Web上的應(yīng)用已經(jīng)完全接受了XML這個(gè)基本的標(biāo)準(zhǔn),基本上所有新出臺(tái)的技術(shù)都是基于XML標(biāo)準(zhǔn)的,二來Web服務(wù)的目標(biāo)是即時(shí)裝配,松散耦合以及自動(dòng)集成的,這意味著 SDK描述文檔應(yīng)當(dāng)是具備被機(jī)器識(shí)別的能力的。 也就是說,對(duì)于使用標(biāo)準(zhǔn)化的消息格式/通信協(xié)議的Web服務(wù),它需要以某種結(jié)構(gòu)化的方式(即XML)對(duì)Web服務(wù)的調(diào)用/通信加以描述,而且實(shí)現(xiàn)這一點(diǎn)也顯得非常重要,這是Web服務(wù)即時(shí)裝配的基本保證。WSDL正是這
60、樣一種描述語言,WSDL 定義了一套基于 XML的語法,將Web服務(wù)描述為能夠進(jìn)行消息交換的服務(wù)訪問點(diǎn)的集合,從而滿足了這種需求。WSDL 服務(wù)定義為分布式系統(tǒng)提供了可機(jī)器識(shí)別的SDK文檔,并且可用于描述自動(dòng)執(zhí)行應(yīng)用程序通信中所涉及的細(xì)節(jié)。 WSDL 文檔將Web服務(wù)定義為服務(wù)訪問點(diǎn)或端口的集合。在 WSDL 中,由于服務(wù)訪問點(diǎn)和消息的抽象定義已從具體的服務(wù)部署或數(shù)據(jù)格式綁定中分離出來,因此可以對(duì)抽象定義進(jìn)行再次使用:消息,指對(duì)交換數(shù)據(jù)的抽象描述;而端口類型,指操作的抽象集合。用于特定端口類型的具體協(xié)議和數(shù)據(jù)格式規(guī)范構(gòu)成了可以再次使用的綁定。將Web訪問地
61、址與可再次使用的綁定相關(guān)聯(lián),可以定義一個(gè)端口,而端口的集合則定義為服務(wù)。因此,WSDL 文檔在Web服務(wù)的定義中使用下列元素: * Types - 數(shù)據(jù)類型定義的容器,它使用某種類型系統(tǒng)(一般地使用XML Schema中的類型系統(tǒng))。 * Message - 通信消息的數(shù)據(jù)結(jié)構(gòu)的抽象類型化定義。使用Types所定義的類型來定義整個(gè)消息的數(shù)據(jù)結(jié)構(gòu)。 * Operation - 對(duì)服務(wù)中所支持的操作的抽象描述,一般單個(gè)Operation描述了一個(gè)訪問入口的請(qǐng)求/響應(yīng)消息對(duì)。
62、; * PortType - 對(duì)于某個(gè)訪問入口點(diǎn)類型所支持的操作的抽象集合,這些操作可以由一個(gè)或多個(gè)服務(wù)訪問點(diǎn)來支持。 * Binding - 特定端口類型的具體協(xié)議和數(shù)據(jù)格式規(guī)范的綁定。 * Port - 定義為協(xié)議/數(shù)據(jù)格式綁定與具體Web訪問地址組合的單個(gè)服務(wù)訪問點(diǎn)。 * Service - 相關(guān)服務(wù)訪問點(diǎn)的集合。 大家可以參考下圖,來理解一下WSDL文檔的結(jié)構(gòu)組織: Figure 2. WSDL元素的對(duì)象結(jié)構(gòu)示意圖
63、; 其中,Types是一個(gè)數(shù)據(jù)類型定義的容器,包含了所有在消息定義中需要的XML元素的類型定義,我將在今后的文章中結(jié)合XML Schema來詳細(xì)說明如何進(jìn)行類型定義。 Message具體定義了在通信中使用的消息的數(shù)據(jù)結(jié)構(gòu),Message元素包含了一組Part元素,每個(gè)Part元素都是最終消息的一個(gè)組成部分,每個(gè) Part都會(huì)引用一個(gè)DataType來表示它的結(jié)構(gòu)。Part元素不支持嵌套(可以使用DataType來完成這方面的需要),都是并列出現(xiàn)。 PortType具體定義了一種服務(wù)訪問入口的類型,何謂訪問入口的類型呢?
64、就是傳入/傳出消息的模式及其格式。一個(gè)PortType可以包含若干個(gè) Operation,而一個(gè)Operation則是指訪問入口支持的一種類型的調(diào)用。在WSDL里面支持四種訪問入口調(diào)用的模式: 1. 單請(qǐng)求; 2. 單響應(yīng); 3. 請(qǐng)求/響應(yīng); 4. 響應(yīng)/請(qǐng)求。 在這里請(qǐng)求指的是從客戶端到Web服務(wù)端,而響應(yīng)指的是從Web服務(wù)端到客戶端。PortType的定義中會(huì)引用消息定義部分的一個(gè)到兩個(gè)消息,作為請(qǐng)求或響應(yīng)消息的格式。比如,一個(gè)股票查詢的訪問入口可
65、能就會(huì)支持兩種請(qǐng)求消息,一種請(qǐng)求消息中指明股票代碼,而另一種請(qǐng)求消息中則會(huì)指明股票的名稱,響應(yīng)消息可能都是股票的價(jià)格等等。 以上三種結(jié)構(gòu)描述了調(diào)用Web服務(wù)的抽象定義,這三部分與具體Web服務(wù)部署細(xì)節(jié)無關(guān),是可復(fù)用的描述(每個(gè)層次都可以復(fù)用)。如果與一般的對(duì)象語言做比較的話,這部分可以堪稱是IDL描述的對(duì)象,描述了對(duì)象的接口標(biāo)準(zhǔn),但是到底對(duì)象是用哪種語言實(shí)現(xiàn),遵從哪種平臺(tái)的細(xì)節(jié)規(guī)范,被部署在哪臺(tái)機(jī)器上則是后面的元素所描述的。 Service描述的是一個(gè)具體的被部署的Web服務(wù)所提供的所有訪問入口的部署細(xì)節(jié),一個(gè)Serv
66、ice往往會(huì)包含多個(gè)服務(wù)訪問入口,而每個(gè)訪問入口都會(huì)使用一個(gè)Port元素來描述。 Port描述的是一個(gè)服務(wù)訪問入口的部署細(xì)節(jié),包括通過哪個(gè)Web地址(URL)來訪問,應(yīng)當(dāng)使用怎樣的消息調(diào)用模式來訪問等。其中消息調(diào)用模式則是使用Binding結(jié)構(gòu)來表示。 Binding結(jié)構(gòu)定義了某個(gè)PortType與某一種具體的網(wǎng)絡(luò)傳輸協(xié)議或消息傳輸協(xié)議相綁定,從這一層次開始,描述的內(nèi)容就與具體服務(wù)的部署相關(guān)了。比如可以將PortType與SOAP/HTTP綁定,也可以將PortType與MIME/SMTP相綁定等。
67、60; 在介紹了WSDL的主要元素之后,大家會(huì)發(fā)現(xiàn),WSDL的設(shè)計(jì)理念完全繼承了以XML為基礎(chǔ)的當(dāng)代Web技術(shù)標(biāo)準(zhǔn)的一貫設(shè)計(jì)理念:開放。WSDL允許通過擴(kuò)展使用其他的類型定義語言(不光是XML Schema),允許使用多種網(wǎng)絡(luò)傳輸協(xié)議和消息格式(不光是在規(guī)范中定義的這些:SOAP/HTTP,HTTP-GET/POST以及MIME等)。同時(shí)WSDL也應(yīng)用了當(dāng)代軟件工程中的復(fù)用理念,分離了抽象定義層和具體部署層,使得抽象定義層的復(fù)用性大大增加。比如我們可以先使用抽象定義層為一類 Web服務(wù)進(jìn)行抽象定義(比如UDDI Registry,抽象定義肯定是完全一致的遵循了UDDI規(guī)范),而不同
68、的運(yùn)營公司可以采用不同的具體部署層的描述結(jié)合抽象定義完成其自身的Web服務(wù)的描述。 WSDL文檔示例 下例是一個(gè)提供股票報(bào)價(jià)的簡單Web服務(wù)的 WSDL 定義。該服務(wù)支持名為 GetLastTradePrice 的單一操作,這個(gè)操作是通過在 HTTP 上運(yùn)行 SOAP 1.1 協(xié)議來實(shí)現(xiàn)的。該請(qǐng)求接受一個(gè)類型為字符串的 tickerSymbol,并返回類型為浮點(diǎn)數(shù)的價(jià)格。 Java代碼 1. <?xml version="1.0"?> 2. <definitions name
69、="StockQuote" 3. targetNamespace="4. xmlns:tns="5. &
70、#160; xmlns:xsd1="6. xmlns:soap="/wsdl/soap/" 7. xmlns="http:/schemas.x
71、/wsdl/"> 8. 9. 10. <types> 11. <schema targetNamespace="12.
72、60; xmlns="/1999/XMLSchema"> 13. <element name="TradePriceRequest"> 14. <complexType> 15.
73、 <all> 16. <element name="tickerSymbol" type="string"/> 17.
74、 </all> 18. </complexType> 19. </element> 20. <element name="TradePriceResult">
75、160;21. <complexType> 22. <all> 23. <element name="price" typ
76、e="float"/> 24. </all> 25. </complexType> 26. </element> 27.
77、0; </schema> 28. </types> <?xml version="1.0"?><definitions name="StockQuote" targetNamespace=" xmlns:tns=" xmlns:xsd1=" xmlns:soap="/wsdl/soap/" xmlns="http:/schem
78、/wsdl/"> <types> <schema targetNamespace=" xmlns="/1999/XMLSchema"> <element name="TradePriceRequest"> <complexType> <all> <element name="tickerSymbol" type="string"/> </all>
79、</complexType> </element> <element name="TradePriceResult"> <complexType> <all> <element name="price" type="float"/> </all> </complexType> </element> </schema> </types> 上面這部分是數(shù)據(jù)類型的定義,其中為
80、定義了兩個(gè)元素的結(jié)構(gòu): * TradePriceRequest(交易價(jià)格請(qǐng)求): 將該元素定義為包含一個(gè)字符串元素(tickerSymbol)的復(fù)合類型元素。 * TradePriceResult(交易價(jià)格): 將該元素定義為一個(gè)包含一個(gè)浮點(diǎn)數(shù)元素(price)的復(fù)合類型元素。 Java代碼 1. <message name="GetLastTradePriceInput"> 2. <part
81、0;name="body" element="xsd1:TradePriceRequest"/> 3. </message> 4. 5. <message name="GetLastTradePriceOutput"> 6. <part name="body
82、" element="xsd1:TradePriceResult"/> 7. </message> <message name="GetLastTradePriceInput"> <part name="body" element="xsd1:TradePriceRequest"/> </message> <message name="GetLastTradePriceOutput"> <part name="body" element="xsd1:TradePriceResult"/> </message> 這部分是消息格式的
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二年級(jí)語文工作計(jì)劃
- 勞動(dòng)力計(jì)劃及人員配備
- 2024-2025年中國化肥電商行業(yè)市場前景預(yù)測及投資戰(zhàn)略研究報(bào)告
- 大班班級(jí)工作計(jì)劃
- 幼兒園中班班級(jí)教育教案模板
- 個(gè)人自我介紹集錦15篇
- 市場人員年度工作總結(jié)十篇
- 《傅雷家書》讀書筆記
- 個(gè)人原因離職申請(qǐng)書11篇
- 后備干部培養(yǎng)參考計(jì)劃范文
- 水泥行業(yè)數(shù)字化轉(zhuǎn)型服務(wù)方案
- 深圳市南山區(qū)2024-2025學(xué)年第一學(xué)期期末教學(xué)質(zhì)量檢測九年級(jí)物理 24-25上九年級(jí)物理
- 應(yīng)急設(shè)施設(shè)備和物資儲(chǔ)備管理制度(4篇)
- 團(tuán)委書記個(gè)人工作總結(jié)
- 高危多發(fā)性骨髓瘤診斷與治療中國專家共識(shí)(2024年版)解讀
- 英語語法與長難句理解知到智慧樹章節(jié)測試課后答案2024年秋山東石油化工學(xué)院
- 2025年新高考語文古詩文理解性默寫(含新高考60篇)
- 2024版房屋市政工程生產(chǎn)安全重大事故隱患判定標(biāo)準(zhǔn)內(nèi)容解讀
- 江蘇省鎮(zhèn)江市實(shí)驗(yàn)學(xué)校2023-2024學(xué)年九年級(jí)上學(xué)期期末考試化學(xué)試卷
- 期末 (試題) -2024-2025學(xué)年人教PEP版(2024)英語三年級(jí)上冊(cè)
- GB/T 32066-2024煤基費(fèi)托合成液體石蠟
評(píng)論
0/150
提交評(píng)論