springboot 學習之路 12 (整合webservice)


 
         
協議補充知識:
  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

    

 

  

  

 

     

      


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM