Java开发或调用WebService的几种方式

2024-06-04 3418阅读

Java开发或调用WebService的几种方式

文章目录

  • Java开发或调用WebService的几种方式
    • 一.JDK自带的 JAX-WS 方式开发WebService服务
      • 1.服务端开发与发布
      • 2.客户端开发与测试
      • 二.Axis1.4调用.Net返回值为DataSet类型的WebService接口
      • 1.相关说明
      • 2. Axis1.4客户端WebService服务
        • 1.Axis1.4下载
        • 2.WebService服务接口地址及方法
        • 3.编写调用WebService服务的方法及数据解析
        • 三. CXF 开发WebService接口
          • 1. jax-ws实现
          • 2. CXF-RESTFul服务实现

            一.JDK自带的 JAX-WS 方式开发WebService服务

            1.服务端开发与发布

            1. 编写接口
            @WebService
            public interface JaxWsDemo {
                String helloJaxWS(String userName);
            }
            
            1. 编写接口的实现类
            @WebService
            public class JaxWsDemoImpl implements JaxWsDemo {
                @WebMethod
                @WebResult(name = "jaxWSResult")
                @Override
                public String helloJaxWS(@WebParam(name = "userName")String userName) {
                    return "hello," + userName + "This is a Web Service developed through JAX-WS";
                }
            }
            
            1. 发布服务
            public class JAXWSPublishMain {
                public static void main(String[] args) {
                    String address = "http://127.0.0.1:8888/JaxWSTest";
                    Endpoint.publish(address, new JaxWsDemoImpl());
                    System.out.println("WebService 服务已发布!");
                }
            }
            
            1. 访问已发布的WebService服务

            打开浏览器输入http://127.0.0.1:8888/JaxWSTest?wsdl访问,如下面内容

            Java开发或调用WebService的几种方式 第1张

            截图内容1

            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            

            浏览器中输入wsdl文档中的 http://127.0.0.1:8888/JaxWSTest?xsd=1可查看绑定的参数等信息看如下图:

            Java开发或调用WebService的几种方式 第2张

            截图内容2

            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            1. jdk自带生成WebService的wsimport命令
            -encoding : 指定编码格式
            -keep:是否生成java源文件
            -d:指定.class文件的输出目录
            -s:指定.java文件的输出目录,   此目录必须存在
            -p:定义生成类的包名,不定义的话有默认包名
            -verbose:在控制台显示输出信息
            -b:指定jaxws/jaxb绑定文件或额外的schemas
            -extension:使用扩展来支持SOAP1.2
            # 举例
            wsimport -encoding utf-8 -keep -d D:\temp -p com.lawyer.user -verbose http://IP:port/serverName?wsdl 
            

            2.客户端开发与测试

            1. 生成客户端源码

            切换到要生成客户端源码的路径下,如下:

            cd F:\SpringBootProjects\webServiceDemo\jwsDemo\src\main\java\demoOne\client>
            

            根据wsdl文档地址生成源码信息:

            F:\SpringBootProjects\webServiceDemo\jwsDemo\src\main\java\demoOne\client>
            wsimport -d F:\SpringBootProjects\webServiceDemo\jwsDemo\src\main\java\demoOne\client
            -keep -verbose http://127.0.0.1:8888/JaxWSTest?wsdl
            

            参数说明:

            wsimport : 导入命令,如果使用cxf就换成 wsdl2java  命令 
            -d [源码位置]      : 指定要生成的源码的目录,不指定则默认在哪个目录打开的cmd窗口,就生在那个目录下
            -keep : 是否生成*.java的源文件,写了此参数则直接生成*.java与*.class文件,不写此参数则只有*.class文件 
            -verbose : 显示文件生成过程中的详细信息
            -p [包名]: 指定要生成在哪个包下,不指定生成时取默认
            
            1. 客户端代码生成后测试
            package demoOne.client;
            import demoone.JaxWsDemoImplService;
            /**
             * Created by IntelliJ IDEA.
             * User: jinshengyuan
             * Date: 2019-03-13
             * Time: 10:34
             * description: 客户端测试
             **/
            public class ClientTest {
                public static void main(String[] args) {
                    demoone.JaxWsDemoImplService implService = new JaxWsDemoImplService();
                   demoone.JaxWsDemoImpl jaxWsDemo = (demoone.JaxWsDemoImpl)implService.getJaxWsDemoImplPort();
                   String aa = jaxWsDemo.helloJaxWS("Tom ");
                    System.out.println("调用WebService执行结果:"+aa);
                }
            }
            

            执行结果:

            调用WebService执行结果:hello,Tom This is a Web Service developed through JAX-WS
            

            二.Axis1.4调用.Net返回值为DataSet类型的WebService接口

            1.相关说明

            1. JDK版本:1.8.0_172
            2. axis版本:Axis1.4

            2. Axis1.4客户端WebService服务

            1.Axis1.4下载

            1. 官网:http://axis.apache.org/axis/
            2. 下载后是一个压缩文件:axis-bin_1.4.zip
            3. 非maven环境,则导入axis-bin_1.4.zip包下的lib目录下的所有jar包,如下图:

            Java开发或调用WebService的几种方式 第3张

            4.maven环境的话,在pom.xml中添加下面的依赖即可

                    
                    
                        org.apache.axis
                        axis
                        1.4
                    
                    
                    
                    
                        axis
                        axis-jaxrpc
                        1.4
                    
                    
                    
                        axis
                        axis-ant
                        1.4
                    
                    
                    
                        axis
                        axis-saaj
                        1.4
                    
                    
                    
                        wsdl4j
                        wsdl4j
                        1.6.3
                    
                    
                    
                        commons-discovery
                        commons-discovery
                        0.5
                    
                    
            		
             
                    
                        org.dom4j
                        dom4j
                        2.1.1
                    
            

            2.WebService服务接口地址及方法

            1. 地址:http://www.webxml.com.cn/WebServices/WeatherWebService.asmx
            2. 调用的方法:http://www.webxml.com.cn/WebServices/WeatherWebService.asmx/getSupportDataSet

              Java开发或调用WebService的几种方式 第4张

            3.编写调用WebService服务的方法及数据解析

            1. 编写调用WebService服务的客户端java类,并打印结果,类名为:Axis1_Client
            package com.yuan;
            import org.apache.axis.client.Call;
            import org.apache.axis.client.Service;
            import org.apache.axis.encoding.XMLType;
            import org.apache.axis.message.MessageElement;
            import org.apache.axis.types.Schema;
            import org.dom4j.Document;
            import org.dom4j.DocumentException;
            import org.dom4j.DocumentHelper;
            import org.dom4j.Element;
            import org.junit.Test;
            import javax.xml.namespace.QName;
            import java.net.URL;
            import java.util.Iterator;
            import java.util.List;
            /**
             * Created by IntelliJ IDEA.
             * User: jinshengyuan
             * Date: 2019-01-15
             * Time: 15:13
             * description:
             **/
            public class Axis1_Client {
                /**
                 * 使用dom4j解析数据
                 */
                @Test
                public void axisWSInvoke(){
                    String dataSetDataStr = axisInvokeNetDataSetData();
                    //System.out.println(dataSetDataStr);
                    if(dataSetDataStr != null){
                        try {
                            Document doc = DocumentHelper.parseText(dataSetDataStr);// 将字符串转为XML
                            Element root = doc.getRootElement();// 获取根节点
                            Iterator iterator =  root.elementIterator("Zone");//迭代节点
                            String id,zone;
                            while(iterator.hasNext()){
                              Element element = (Element) iterator.next();
                              id = element.elementTextTrim("ID");//取出Zone节点下的ID元素的值
                              zone = element.elementTextTrim("Zone");//取出Zone节点下的Zone元素的值
                                System.out.println("Id:"+id+"=============================Zone:"+zone);
                            }
                        } catch (DocumentException e) {
                            e.printStackTrace();
                        }
                    }
                }
                /**
                 * 调用.Net写的返回值为DataSet类型的WebService服务
                 * @return
                 */
                public String axisInvokeNetDataSetData(){
                    Service service = new Service();
                    String strXml = null;
                    Call call = null;
                    try {
                        call = (Call) service.createCall();
                        call.setTargetEndpointAddress(new URL("http://www.webxml.com.cn/WebServices/WeatherWebService.asmx"));//WSURL,注意不要带?wsdl
                        //调用方法方法前设置相关参数
                        call.setOperationName(new QName("http://WebXml.com.cn/", "getSupportDataSet"));
                        call.setReturnType(XMLType.XSD_SCHEMA);//返回类型,这里一定要传入 XMLType.XSD_SCHEMA 类型
                        call.setUseSOAPAction(true);
                        call.setSOAPActionURI("http://WebXml.com.cn/getSupportDataSet");//soapAction
                        Object obj = call.invoke((Object[]) null);
                        Schema schema = (Schema) obj;
                        MessageElement[] messageElements = schema.get_any();
                        List messageHead = messageElements[0].getChildren();//消息头,DataSet对象
                        List messageBody = messageElements[1].getChildren();//消息体信息,DataSet对象,最终需要解析的数据
                        if (messageBody.size() > 0) {
                            String head = messageHead.get(0).toString();//消息头,DataSet对象
                            String diffgr = messageBody.get(0).toString();//消息体的字符串形式
                            strXml = diffgr;
                            System.out.println("head:\n"+head);
                            System.out.println("diffgr:\n" + diffgr);
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    return strXml;
                }
            }
            
            1. 输出结果:
            Id:1=============================Zone:直辖市
            Id:2=============================Zone:特别行政区
            Id:3=============================Zone:黑龙江
            Id:4=============================Zone:吉林
            Id:5=============================Zone:辽宁
            Id:6=============================Zone:内蒙古
            Id:7=============================Zone:河北
            Id:8=============================Zone:河南
            Id:9=============================Zone:山东
            Id:10=============================Zone:山西
            Id:11=============================Zone:江苏
            Id:12=============================Zone:安徽
            Id:13=============================Zone:陕西
            Id:14=============================Zone:宁夏
            Id:15=============================Zone:甘肃
            Id:16=============================Zone:青海
            Id:17=============================Zone:湖北
            Id:18=============================Zone:湖南
            Id:19=============================Zone:浙江
            Id:20=============================Zone:江西
            Id:21=============================Zone:福建
            Id:22=============================Zone:贵州
            Id:23=============================Zone:四川
            Id:24=============================Zone:广东
            Id:25=============================Zone:广西
            Id:26=============================Zone:云南
            Id:27=============================Zone:海南
            Id:28=============================Zone:新疆
            Id:29=============================Zone:西藏
            Id:30=============================Zone:台湾
            Id:31=============================Zone:亚洲
            Id:32=============================Zone:欧洲
            Id:33=============================Zone:非洲
            Id:34=============================Zone:北美洲
            Id:35=============================Zone:南美洲
            Id:36=============================Zone:大洋洲
            

            三. CXF 开发WebService接口

            1. jax-ws实现

            场景:CXF结合Spring实现发布与调用简单的WebService

            • 导入包
              1. pom.xml引入cxf的依赖即可
              • 开发java接口与实现类代码
                1. 编写接口
                package com.ssm.webservice;
                import javax.jws.WebMethod;
                import javax.jws.WebParam;
                import javax.jws.WebResult;
                import javax.jws.WebService;
                /**
                 * Created by IntelliJ IDEA.
                 * User: jinshengyuan
                 * Date: 2018-11-09
                 * Time: 9:04
                 * description:
                 **/
                @WebService
                public interface Hello {
                     @WebMethod
                     @WebResult(name = "result") String sayHello(@WebParam(name = "name") String name);
                }
                
                1. 编写接口的实现类
                package com.ssm.webservice.impl;
                import com.ssm.dao.sysManagement.ComLogMapper;
                import com.ssm.model.ComLog;
                import com.ssm.service.sysManagement.ComLogService;
                import com.ssm.utils.CommonsUtil;
                import com.ssm.webservice.Hello;
                import org.springframework.beans.factory.annotation.Autowired;
                import org.springframework.stereotype.Component;
                import java.text.SimpleDateFormat;
                import java.util.Date;
                /**
                 * Created by IntelliJ IDEA.
                 * User: jinshengyuan
                 * Date: 2018-11-09
                 * Time: 9:06
                 * description:
                 **/
                public class HelloImpl implements Hello {
                    //这里跟controller中调用Service一样,使用@Autowired注解自动注入service
                    @Autowired
                    ComLogService comLogService;
                    @Override
                    public String sayHello(String name) {
                        //从数据库中获取当前系统日期
                        Date date = comLogService.getCurrentDatetime();
                        String currentDateTime = null;
                        if(date != null){
                            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                            currentDateTime = dateFormat.format(date);
                            System.out.println("系统日期:"+currentDateTime);
                        }
                        return "hello," + name + ",当前时间为:"+currentDateTime;
                    }
                }
                
                • 与spring集成
                  1. spring.xml文件中的核心配置
                   
                      
                      
                      
                      
                      
                      
                      
                  
                  1. web.xml中的配置
                   
                      
                          CXFServlet
                          org.apache.cxf.transport.servlet.CXFServlet
                      
                      
                          CXFServlet
                          
                          /webService/*
                      
                  
                  • 测试
                    1. 打开浏览器,输入http://localhost:8080/ssm/webService/webServiceTest?wsdl进行测试

                    2. CXF-RESTFul服务实现

                    • JAX-RS概述

                      JAX-RS是Java提供用于开发RESTful Web服务基于注解(annotation)的API。JAX-RS旨在定义一个统一的规范,使得Java程序员可以使用一套固定的接口来开发REST应用,避免了依赖第三方框架。同时JAX-RS使用POJO编程模型和基于注解的配置并集成JAXB,可以有效缩短REST应用的开发周期。JAX-RS只定义RESTful API,具体实现由第三方提供,如Jersey、Apache CXF等。

                      JAX-RS包含近五十多个接口、注解和抽象类:

                      • javax.ws.rs包含用于创建RESTful服务资源的高层次(High-level)接 口和注解。
                      • javax.ws.rs.core包含用于创建RESTful服务资源的低层次(Low-level)接口和注解。
                      • javax.ws.rs.ext包含用于扩展JAX-RS API支持类型的APIs。

                        JAX-RS常用注解:

                        • @Path:标注资源类或方法的相对路径。
                        • @GET、@PUT、@POST、@DELETE:标注方法的HTTP请求类型。
                        • @Produces:标注返回的MIME媒体类型。
                        • @Consumes:标注可接受请求的MIME媒体类型。
                        • @PathParam、@QueryParam、@HeaderParam、@CookieParam、@MatrixParam、@FormParam:标注方法的参数来自于HTTP请求的位置。@PathParam来自于URL的路径,@QueryParam来自于URL的查询参数,@HeaderParam来自于HTTP请求的头信息,@CookieParam来自于HTTP请求的Cookie。

    免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

    目录[+]