• webService开发(JDK版)


    最近做社保查询的东西,然而这个是三个公司一起做的,需要调其他公司的接口,他们公司用了webService这个当年比较流行的技术,于是乎就研究了一下这个webService.

    HTTP协议 + XML方式实现跨语言调用。因为Http+xml会有很多冗余数据。所以后来有了RPC框架(Dubbo、Spring Cloud)

    一、WebService是什么?
      1. 基于Web的服务:服务器端整出一些资源让客户端应用访问(获取数据)
      2. 一个跨语言、跨平台的规范(抽象)
      3. 多个跨平台、跨语言的应用间通信整合的方案(实际)
    
    二、为什么要用Web service(能解决什么)?
        跨平台调用
        跨语言调用
        远程调用
    
    三、什么时候使用web Service?
      1. 同一家公司的新旧应用之间
      2. 不同公司的应用之间
      3. 一些提供数据的内容聚合应用:天气预报、股票行情
    
    四、Web Service中的几个重要术语
    4.1、WSDL(web service definition language)
      WSDL是webservice定义语言, 对应.wsdl文档, 一个webservice会对应一个唯一的wsdl文档, 定义了客户端与服务端发送请求和响应的数据格式和过程
    
    4.2、SOAP(simple object  access protocal)
      SOAP是"简单对象访问协议"是一种简单的、基于HTTP和XML的协议, 用于在WEB上交换结构化的数据soap消息:请求消息和响应消息
    
    4.3、SEI(WebService EndPoint Interface)
      SEI是web service的终端接口,就是WebService服务器端用来处理请求的接口
    
    4.4、CXF(Celtix + XFire)
      一个apache的用于开发webservice服务器端和客户端的框架。        

    首先定义两个webService功能接口

    @WebService
    public interface WebserviceI {
        @WebMethod
        public String sayHello(String name);
        @WebMethod
        public String sayBye(String name);
    }
    
    @WebService
    public interface Webservice2I {
        @WebMethod
        public String run(String name);
        @WebMethod
        public String lover(String name);
    }

    然后实现webService功能接口

    @WebService
    public class WebServiceImpl implements WebserviceI {
    
        @Override
        public String sayHello(String name) {
            String result = "你好,"+name;
            System.out.println(result);
            return result;
        }
    
        @Override
        public String sayBye(String name) {
            String result = "再见,"+name;
            System.out.println(result);
            return result;
        }
    
    }
    
    @WebService
    public class WebService2Impl implements Webservice2I { @Override public String run(String name) { String result = "not flash , but have to run."+name; System.out.println(result); return result; } @Override public String lover(String name) { String result = "dyl,"+name; System.out.println(result); return result; } }

    最后发布出去,我们用三种示例方式发布

    1.直接在java类中发布

    public static void main(String[] args) {
            //必须要是部署机器的ip,端口也要开,我就用tomcat的端口了
            String address = "http://222.222.221.137:8080/WS_Server/Webservice";
            //用endpoint发布webservice
            Endpoint.publish(address, new WebServiceImpl());
            System.out.println("通过java文件部署webservice成功");
        }

    2.通过设置servlet自动加载初始化,用servlet发布

    public class TestServlet extends HttpServlet {
    
        @Override
        public void init() throws ServletException {
            //必须要是部署机器的ip,端口也要开,我就用tomcat的端口了
            String address = "http://222.222.221.137:8088/WS_Server/Webservicesss";
            //用endpoint发布webservice
            Endpoint.publish(address, new WebServiceImpl());
            System.out.println("通过httpservlet部署webservice成功");
        }
        
    }
    其中要在web.xml配置中配置
    <!-- 通过servlet部署 -->    
      <servlet>    
          <servlet-name>InitServlet</servlet-name>  
          <servlet-class>com.qy.servlet.TestServlet</servlet-class>  
          <init-param>  
              <param-name>username</param-name>  
              <param-value>qy</param-value>  
          </init-param>  
          <!-- 此处指定加载顺序为2,表明还有优先级更高的Servlet要先执行,数值越小,优先级越高   -->
          <load-on-startup>1</load-on-startup>  
      </servlet>  
      <servlet-mapping>    
          <servlet-name>InitServlet</servlet-name>  
          <url-pattern>/</url-pattern>  
      </servlet-mapping>

    3.通过用ServletContextListener发布

    public class contextlistener implements ServletContextListener {
        @Override
        public void contextDestroyed(ServletContextEvent arg0) {
        }
        
        @Override
        public void contextInitialized(ServletContextEvent arg0) {
            //必须要是部署机器的ip,端口也要开,我就用tomcat的端口了
            String address = "http://222.222.221.137:8087/WS_Server2/Webservices2";
            //用endpoint发布webservice
            Endpoint.publish(address, new WebService2Impl());
            System.out.println("通过servletcontextlistener部署webservice成功");
        }
    
    }

    web.xml中配置

    <listener>  
          <listener-class>com.qy.servletcontextlistener.contextlistener</listener-class>  
      </listener> 

    还有其他启动的方法,比如过滤器,使用ioc容器的可以在xml中配置

    这下就好了,在浏览器中输入地址然后可以显示成这样子的

     

    如果是demo,那么久结束了。

    但是!!!浏览器的url请求成功并不代表这个接口可以调用!!!!一定要用专业的工具测试!!!!昨天就是另外一家公司的webservice部署好之后浏览器查看没事就溜了,结果根本不能调用,这里我们用wsCaller.jar测试.

    这里是源码和测试工具,有兴趣的可以看一下

    JDK中wsimport命令

    wsimport -keep -d D:logsd -s D:logss -p com.qy.clent -verbose http://222.222.221.137:8081/WS_Server/Webservice?wsdl

    -keep:是否生成java源文件

    -d:指定.class文件的输出目录

    -s:指定.java文件的输出目录

    -p:定义生成类的包名,不定义的话有默认包名

    -verbose:在控制台显示输出信息

    生成客户端代码,测试是否可以使用

           /*try {  
                //服务WSDL Document的地址  
                URL url = new URL("http://222.222.221.137:8081/WS_Server/Webservice?wsdl");  
                //1.Qnameqname是qualified name 的简写  
                //2.构成:由名字空间(namespace)前缀(prefix)以及冒号(:),还有一个元素名称构成  
                //由发布的wsdl可知namespace为http://server.ws.platform.whaty.com/,  
                QName qname=new QName("http://interf.qy.com/","WebServiceImplService");  
                Service service=Service.create(url, qname);  
                WebServiceImpl ms=service.getPort(WebServiceImpl.class);  
                String re = ms.sayHello("qy");
                System.out.println(re);
            } catch (Exception e) {  
                e.printStackTrace();  
            }*/
            WebServiceImplService ss = new WebServiceImplService();
            WebServiceImpl webServiceImplPort = ss.getWebServiceImplPort();
            String result = webServiceImplPort.sayBye("qy");
            System.out.println(result);

    结果

  • 相关阅读:
    Babel 7.x 和 Babel 8.x的区别
    JavaScript——Set 的用法
    DFS 和 BFS
    JavaScript——event事件详解
    Day17-18前端学习之路——Javascript事件
    Day17-18前端学习之路——常用语句资料库
    Day5前端学习之路——盒模型和浮动
    Day7前端学习之路——多栏布局
    如何在GitHub预览html
    新人上路请教一个输入字符的问题
  • 原文地址:https://www.cnblogs.com/aeolian/p/7744366.html
Copyright © 2020-2023  润新知