webservice怎么實現springboot項目間接口調用與對象傳遞
這篇文章主要講解了“webservice怎么實現springboot項目間接口調用與對象傳遞”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“webservice怎么實現springboot項目間接口調用與對象傳遞”吧!
一、百度百科
Web Service是一個平臺獨立的,低耦合的,自包含的、基于可編程的web的應用程序,可使用開放的XML(標準通用標記語言下的一個子集)標準來描述、發布、發現、協調和配置這些應用程序,用于開發分布式的交互操作的應用程序。
Web Service技術, 能使得運行在不同機器上的不同應用無須借助附加的、專門的第三方軟件或硬件, 就可相互交換數據或集成。依據Web Service規范實施的應用之間, 無論它們所使用的語言、 平臺或內部協議是什么, 都可以相互交換數據。Web Service是自描述、 自包含的可用網絡模塊, 可以執行具體的業務功能。Web Service也很容易部署, 因為它們基于一些常規的產業標準以及已有的一些技術,諸如標準通用標記語言下的子集XML、HTTP。Web Service減少了應用接口的花費。Web Service為整個企業甚至多個組織之間的業務流程的集成提供了一個通用機制。
二、webservice的技術支持
Web Service平臺需要一套協議來實現分布式應用程序的創建。任何平臺都有它的數據表示方法和類型系統。要實現互操作性,Web Service平臺必須提供一套標準的類型系統,用于溝通不同平臺、編程語言和組件模型中的不同類型系統。這些協議有:
1、XML和XSD
XML是一種用于標記電子文件使其具有結構性的標記語言,是Web Service平臺中表示數據的基本格式。除了易于建立和易于分析外,XML主要的優點在于它既與平臺無關,又與廠商無關。XML遵循 W3C 規范的語法要求,形式與內容分離,具有良好的自描述性,同時易于擴展,擁有豐富的第三方開發庫,非常適合在不同架構的系統之間進行信息傳輸使用。隨著XML的應用越來越廣泛,在眾多應用場景下,XML憑借其優點已經成為事實上的數據交換標準。 XML是由萬維網協會(W3C)創建,W3C制定的XML SchemaXSD定義了一套標準的數據類型,并給出了一種語言來擴展這套數據類型。
Web Service平臺是用XSD來作為數據類型系統的。當你用某種語言如VB. NET或C# 來構造一個Web Service時,為了符合Web Service標準,所有你使用的數據類型都必須被轉換為XSD類型。如想讓它使用在不同平臺和不同軟件的不同組織間傳遞,還需要用某種東西將它包裝起來。這種東西就是一種協議,如 SOAP。
2、SOAP
SOAP即簡單對象訪問協議(Simple Object Access Protocol),它是用于交換XML(標準通用標記語言下的一個子集)編碼信息的輕量級協議,能夠在不同信息系統之間交換結構化數據,是Web Service的一種主流實現形式 。它有三個主要方面:XML-envelope為描述信息內容和如何處理內容定義了框架,將程序對象編碼成為XML對象的規則,執行遠程過程調用(RPC)的約定。SOAP可以運行在任何其他傳輸協議上。
SOAP基于HTTP協議定義了一個框架,描述消息中的內容是什么、是誰發送的、誰應當接受并處理它以及如何處理它們。它通過定義SOAP信封(Envelop)實現數據格式的標準化,將XML數據封裝于信封之中進行信息交互,使得異構的系統間能夠進行互操作。
Web Service 希望實現不同的系統之間能夠用“軟件-軟件對話”的方式相互調用,打破了軟件應用、網站和各種設備之間的格格不入的狀態,實現“基于Web無縫集成”的目標。
3、WSDL
Web Service描述語言WSDL 就是用機器能閱讀的方式提供的一個正式描述文檔而基于XML(標準通用標記語言下的一個子集)的語言,用于描述Web Service及其函數、參數和返回值。因為是基于XML的,所以WSDL既是機器可閱讀的,又是人可閱讀的。
4、UDDI
UDDI 的目的是為電子商務建立標準;UDDI是一套基于Web的、分布式的、為Web Service提供的、信息注冊中心的實現標準規范,同時也包含一組使企業能將自身提供的Web Service注冊,以使別的企業能夠發現的訪問協議的實現標準。
5、調用RPC與消息傳遞
Web Service本身其實是在實現應用程序間的通信。我們有兩種應用程序通信的方法:RPC遠程過程調用 和消息傳遞。使用RPC的時候,客戶端的概念是調用服務器上的遠程過程,通常方式為實例化一個遠程對象并調用其方法和屬性。RPC系統試圖達到一種位置上的透明性:服務器暴露出遠程對象的接口,而客戶端就好像在本地使用的這些對象的接口一樣,這樣就隱藏了底層的信息,客戶端也就根本不需要知道對象是在哪臺機器上。
三、webservice的應用場景和弊端
1、webservice的應用場景
長項1:跨防火墻的通信
如果應用程序有成千上萬的用戶,而且分布在世界各地,那么客戶端和服務器之間的通信將是一個棘手的問題。因為客戶端和服務器之間通常會有防火墻或者代理服務器。在這種情況下,使用DCOM就不是那么簡單,通常也不便于把客戶端程序發布到數量如此龐大的每一個用戶手中。傳統的做法是,選擇用瀏覽器作為客戶端,寫下一大堆ASP頁面,把應用程序的中間層暴露給最終用戶。這樣做的結果是開發難度大,程序很難維護。
如果中間層組件換成WebService的話,就可以從用戶界面直接調用中間層組件,從而省掉建立ASP頁面的那一步。要調用WebService,可以直接使用MicrosoftSOAPToolkit或.NET這樣的SOAP客戶端,也可以使用自己開發的SOAP客戶端,然后把它和應用程序連接起來。不僅縮短了開發周期,還減少了代碼復雜度,并能夠增強應用程序的可維護性。同時,應用程序也不再需要在每次調用中間層組件時,都跳轉到相應的“結果頁”。
企業級的應用程序開發者都知道,企業里經常都要把用不同語言寫成的、在不同平臺上運行的各種程序集成起來,而這種集成將花費很大的開發力量。應用程序經常需要從運行在IBM主機上的程序中獲取數據;或者把數據發送到主機或UNIX應用程序中去。即使在同一個平臺上,不同軟件廠商生產的各種軟件也常常需要集成起來。通過WebService,應用程序可以用標準的方法把功能和數據“暴露”出來,供其它應用程序使用。
長項2:應用程序集成
企業級的應用程序開發者都知道,企業里經常都要把用不同語言寫成的、在不同平臺上運行的各種程序集成起來,而這種集成將花費很大的開發力量。應用程序經常需要從運行在IBM主機上的程序中獲取數據;或者把數據發送到主機或UNIX應用程序中去。即使在同一個平臺上,不同軟件廠商生產的各種軟件也常常需要集成起來。通過WebService,應用程序可以用標準的方法把功能和數據“暴露”出來,供其它應用程序使用。
例如,有一個訂單登錄程序,用于登錄從客戶來的新訂單,包括客戶信息、發貨地址、數量、價格和付款方式等內容;還有一個訂單執行程序,用于實際貨物發送的管理。這兩個程序來自不同軟件廠商。一份新訂單進來之后,訂單登錄程序需要通知訂單執行程序發送貨物。通過在訂單執行程序上面增加一層WebService,訂單執行程序可以把“AddOrder”函數“暴露”出來。這樣,每當有新訂單到來時,訂單登錄程序就可以調用這個函數來發送貨物了。
長項3:B2B的集成
用WebService集成應用程序,可以使公司內部的商務處理更加自動化。但當交易跨越供應商和客戶、突破公司的界限時會怎么樣呢?跨公司的商務交易集成通常叫做B2B集成。
WebService是B2B集成成功的關鍵。通過WebService,公司可以把關鍵的商務應用“暴露”給指定的供應商和客戶。例如,把電子下單系統和電子發票系統“暴露”出來,客戶就可以以電子的方式發送訂單,供應商則可以以電子的方式發送原料采購發票。當然,這并不是一個新的概念,EDI(電子文檔交換)早就是這樣了。但是,WebService的實現要比EDI簡單得多,而且WebService運行在Internet上,在世界任何地方都可輕易實現,其運行成本就相對較低。不過,WebService并不像EDI那樣,是文檔交換或B2B集成的完整解決方案。WebService只是B2B集成的一個關鍵部分,還需要許多其它的部分才能實現集成。
用WebService來實現B2B集成的最大好處在于可以輕易實現互操作性。只要把商務邏輯“暴露”出來,成為WebService,就可以讓任何指定的合作伙伴調用這些商務邏輯,而不管他們的系統在什么平臺上運行,使用什么開發語言。這樣就大大減少了花在B2B集成上的時間和成本,讓許多原本無法承受EDI的中小企業也能實現B2B集成。
軟件和數據重用
軟件重用是一個很大的主題,重用的形式很多,重用的程度有大有小。最基本的形式是源代碼模塊或者類一級的重用,另一種形式是二進制形式的組件重用。
當前,像表格控件或用戶界面控件這樣的可重用軟件組件,在市場上都占有很大的份額。但這類軟件的重用有一個很大的限制,就是重用僅限于代碼,數據不能重用。原因在于,發布組件甚至源代碼都比較容易,但要發布數據就沒那么容易,除非是不會經常變化的靜態數據。
webService在允許重用代碼的同時,可以重用代碼背后的數據。使用WebService,再也不必像以前那樣,要先從第三方購買、安裝軟件組件,再從應用程序中調用這些組件;只需要直接調用遠端的WebService就可以了。舉個例子,要在應用程序中確認用戶輸入的地址,只需把這個地址直接發送給相應的WebService,這個WebService就會幫你查閱街道地址、城市、省區和郵政編碼等信息,確認這個地址是否在相應的郵政編碼區域。WebService的提供商可以按時間或使用次數來對這項服務進行收費。這樣的服務要通過組件重用來實現是不可能的,那樣的話你必須下載并安裝好包含街道地址、城市、省區和郵政編碼等信息的數據庫,而且這個數據庫還是不能實時更新的。
另一種軟件重用的情況是,把好幾個應用程序的功能集成起來。例如,要建立一個局域網上的門戶站點應用,讓用戶既可以查詢聯邦快遞包裹,查看股市行情,又可以管理自己的日程安排,還可以在線購買電影票?,F在Web上有很多應用程序供應商,都在其應用中實現了這些功能。一旦他們把這些功能都通過WebService“暴露”出來,就可以非常容易地把所有這些功能都集成到你的門戶站點中,為用戶提供一個統一的、友好的界面。
將來,許多應用程序都會利用WebService,把當前基于組件的應用程序結構擴展為組件/WebService的混合結構,可以在應用程序中使用第三方的WebService提供的功能,也可以把自己的應用程序功能通過WebService提供給別人。兩種情況下,都可以重用代碼和代碼背后的數據。
2、webservice的弊端
短處1:單機應用程序
目前,企業和個人還使用著很多桌面應用程序。其中一些只需要與本機上的其它程序通信。在這種情況下,最好就不要用WebService,只要用本地的API就可以了。COM非常適合于在這種情況下工作,因為它既小又快。運行在同一臺服務器上的服務器軟件也是這樣。最好直接用COM或其它本地的API來進行應用程序間的調用。當然WebService也能用在這些場合,但那樣不僅消耗太大,而且不會帶來任何好處。
短處2:局域網的同構應用程序
在許多應用中,所有的程序都是用VB或VC開發的,都在windows平臺下使用COM,都運行在同一個局域網上。例如,有兩個服務器應用程序需要相互通信,或者有一個Win32或WinForm的客戶程序要連接局域網上另一個服務器的程序。在這些程序里,使用DCOM會比SOAP/http有效得多。與此相類似,如果一個.NET程序要連接到局域網上的另一個.NET程序,應該使用.NETremoting。有趣的是,在.NETremoting中,也可以指定使用SOAP/http來進行WebService調用。不過最好還是直接通過TCP進行RPC調用,那樣會有效得多。
總之,只要從應用程序結構的角度看,有別的方法比WebService更有效、更可行,那就不要用WebService。
四、webservice代碼實例
實現不同項目間接口調動,并通過webservice傳遞對象數據~
服務端項目代碼
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",?//?暴露服務名稱 ????????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",?//?與接口中指定的服務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、創建一個一模一樣的接口
package?com.guor.service; import?com.guor.entity.dto.User; import?javax.jws; @WebService(name?=?"WebService",?//?暴露服務名稱 ????????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發送EC企業信息 ?????*?@param?User ?????*?@return ?????*/ ????public?static?User?sendInfo(User?user)?{ ????????try?{ ????????????//?代理工廠 ????????????JaxWsProxyFactoryBean?jaxWsProxyFactoryBean?=?new?JaxWsProxyFactoryBean(); ????????????//?設置代理地址 ????????????jaxWsProxyFactoryBean.setAddress(address); ????????????//添加用戶名密碼攔截器 ????????????//jaxWsProxyFactoryBean.getOutInterceptors().add(new?LoginInterceptor("root","admin"));; ????????????//?設置接口類型 ????????????jaxWsProxyFactoryBean.setServiceClass(class); ????????????//?創建一個代理接口實現 ????????????WebService?service?=?(WebService)?jaxWsProxyFactoryBean.create(); ????????????return?service.sendInfo(user); ????????}?catch?(Exception?e)?{ ????????????return?null; ????????} ????}
感謝各位的閱讀,以上就是“webservice怎么實現springboot項目間接口調用與對象傳遞”的內容了,經過本文的學習后,相信大家對webservice怎么實現springboot項目間接口調用與對象傳遞這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是蝸牛博客,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:niceseo99@gmail.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。
評論