WebService 入門


1. 遠程調用技術

2. WebService 概述

  • WebService 是使用 Http 發送 SOAP 協議數據的一種遠程調用技術;
  • WebService 需要開發客戶端;
  • WebService 需要開發服務端;
  • SOAP,簡單對象訪問協議,用來描述傳遞信息的格式;
  • WSDL,WebService 服務端的一個使用說明書,用來描述接口,方法,參數和返回值;
  • UUDI,用來管理,分發,查詢WebService;

3. WebService 入門程序(基於JDK 1.7)

// 需求:
//    服務端: 發布一個天氣查詢服務,接收客戶端城市名,返回天氣數據給客戶端;
//    客戶端: 發送城市名稱給服務端,接收服務端的返回天氣數據;

// 服務端
// 第一步: 創建 SEI(Service Endpoint Interface) 接口, 本質上就是 Java 接口;
    public interface WeatherInterface{
        public String queryWeather(String cityName);
    }

// 第二步: 創建 SEI 實現類

    // @WebService 表示該類是一個服務類,需要發布其中的 public 方法
    @WebService
    public class WeatherImpl implements WeatherInterface{
        public String queryWeather(String cityName){
            System.out.println("from client..."+cityName);
            String weather = "晴";
            return weather;
        }
    }

// 第三步: 發布服務
    // 相當於 天氣服務端
    public class WeatherServer{
        public static void main(String[] args){
            // 使用 Endpoint 發布服務
            // Endpoint.publish(address,implementor);
            // address: 服務地址;
            // implementor: 實現類
            Endpoint.publish("http://127.0.0.1:12345/weather",new WeatherImpl());
        }
    }

// 第四步: 測試服務是否發布成功. 通過閱讀使用說明書,確定客戶端調用的接口,方法,參數和返回值存在,
       // 證明服務發布成功.
    // WSDL 地址: 服務地址 + "?wsdl";

3.1 WSDL 閱讀方式

  1. 從下往上閱讀,先找到 service 標簽,根據 service 標簽里面的 binding 屬性找到 binding 標簽,
    然后查找 binding 標簽中的 type 屬性,根據該屬性,查找 portType 標簽;

// 客戶端開發
// 第一步: wsimport 命令生成客戶端代碼
    // 根據 wsdl 地址生成客戶端代碼, "."表示在當前目錄下生成
    wsimport -s . http://127.0.0.1:12345/weather?wsdl

// 第二步: 根據使用說明書,說明客戶端代碼調用服務端
    // 客戶端
    public class WeatherClient{
        public static void main(String[] args){
            // 創建服務視圖, 視圖是從 service 標簽的 name 屬性獲取
            WeatherImplService wis = new WeatherImplService();

            // 獲取服務實現類, 實現類是從 portType 標簽的 name 屬性獲取
            WeatherImpl weatherImpl = wis.getPort(WeatherImpl.class);

            // 調用查詢方法,portType 標簽的子標簽 operation 中的 name 屬性獲取
            String weather = weatherImpl.queryWeather("北京");
            System.out.println(weather);
        }
    }

3.2 WebService 的優缺點

  1. 優點:
    • 跨防火牆: webservice 發送方式采用 http 的POST發送,http的默認端口是 80,防火牆默認不攔截 80;
    • 跨平台: webservice 使用XML格式封裝數據,XML是跨平台的;
    • 支持面向對象;
  2. 缺點:
    • 采用 XML 格式封裝數據,所以傳輸過程中,要傳輸額外的標簽;
  3. 應用場景
    • 軟件集成和復用:
      • 軟件集成: 通過遠程調用技術,將兩個系統整合到一起,實現軟件集成;
      • 軟件復用: 同一款軟件的多次集成,最終實現軟件復用;

4. WSDL

4.1 概述

  • WSDL,網絡服務描述語言;
  • 是一種使用XML編寫的文檔;
  • 是 webservice 服務端使用說明書,說明服務端接口,方法,參數和返回值;
  • 是隨着服務發布成功,自動生成的,無需編寫;

4.2 文檔結構(從下往上閱讀)

  • <service>: 服務視圖,webservice的服務節點,它包括服務端點;
  • <binding>: 為每個服務端點定義消息格式和協議細節;
  • <portType>: 服務端點,描述 webservice 可被執行的操作方法,以及相關的消息,通過binding指向 portType
  • <message>: 定義一個操作(方法)的數據參數(可有多個參數);
  • <types>: 定義 webservice 使用的全部數據類型

5. SOAP

  • SOAP 即簡單對象訪問協議,是一種網絡通信協議;
  • SOAP 用於跨平台應用程序之間的通信;
  • SOAP = XML + HTTP, 其實就是通過 HTTP 發 xml 數據;
  • SOAP 不是webservice的專有協議;

6. WebService 的兩種客戶端調用方式

6.1 公網服務地址: http://www.webxml.com.cn/zh_cn/web_services.aspx

6.2 第一種調用方式

  1. Wsimport 命令介紹

    • Wsimport 是 JDK 提供的一個工具,作用就是根據WSDL地址生成客戶端代碼;
    • 位置: JAVA_HOME/bin;
    • 僅支持SOAP1.1客戶端的生成;
    • 常用參數:
      • -s,用於生成 java 文件的;
      • -d,用於生成 class 文件的,默認的參數;
      • -p,指定包名的,如果不加該參數,默認包名就是WSDL文檔中命名空間的倒序;
  2. 調用公網手機號歸屬地查詢服務

// 第一步: wsimport 生成客戶端代碼
//  存儲在 cn.itcast.mobile 包下
wsimport -p cn.itcast.mobile -s . http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx\?wsdl

// 第二步: 根據使用說明書,說明客戶端代碼調用服務端
public class MobileClient{
    public static void main(String[] args){
        // 1. 創建服務視圖
        MobileCodeWS mcw = new MobileCodeWS();
        // 2. 獲取服務實現類
        MobileCodeWSSoap mcws = mcw.getPort(MobileCodeWSSoap.class);
        // 3. 調用查詢方法
        String result = mcws.getMobileCodeInfo("1234567","");
        System.out.println(result);
    }
}

// 第一種方式使用簡單,但一些關鍵的元素在代碼生成時,固定到生成代碼中,不方便維護;

6.3 第二種方式: service 編程調用方式(標准開發方式)

public class ServiceClient{
    public static void main(String[] args) throws IOException{
        // 1. 創建WSDL的URL, 注意不是服務地址
        URL url = new URL("http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl");

        // 2. 創建服務名稱
        // 參數: namespaceURI, 命名空間地址
        //      localPart, 服務視圖名
        QName qname = new QName("http://WebXml.com.cn/","MobileCodeWS");

        // 3. 創建服務視圖
        // 參數: wsdlDocumentLocation: wsdl 地址
        //      serviceName: 服務名稱
        Service service = Service.create(url,qname);

        // 獲取服務實現類
        MobileCodeWSSoap wcss = service.getPort(MobileCodeSSoap.class);
        // 調用查詢方法
        String result = wcss.getMobileCodeInfo("1233455","");
        System.out.println(result);
    }
}


免責聲明!

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



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