zoukankan      html  css  js  c++  java
  • 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);
        }
    }
    

  • 相关阅读:
    mysql access denied for user root Mysql用户无权限
    远程链接调用sql脚本
    CuteEditor使用详解
    如何设置release模式
    ShardingJDBC不分库,只分表例子
    SpringCloud Stream整合RocketMQ实现消息发送与接收
    Spring Cloud Gateway的PrefixPath及StripPrefix功能
    使用MongoDB的Spring Boot和MongoTemplate教程
    ShardingJDBC读写分离案例
    SpringBoot那些好用的连接池HikariCP
  • 原文地址:https://www.cnblogs.com/linkworld/p/7745185.html
Copyright © 2011-2022 走看看