webservice實現(xiàn)springboot項目間接口調(diào)用與對象傳遞示例
一、百度百科
Web Service是一個平臺獨立的,低耦合的,自包含的、基于可編程的web的應(yīng)用程序,可使用開放的XML(標準通用標記語言下的一個子集)標準來描述、發(fā)布、發(fā)現(xiàn)、協(xié)調(diào)和配置這些應(yīng)用程序,用于開發(fā)分布式的交互操作的應(yīng)用程序。
Web Service技術(shù), 能使得運行在不同機器上的不同應(yīng)用無須借助附加的、專門的第三方軟件或硬件, 就可相互交換數(shù)據(jù)或集成。依據(jù)Web Service規(guī)范實施的應(yīng)用之間, 無論它們所使用的語言、 平臺或內(nèi)部協(xié)議是什么, 都可以相互交換數(shù)據(jù)。Web Service是自描述、 自包含的可用網(wǎng)絡(luò)模塊, 可以執(zhí)行具體的業(yè)務(wù)功能。Web Service也很容易部署, 因為它們基于一些常規(guī)的產(chǎn)業(yè)標準以及已有的一些技術(shù),諸如標準通用標記語言下的子集XML、HTTP。Web Service減少了應(yīng)用接口的花費。Web Service為整個企業(yè)甚至多個組織之間的業(yè)務(wù)流程的集成提供了一個通用機制。
二、webservice的技術(shù)支持
Web Service平臺需要一套協(xié)議來實現(xiàn)分布式應(yīng)用程序的創(chuàng)建。任何平臺都有它的數(shù)據(jù)表示方法和類型系統(tǒng)。要實現(xiàn)互操作性,Web Service平臺必須提供一套標準的類型系統(tǒng),用于溝通不同平臺、編程語言和組件模型中的不同類型系統(tǒng)。這些協(xié)議有:
1、XML和XSD
XML是一種用于標記電子文件使其具有結(jié)構(gòu)性的標記語言,是Web Service平臺中表示數(shù)據(jù)的基本格式。除了易于建立和易于分析外,XML主要的優(yōu)點在于它既與平臺無關(guān),又與廠商無關(guān)。XML遵循 W3C 規(guī)范的語法要求,形式與內(nèi)容分離,具有良好的自描述性,同時易于擴展,擁有豐富的第三方開發(fā)庫,非常適合在不同架構(gòu)的系統(tǒng)之間進行信息傳輸使用。隨著XML的應(yīng)用越來越廣泛,在眾多應(yīng)用場景下,XML憑借其優(yōu)點已經(jīng)成為事實上的數(shù)據(jù)交換標準。 XML是由萬維網(wǎng)協(xié)會(W3C)創(chuàng)建,W3C制定的XML SchemaXSD定義了一套標準的數(shù)據(jù)類型,并給出了一種語言來擴展這套數(shù)據(jù)類型。
Web Service平臺是用XSD來作為數(shù)據(jù)類型系統(tǒng)的。當你用某種語言如VB. NET或C# 來構(gòu)造一個Web Service時,為了符合Web Service標準,所有你使用的數(shù)據(jù)類型都必須被轉(zhuǎn)換為XSD類型。如想讓它使用在不同平臺和不同軟件的不同組織間傳遞,還需要用某種東西將它包裝起來。這種東西就是一種協(xié)議,如 SOAP。
2、SOAP
SOAP即簡單對象訪問協(xié)議(Simple Object Access Protocol),它是用于交換XML(標準通用標記語言下的一個子集)編碼信息的輕量級協(xié)議,能夠在不同信息系統(tǒng)之間交換結(jié)構(gòu)化數(shù)據(jù),是Web Service的一種主流實現(xiàn)形式 。它有三個主要方面:XML-envelope為描述信息內(nèi)容和如何處理內(nèi)容定義了框架,將程序?qū)ο缶幋a成為XML對象的規(guī)則,執(zhí)行遠程過程調(diào)用(RPC)的約定。SOAP可以運行在任何其他傳輸協(xié)議上。
SOAP基于HTTP協(xié)議定義了一個框架,描述消息中的內(nèi)容是什么、是誰發(fā)送的、誰應(yīng)當接受并處理它以及如何處理它們。它通過定義SOAP信封(Envelop)實現(xiàn)數(shù)據(jù)格式的標準化,將XML數(shù)據(jù)封裝于信封之中進行信息交互,使得異構(gòu)的系統(tǒng)間能夠進行互操作。
Web Service 希望實現(xiàn)不同的系統(tǒng)之間能夠用“軟件-軟件對話”的方式相互調(diào)用,打破了軟件應(yīng)用、網(wǎng)站和各種設(shè)備之間的格格不入的狀態(tài),實現(xiàn)“基于Web無縫集成”的目標。
3、WSDL
Web Service描述語言WSDL 就是用機器能閱讀的方式提供的一個正式描述文檔而基于XML(標準通用標記語言下的一個子集)的語言,用于描述Web Service及其函數(shù)、參數(shù)和返回值。因為是基于XML的,所以WSDL既是機器可閱讀的,又是人可閱讀的。
4、UDDI
UDDI 的目的是為電子商務(wù)建立標準;UDDI是一套基于Web的、分布式的、為Web Service提供的、信息注冊中心的實現(xiàn)標準規(guī)范,同時也包含一組使企業(yè)能將自身提供的Web Service注冊,以使別的企業(yè)能夠發(fā)現(xiàn)的訪問協(xié)議的實現(xiàn)標準。
5、調(diào)用RPC與消息傳遞
Web Service本身其實是在實現(xiàn)應(yīng)用程序間的通信。我們有兩種應(yīng)用程序通信的方法:RPC遠程過程調(diào)用 和消息傳遞。使用RPC的時候,客戶端的概念是調(diào)用服務(wù)器上的遠程過程,通常方式為實例化一個遠程對象并調(diào)用其方法和屬性。RPC系統(tǒng)試圖達到一種位置上的透明性:服務(wù)器暴露出遠程對象的接口,而客戶端就好像在本地使用的這些對象的接口一樣,這樣就隱藏了底層的信息,客戶端也就根本不需要知道對象是在哪臺機器上。
三、webservice的應(yīng)用場景和弊端
1、webservice的應(yīng)用場景
長項1:跨防火墻的通信
如果應(yīng)用程序有成千上萬的用戶,而且分布在世界各地,那么客戶端和服務(wù)器之間的通信將是一個棘手的問題。因為客戶端和服務(wù)器之間通常會有防火墻或者代理服務(wù)器。在這種情況下,使用DCOM就不是那么簡單,通常也不便于把客戶端程序發(fā)布到數(shù)量如此龐大的每一個用戶手中。傳統(tǒng)的做法是,選擇用瀏覽器作為客戶端,寫下一大堆ASP頁面,把應(yīng)用程序的中間層暴露給最終用戶。這樣做的結(jié)果是開發(fā)難度大,程序很難維護。
如果中間層組件換成WebService的話,就可以從用戶界面直接調(diào)用中間層組件,從而省掉建立ASP頁面的那一步。要調(diào)用WebService,可以直接使用MicrosoftSOAPToolkit或.NET這樣的SOAP客戶端,也可以使用自己開發(fā)的SOAP客戶端,然后把它和應(yīng)用程序連接起來。不僅縮短了開發(fā)周期,還減少了代碼復(fù)雜度,并能夠增強應(yīng)用程序的可維護性。同時,應(yīng)用程序也不再需要在每次調(diào)用中間層組件時,都跳轉(zhuǎn)到相應(yīng)的“結(jié)果頁”。
企業(yè)級的應(yīng)用程序開發(fā)者都知道,企業(yè)里經(jīng)常都要把用不同語言寫成的、在不同平臺上運行的各種程序集成起來,而這種集成將花費很大的開發(fā)力量。應(yīng)用程序經(jīng)常需要從運行在IBM主機上的程序中獲取數(shù)據(jù);或者把數(shù)據(jù)發(fā)送到主機或UNIX應(yīng)用程序中去。即使在同一個平臺上,不同軟件廠商生產(chǎn)的各種軟件也常常需要集成起來。通過WebService,應(yīng)用程序可以用標準的方法把功能和數(shù)據(jù)“暴露”出來,供其它應(yīng)用程序使用。
長項2:應(yīng)用程序集成
企業(yè)級的應(yīng)用程序開發(fā)者都知道,企業(yè)里經(jīng)常都要把用不同語言寫成的、在不同平臺上運行的各種程序集成起來,而這種集成將花費很大的開發(fā)力量。應(yīng)用程序經(jīng)常需要從運行在IBM主機上的程序中獲取數(shù)據(jù);或者把數(shù)據(jù)發(fā)送到主機或UNIX應(yīng)用程序中去。即使在同一個平臺上,不同軟件廠商生產(chǎn)的各種軟件也常常需要集成起來。通過WebService,應(yīng)用程序可以用標準的方法把功能和數(shù)據(jù)“暴露”出來,供其它應(yīng)用程序使用。
例如,有一個訂單登錄程序,用于登錄從客戶來的新訂單,包括客戶信息、發(fā)貨地址、數(shù)量、價格和付款方式等內(nèi)容;還有一個訂單執(zhí)行程序,用于實際貨物發(fā)送的管理。這兩個程序來自不同軟件廠商。一份新訂單進來之后,訂單登錄程序需要通知訂單執(zhí)行程序發(fā)送貨物。通過在訂單執(zhí)行程序上面增加一層WebService,訂單執(zhí)行程序可以把“AddOrder”函數(shù)“暴露”出來。這樣,每當有新訂單到來時,訂單登錄程序就可以調(diào)用這個函數(shù)來發(fā)送貨物了。
長項3:B2B的集成
用WebService集成應(yīng)用程序,可以使公司內(nèi)部的商務(wù)處理更加自動化。但當交易跨越供應(yīng)商和客戶、突破公司的界限時會怎么樣呢?跨公司的商務(wù)交易集成通常叫做B2B集成。
WebService是B2B集成成功的關(guān)鍵。通過WebService,公司可以把關(guān)鍵的商務(wù)應(yīng)用“暴露”給指定的供應(yīng)商和客戶。例如,把電子下單系統(tǒng)和電子發(fā)票系統(tǒng)“暴露”出來,客戶就可以以電子的方式發(fā)送訂單,供應(yīng)商則可以以電子的方式發(fā)送原料采購發(fā)票。當然,這并不是一個新的概念,EDI(電子文檔交換)早就是這樣了。但是,WebService的實現(xiàn)要比EDI簡單得多,而且WebService運行在Internet上,在世界任何地方都可輕易實現(xiàn),其運行成本就相對較低。不過,WebService并不像EDI那樣,是文檔交換或B2B集成的完整解決方案。WebService只是B2B集成的一個關(guān)鍵部分,還需要許多其它的部分才能實現(xiàn)集成。
用WebService來實現(xiàn)B2B集成的最大好處在于可以輕易實現(xiàn)互操作性。只要把商務(wù)邏輯“暴露”出來,成為WebService,就可以讓任何指定的合作伙伴調(diào)用這些商務(wù)邏輯,而不管他們的系統(tǒng)在什么平臺上運行,使用什么開發(fā)語言。這樣就大大減少了花在B2B集成上的時間和成本,讓許多原本無法承受EDI的中小企業(yè)也能實現(xiàn)B2B集成。
軟件和數(shù)據(jù)重用
軟件重用是一個很大的主題,重用的形式很多,重用的程度有大有小。最基本的形式是源代碼模塊或者類一級的重用,另一種形式是二進制形式的組件重用。
當前,像表格控件或用戶界面控件這樣的可重用軟件組件,在市場上都占有很大的份額。但這類軟件的重用有一個很大的限制,就是重用僅限于代碼,數(shù)據(jù)不能重用。原因在于,發(fā)布組件甚至源代碼都比較容易,但要發(fā)布數(shù)據(jù)就沒那么容易,除非是不會經(jīng)常變化的靜態(tài)數(shù)據(jù)。
webService在允許重用代碼的同時,可以重用代碼背后的數(shù)據(jù)。使用WebService,再也不必像以前那樣,要先從第三方購買、安裝軟件組件,再從應(yīng)用程序中調(diào)用這些組件;只需要直接調(diào)用遠端的WebService就可以了。舉個例子,要在應(yīng)用程序中確認用戶輸入的地址,只需把這個地址直接發(fā)送給相應(yīng)的WebService,這個WebService就會幫你查閱街道地址、城市、省區(qū)和郵政編碼等信息,確認這個地址是否在相應(yīng)的郵政編碼區(qū)域。WebService的提供商可以按時間或使用次數(shù)來對這項服務(wù)進行收費。這樣的服務(wù)要通過組件重用來實現(xiàn)是不可能的,那樣的話你必須下載并安裝好包含街道地址、城市、省區(qū)和郵政編碼等信息的數(shù)據(jù)庫,而且這個數(shù)據(jù)庫還是不能實時更新的。
另一種軟件重用的情況是,把好幾個應(yīng)用程序的功能集成起來。例如,要建立一個局域網(wǎng)上的門戶站點應(yīng)用,讓用戶既可以查詢聯(lián)邦快遞包裹,查看股市行情,又可以管理自己的日程安排,還可以在線購買電影票?,F(xiàn)在Web上有很多應(yīng)用程序供應(yīng)商,都在其應(yīng)用中實現(xiàn)了這些功能。一旦他們把這些功能都通過WebService“暴露”出來,就可以非常容易地把所有這些功能都集成到你的門戶站點中,為用戶提供一個統(tǒng)一的、友好的界面。
將來,許多應(yīng)用程序都會利用WebService,把當前基于組件的應(yīng)用程序結(jié)構(gòu)擴展為組件/WebService的混合結(jié)構(gòu),可以在應(yīng)用程序中使用第三方的WebService提供的功能,也可以把自己的應(yīng)用程序功能通過WebService提供給別人。兩種情況下,都可以重用代碼和代碼背后的數(shù)據(jù)。
2、webservice的弊端
短處1:單機應(yīng)用程序
目前,企業(yè)和個人還使用著很多桌面應(yīng)用程序。其中一些只需要與本機上的其它程序通信。在這種情況下,最好就不要用WebService,只要用本地的API就可以了。COM非常適合于在這種情況下工作,因為它既小又快。運行在同一臺服務(wù)器上的服務(wù)器軟件也是這樣。最好直接用COM或其它本地的API來進行應(yīng)用程序間的調(diào)用。當然WebService也能用在這些場合,但那樣不僅消耗太大,而且不會帶來任何好處。
短處2:局域網(wǎng)的同構(gòu)應(yīng)用程序
在許多應(yīng)用中,所有的程序都是用VB或VC開發(fā)的,都在windows平臺下使用COM,都運行在同一個局域網(wǎng)上。例如,有兩個服務(wù)器應(yīng)用程序需要相互通信,或者有一個Win32或WinForm的客戶程序要連接局域網(wǎng)上另一個服務(wù)器的程序。在這些程序里,使用DCOM會比SOAP/http有效得多。與此相類似,如果一個.NET程序要連接到局域網(wǎng)上的另一個.NET程序,應(yīng)該使用.NETremoting。有趣的是,在.NETremoting中,也可以指定使用SOAP/http來進行WebService調(diào)用。不過最好還是直接通過TCP進行RPC調(diào)用,那樣會有效得多。
總之,只要從應(yīng)用程序結(jié)構(gòu)的角度看,有別的方法比WebService更有效、更可行,那就不要用WebService。
四、webservice代碼實例
實現(xiàn)不同項目間接口調(diào)動,并通過webservice傳遞對象數(shù)據(jù)~
服務(wù)端項目代碼
1、pom
<!--webservice--> <dependency> ? ? ?<groupId>org.springframework.boot</groupId> ? ? ?<artifactId>spring-boot-starter-web-services</artifactId> ?</dependency> ?<dependency> ? ? ?<groupId>org.apache.cxf</groupId> ? ? ?<artifactId>cxf-rt-frontend-jaxws</artifactId> ? ? ?<version>3.1.12</version> ?</dependency> ?<dependency> ? ? ?<groupId>org.apache.cxf</groupId> ? ? ?<artifactId>cxf-rt-transports-http</artifactId> ? ? ?<version>3.1.12</version> ?</dependency>
2、config配置類
package com.guor.config; import com.guor.service; import com.guor.service.implImpl; import org.apache.cxf.Bus; import org.apache.cxf.bus.spring.SpringBus; import org.apache.cxf.jaxws.EndpointImpl; import org.apache.cxf.transport.servlet.CXFServlet; import org.springframework.boot.web.servlet.ServletRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.xml.ws.Endpoint; @Configuration public class CxfConfig { ? ? @Bean ? ? public ServletRegistrationBean createServletRegistrationBean() { ? ? ? ? return new ServletRegistrationBean(new CXFServlet(), "/WebService/*"); ? ? } ? ? @Bean(name = Bus.DEFAULT_BUS_ID) ? ? public SpringBus springBus() { ? ? ? ? return new SpringBus(); ? ? } ? ? @Bean ? ? public WebService myService() { ? ? ? ? return new WebServiceImpl(); ? ? } ? ? @Bean ? ? public Endpoint endpoint() { ? ? ? ? EndpointImpl endpoint = new EndpointImpl(springBus(), myService()); ? ? ? ? endpoint.publish("/api"); ? ? ? ? return endpoint; ? ? } }
3、接口
package com.guor.service; import com.guor.entity.dto.User; import javax.jws; @WebService(name = "WebService", // 暴露服務(wù)名稱 ? ? ? ? targetNamespace = "http://service.guor.com"http:// 命名空間,一般是接口的包名倒序 ) public interface WebService { ? ? User sendInfo(User user); }
package com.guor.service.impl; import com.guor.entity.dto.User; import com.guor.service; import org.springframework.stereotype.Service; import javax.jws; @WebService(serviceName = "WebService", // 與接口中指定的服務(wù)name一致 ? ? ? ? targetNamespace = "http://service.guor.com", // 與接口中的命名空間一致,一般是接口的包名倒 ? ? ? ? endpointInterface = "com.guor.service"http:// 接口地址 ) @Service public class WebServiceImpl implements WebService { ? ? @Override ? ? public User sendInfo(User user) { ? ? ? ? return user; ? ? } }
客戶端項目代碼:
1、創(chuàng)建一個一模一樣的接口
package com.guor.service; import com.guor.entity.dto.User; import javax.jws; @WebService(name = "WebService", // 暴露服務(wù)名稱 ? ? ? ? targetNamespace = "http://service.guor.com"http:// 命名空間,一般是接口的包名倒序 ) public interface WebService { ? ? User sendInfo(User user); }
2、webservice工具類
?/** ? ? ?* webservice接口地址 ? ? ?*/ ? ? private static String address = "http://10.4.66.7:9992/MyProject/WebService/api?wsdl"; ? ? /** ? ? ?* 通過webservice發(fā)送EC企業(yè)信息 ? ? ?* @param User ? ? ?* @return ? ? ?*/ ? ? public static User sendInfo(User user) { ? ? ? ? try { ? ? ? ? ? ? // 代理工廠 ? ? ? ? ? ? JaxWsProxyFactoryBean jaxWsProxyFactoryBean = new JaxWsProxyFactoryBean(); ? ? ? ? ? ? // 設(shè)置代理地址 ? ? ? ? ? ? jaxWsProxyFactoryBean.setAddress(address); ? ? ? ? ? ? //添加用戶名密碼攔截器 ? ? ? ? ? ? //jaxWsProxyFactoryBean.getOutInterceptors().add(new LoginInterceptor("root","admin"));; ? ? ? ? ? ? // 設(shè)置接口類型 ? ? ? ? ? ? jaxWsProxyFactoryBean.setServiceClass(class); ? ? ? ? ? ? // 創(chuàng)建一個代理接口實現(xiàn) ? ? ? ? ? ? WebService service = (WebService) jaxWsProxyFactoryBean.create(); ? ? ? ? ? ? return service.sendInfo(user); ? ? ? ? } catch (Exception e) { ? ? ? ? ? ? return null; ? ? ? ? } ? ? }
到此這篇關(guān)于webservice實現(xiàn)springboot項目間接口調(diào)用與對象傳遞示例的文章就介紹到這了,更多相關(guān)springboot間接口調(diào)用與對象傳遞內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- springboot整合cxf發(fā)布webservice以及調(diào)用的方法
- SpringBoot調(diào)用第三方WebService接口的操作技巧(.wsdl與.asmx類型)
- SpringBoot項目使用?axis?調(diào)用webservice接口的實踐記錄
- SpringBoot調(diào)用第三方WebService接口的兩種方法
- SpringBoot調(diào)用對方webService接口的幾種方法示例
- springboot調(diào)用webservice-soap接口的實現(xiàn)
- springboot使用webservice發(fā)布和調(diào)用接口的實例詳解
- SpringBoot調(diào)用WebService接口方法示例代碼
相關(guān)文章
ssm框架Springmvc文件上傳實現(xiàn)代碼詳解
這篇文章主要介紹了ssm框架Springmvc文件上傳實現(xiàn)代碼詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-07-07Spring Boot 集成 Mybatis Plus 自動填充字段的實例詳解
這篇文章主要介紹了Spring Boot 集成 Mybatis Plus 自動填充字段,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03