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

打印 上一主题 下一主题

主题 851|帖子 851|积分 2553

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.服务端开发与发布


  • 编写接口
    @WebService
    public interface JaxWsDemo {
    String helloJaxWS(String userName);
    }
  • 编写接口的实现类
    @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”;
    }
    }
  • 发布服务
    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 服务已发布!”);
    }
    }
  • 访问已发布的WebService服务
打开浏览器输入http://127.0.0.1:8888/JaxWSTestwsdl访问,如下面内容

截图内容1
  1. <!--
  2. Published by JAX-WS RI (http://jax-ws.java.net). RI's version is JAX-WS RI 2.2.9-b130926.1035 svn-revision#5f6196f2b90e9460065a4c2f4e30e065b245e51e.
  3. -->
  4. <!--
  5. Generated by JAX-WS RI (http://jax-ws.java.net). RI's version is JAX-WS RI 2.2.9-b130926.1035 svn-revision#5f6196f2b90e9460065a4c2f4e30e065b245e51e.
  6. -->
  7. <definitions xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsp="http://www.w3.org/ns/ws-policy" xmlns:wsp1_2="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://wsimpl.jaxws/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://wsimpl.jaxws/" name="JaxWsDemoImplService">
  8. <types>
  9. <xsd:schema>
  10. <xsd:import namespace="http://wsimpl.jaxws/" schemaLocation="http://127.0.0.1:8888/JaxWSTest?xsd=1"/>
  11. </xsd:schema>
  12. </types>
  13. <message name="helloJaxWS">
  14. <part name="parameters" element="tns:helloJaxWS"/>
  15. </message>
  16. <message name="helloJaxWSResponse">
  17. <part name="parameters" element="tns:helloJaxWSResponse"/>
  18. </message>
  19. <portType name="JaxWsDemoImpl">
  20. <operation name="helloJaxWS">
  21. <input wsam:Action="http://wsimpl.jaxws/JaxWsDemoImpl/helloJaxWSRequest" message="tns:helloJaxWS"/>
  22. <output wsam:Action="http://wsimpl.jaxws/JaxWsDemoImpl/helloJaxWSResponse" message="tns:helloJaxWSResponse"/>
  23. </operation>
  24. </portType>
  25. <binding name="JaxWsDemoImplPortBinding" type="tns:JaxWsDemoImpl">
  26. <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
  27. <operation name="helloJaxWS">
  28. <soap:operation soapAction=""/>
  29. <input>
  30. <soap:body use="literal"/>
  31. </input>
  32. <output>
  33. <soap:body use="literal"/>
  34. </output>
  35. </operation>
  36. </binding>
  37. <service name="JaxWsDemoImplService">
  38. <port name="JaxWsDemoImplPort" binding="tns:JaxWsDemoImplPortBinding">
  39. <soap:address location="http://127.0.0.1:8888/JaxWSTest"/>
  40. </port>
  41. </service>
  42. </definitions>
复制代码
浏览器中输入wsdl文档中的 http://127.0.0.1:8888/JaxWSTestxsd=1可检察绑定的参数等信息看如下图:

截图内容2
  1. <!--
  2. Published by JAX-WS RI (http://jax-ws.java.net). RI's version is JAX-WS RI 2.2.9-b130926.1035 svn-revision#5f6196f2b90e9460065a4c2f4e30e065b245e51e.
  3. -->
  4. <xs:schema xmlns:tns="http://wsimpl.jaxws/" xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0" targetNamespace="http://wsimpl.jaxws/">
  5. <xs:element name="helloJaxWS" type="tns:helloJaxWS"/>
  6. <xs:element name="helloJaxWSResponse" type="tns:helloJaxWSResponse"/>
  7. <xs:complexType name="helloJaxWS">
  8. <xs:sequence>
  9. <xs:element name="userName" type="xs:string" minOccurs="0"/>
  10. </xs:sequence>
  11. </xs:complexType>
  12. <xs:complexType name="helloJaxWSResponse">
  13. <xs:sequence>
  14. <xs:element name="jaxWSResult" type="xs:string" minOccurs="0"/>
  15. </xs:sequence>
  16. </xs:complexType>
  17. </xs:schema>
复制代码

  • 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: emp -p com.lawyer.user -verbose http://IP:port/serverName?wsdl
2.客户端开发与测试


  • 天生客户端源码
切换到要天生客户端源码的路径下,如下:
  1. cd F:SpringBootProjectswebServiceDemojwsDemosrcmainjavademoOneclient>
复制代码
根据wsdl文档地址天生源码信息:
  1. F:SpringBootProjectswebServiceDemojwsDemosrcmainjavademoOneclient>
  2. wsimport -d F:SpringBootProjectswebServiceDemojwsDemosrcmainjavademoOneclient
  3. -keep -verbose http://127.0.0.1:8888/JaxWSTest?wsdl
复制代码
参数说明:
  1. wsimport : 导入命令,如果使用cxf就换成 wsdl2java  命令
  2. -d [源码位置]      : 指定要生成的源码的目录,不指定则默认在哪个目录打开的cmd窗口,就生在那个目录下
  3. -keep : 是否生成*.java的源文件,写了此参数则直接生成*.java与*.class文件,不写此参数则只有*.class文件
  4. -verbose : 显示文件生成过程中的详细信息
  5. -p [包名]: 指定要生成在哪个包下,不指定生成时取默认
复制代码

  • 客户端代码天生后测试
    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);
      }
      }

执行结果:
  1. 调用WebService执行结果:hello,Tom This is a Web Service developed through JAX-WS
复制代码
二.Axis1.4调用.Net返回值为DataSet范例的WebService接口

1.相关说明


  • JDK版本:1.8.0_172
  • axis版本:Axis1.4
2. Axis1.4客户端WebService服务

1.Axis1.4下载


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

4.maven环境的话,在pom.xml中添加下面的依靠即可
  1. <!--Axis1.4 及其依赖 begin-->
  2.         <!-- https://mvnrepository.com/artifact/org.apache.axis/axis -->
  3.         <dependency>
  4.             <groupId>org.apache.axis</groupId>
  5.             <artifactId>axis</artifactId>
  6.             <version>1.4</version>
  7.         </dependency>
  8.         <!-- https://mvnrepository.com/artifact/jaxrpc/jaxrpc -->
  9.         <!-- https://mvnrepository.com/artifact/axis/axis-jaxrpc -->
  10.         <dependency>
  11.             <groupId>axis</groupId>
  12.             <artifactId>axis-jaxrpc</artifactId>
  13.             <version>1.4</version>
  14.         </dependency>
  15.         <!-- https://mvnrepository.com/artifact/axis/axis-ant -->
  16.         <dependency>
  17.             <groupId>axis</groupId>
  18.             <artifactId>axis-ant</artifactId>
  19.             <version>1.4</version>
  20.         </dependency>
  21.         <!-- https://mvnrepository.com/artifact/axis/axis-saaj -->
  22.         <dependency>
  23.             <groupId>axis</groupId>
  24.             <artifactId>axis-saaj</artifactId>
  25.             <version>1.4</version>
  26.         </dependency>
  27.         <!-- https://mvnrepository.com/artifact/wsdl4j/wsdl4j -->
  28.         <dependency>
  29.             <groupId>wsdl4j</groupId>
  30.             <artifactId>wsdl4j</artifactId>
  31.             <version>1.6.3</version>
  32.         </dependency>
  33.         <!-- https://mvnrepository.com/artifact/commons-discovery/commons-discovery -->
  34.         <dependency>
  35.             <groupId>commons-discovery</groupId>
  36.             <artifactId>commons-discovery</artifactId>
  37.             <version>0.5</version>
  38.         </dependency>
  39.         <!--Axis1.4 及其依赖 end-->
  40.                 <!-- 引入dom4j 解析数据时用-->
  41. <!-- https://mvnrepository.com/artifact/org.dom4j/dom4j -->
  42.         <dependency>
  43.             <groupId>org.dom4j</groupId>
  44.             <artifactId>dom4j</artifactId>
  45.             <version>2.1.1</version>
  46.         </dependency>
复制代码
2.WebService服务接口地址及方法


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

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


  • 编写调用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:
        "+head);
        System.out.println("diffgr:
        " + diffgr);
        }
        } catch (Exception e) {
        e.printStackTrace();
        }
        return strXml;
        }
        }


  • 输出结果:
    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
  

  • 导入包

  • pom.xml引入cxf的依靠即可


  • 开发java接口与实现类代码

  • 编写接口
    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);
      }

  • 编写接口的实现类
    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);
      }
      1. return "hello," + name + ",当前时间为:"+currentDateTime;
      复制代码
      }
      }



  • 与spring集成

  • spring.xml文件中的核心配置
       
    1. <import resource="classpath:META-INF/cxf/cxf.xml" />
    2. <!-- 配置方式1   注意:serviceClass为接口类并非接口的实现类 -->
    3. <jaxws:server serviceClass="com.ssm.webservice.Hello" address="/webServiceTestA"></jaxws:server>
    4. <!--访问地址:http://localhost:8080/ssm/webService/webServiceTestA?wsdl-->
    5. <!-- 配置方式2    注意:implementor为接口的具体实现类,与springmvc整合时,推荐使用这种方式,如果使用配置方式1,则会在访问时,提示如下错误:
    6. org.apache.cxf.interceptor.Fault: Could not instantiate service class com.ssm.webservice.Hello because it is an interface.
    7. -->
    8. <jaxws:endpoint implementor="com.ssm.webservice.impl.HelloImpl" address="/webServiceTest"></jaxws:endpoint>
    9. <!--访问地址:http://localhost:8080/ssm/webService/webServiceTest?wsdl-->
    复制代码
  • web.xml中的配置
       
    1. <servlet>
    2.     <servlet-name>CXFServlet</servlet-name>
    3.     <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
    4. </servlet>
    5. <servlet-mapping>
    6.     <servlet-name>CXFServlet</servlet-name>
    7.     <!--工程名(ssm)后面紧跟的 url-->
    8.     <url-pattern>/webService/*</url-pattern>
    9. </servlet-mapping>
    复制代码


  • 测试

  • 打开浏览器,输入http://localhost:8080/ssm/webService/webServiceTestwsdl举行测试
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。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

立聪堂德州十三局店

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表