協議補充知識:
Web Service平台需要一套協議來實現分布式應用程序的創建。任何平台都有它的數據表示方法和類型系統。要實現互操作性,Web Service平台必須提供一套標准的類型系統,用於溝通不同平台、編程語言和組件模型中的不同類型系統。這些協議有: XML和XSD 可擴展的標記語言(標准通用標記語言下的一個子集)是Web Service平台中表示數據的基本格式。除了易於建立和易於分析外,XML主要的優點在於它既與平台無關,又與廠商無關。XML是由萬維網協會(W3C)創建,W3C制定的XML SchemaXSD 定義了一套標准的數據類型,並給出了一種語言來擴展這套數據類型。 Web Service平台是用XSD來作為數據類型系統的。當你用某種語言如VB. NET或C# 來構造一個Web Service時,為了符合Web Service標准,所有你使用的數據類型都必須被轉換為XSD類型。如想讓它使用在不同平台和不同軟件的不同組織間傳遞,還需要用某種東西將它包裝起來。這種東西就是一種協議,如 SOAP。 SOAP SOAP即簡單對象訪問協議(Simple Object Access Protocol),它是用於交換XML(標准通用標記語言下的一個子集)編碼信息的輕量級協議。它有三個主要方面:XML-envelope為描述信息內容和如何處理內容定義了框架,將程序對象編碼成為XML對象的規則,執行遠程過程調用(RPC)的約定。SOAP可以運行在任何其他傳輸協議上。例如,你可以使用 SMTP,即因特網電子郵件協議來傳遞SOAP消息,這可是很有誘惑力的。在傳輸層之間的頭是不同的,但XML有效負載保持相同。 Web Service 希望實現不同的系統之間能夠用“軟件-軟件對話”的方式相互調用,打破了軟件應用、網站和各種設備之間的格格不入的狀態,實現“基於Web無縫集成”的目標。 WSDL Web Service描述語言WSDL 就是用機器能閱讀的方式提供的一個正式描述文檔而基於XML(標准通用標記語言下的一個子集)的語言,用於描述Web Service及其函數、參數和返回值。因為是基於XML的,所以WSDL既是機器可閱讀的,又是人可閱讀的。 UDDI UDDI 的目的是為電子商務建立標准;UDDI是一套基於Web的、分布式的、為Web Service提供的、信息注冊中心的實現標准規范,同時也包含一組使企業能將自身提供的Web Service注冊,以使別的企業能夠發現的訪問協議的實現標准。 調用RPC與消息傳遞 Web Service本身其實是在實現應用程序間的通信。我們有兩種應用程序通信的方法:RPC遠程過程調用 和消息傳遞。使用RPC的時候,客戶端的概念是調用服務器上的遠程過程,通常方式為實例化一個遠程對象並調用其方法和屬性。RPC系統試圖達到一種位置上的透明性:服務器暴露出遠程對象的接口,而客戶端就好像在本地使用的這些對象的接口一樣,這樣就隱藏了底層的信息,客戶端也就根本不需要知道對象是在哪台機器上。
原理:
Web服務的體系結構是基於Web服務提供者、Web服務請求者、Web服務中介者三個角色和發布、發現、綁定三個動作構建的。簡單地說,Web服務提供者就是Web服務的擁有者,它耐心等待為其他服務和用戶提供自己已有的功能;Web服務請求者就是Web服務功能的使用者,它利用SOAP消息向Web服務提供者發送請求以獲得服務;Web服務中介者的作用是把一個Web服務請求者與合適的Web服務提供者聯系在一起,
它充當管理者的角色,一般是UDDI。這三個角色是根據邏輯關系划分的,在實際應用中,角色之間很可能有交叉:一個Web服務既可以是Web服務提供者,也可以是Web服務請求者,或者二者兼而有之。顯示了Web服務角色之間的關系:其中,“發布”是為了讓用戶或其他服務知道某個Web服務的存在和相關信息;“查找(發現)”是為了找到合適的Web服務;“綁定”則是在提供者與請求者之間建立某種聯系

實現一個完整的Web服務包括以下步驟:
◆ Web服務提供者設計實現Web服務,並將調試正確后的Web服務通過Web服務中介者發布,並在UDDI注冊中心注冊; (發布)
◆ Web服務請求者向Web服務中介者請求特定的服務,中介者根據請求查詢UDDI注冊中心,為請求者尋找滿足請求的服務; (發現)
◆ Web服務中介者向Web服務請求者返回滿足條件的Web服務描述信息,該描述信息用WSDL寫成,各種支持Web服務的機器都能閱讀;(發現)
◆ 利用從Web服務中介者返回的描述信息生成相應的SOAP消息,發送給Web服務提供者,以實現Web服務的調用;(綁定)
◆ Web服務提供者按SOAP消息執行相應的Web服務,並將服務結果返回給Web服務請求者。(綁定)
springboot與webService的整合:
我是采用cxf實現的:
先引入pom文件
WebService方法創建
CxfConfig配置編寫
客戶端測試類:
package com.huhy.webservice.client; /** * @author : huhy on 2018/6/20. * @Project_name:springboot_self * @blog : http://www.cnblog,com/huhongy/ * @description:{客戶端測試} */ public class CxfClient { public static void main(String[] args) { testCli1(); testCli2(); testCli3(); } /** * @author huhy * @ClassName:CxfClient * @date 2018/6/20 17:30 * @Description: 測試1 不連接數據庫 */ public static void testCli1() { // 創建動態客戶端 JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance(); Client client = dcf.createClient("http://localhost:8083/services/AService?wsdl"); Object[] objects = new Object[0]; try { objects = client.invoke("getStr", "huhy"); System.out.println("echo:" + objects[0]); } catch (java.lang.Exception e) { e.printStackTrace(); } } /** * 方式1.代理類工廠的方式,需要拿到對方的接口 -------適用與接口發布的服務 * 接口代理類的發布 */ public static void testCli2() { try { // 接口地址 String address = "http://localhost:8083/services/BService?wsdl"; // 代理工廠 JaxWsProxyFactoryBean jaxWsProxyFactoryBean = new JaxWsProxyFactoryBean(); // 設置代理地址 jaxWsProxyFactoryBean.setAddress(address); // 設置接口類型 jaxWsProxyFactoryBean.setServiceClass(UserService.class); // 創建一個代理接口實現 UserService cs = (UserService) jaxWsProxyFactoryBean.create(); // 數據准備 String id = "1"; // 調用代理接口的方法調用並返回結果 Object result = cs.queryByid(id); System.out.println("返回結果:" + result); } catch (Exception e) { e.printStackTrace(); } } /** * 動態調用方式 * 連接數據庫 */ public static void testCli3() { // 創建動態客戶端 JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance(); Client client = dcf.createClient("http://localhost:8083/services/UserService?wsdl"); Object[] objects = new Object[]{}; try { objects = client.invoke("queryByid", "1"); List<Object> objects1 = Arrays.asList(objects); System.out.println(objects1.get(0)); } catch (java.lang.Exception e) { e.printStackTrace(); } } }
簡單的整合已經基本完成,開啟服務后客戶端就可以測試了
分析一下WSDL:
前提啟動webservice服務:
然后訪問對應的服務:http://localhost:8083/services/my?wsdl