专栏首页灵儿的笔记[亲测可用]springBoot调用对方webService接口的几种方法示例

[亲测可用]springBoot调用对方webService接口的几种方法示例

前言

平常我们开发调用接口一般会用到几种数据格式,比如有restful的,这个是目前最流行的,也是最简单开发的,还有一种就是webservice数据格式,这个应该是很久以前的一些项目是用的这种

那什么是webservice呢,Web service是一个平台独立的,低耦合的,自包含的、基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述、发布、发现、协调和配置这些应用程序,用于开发分布式的互操作的应用程序

在调用别人写好的webservice服务的时候,对方会给你一串schema文件(xsd文件)或者是wsdl结尾的地址,你访问wsdl地址和xsd文件是一样的,比如下面的xsd格式的例子

当然还有很多其他的xsd例子,点击查看:https://my.oschina.net/CraneHe/blog/183471

<wsdl:definitions xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://xxx.zygxsq.cn/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:ns1="http://schemas.xmlsoap.org/soap/http" name="PowerAlarmImplService" targetNamespace="http://xxx.zygxsq.cn/">
<wsdl:types>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://xxx.zygxsq.cn/" elementFormDefault="unqualified" targetNamespace="http://xxx.zygxsq.cn/" version="1.0">
<xs:element name="queryPowerAlarm" type="tns:queryPowerAlarm"/>
<xs:element name="queryPowerAlarmResponse" type="tns:queryPowerAlarmResponse"/>
<xs:complexType name="queryPowerAlarm">
<xs:sequence>
<xs:element minOccurs="0" name="alarmId" type="xs:string"/>
<xs:element minOccurs="0" name="eventTime" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="queryPowerAlarmResponse">
<xs:sequence>
<xs:element minOccurs="0" name="return" type="tns:powerAlarmRsp"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="powerAlarmRsp">
<xs:complexContent>
<xs:extension base="tns:baseRsp">
<xs:sequence>
<xs:element maxOccurs="unbounded" minOccurs="0" name="responseList" nillable="true" type="tns:powerAlarm"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="baseRsp">
<xs:sequence>
<xs:element minOccurs="0" name="errorInfo" type="xs:string"/>
<xs:element name="resultCode" type="xs:int"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="powerAlarm">
<xs:sequence>
<xs:element minOccurs="0" name="alarmId" type="xs:string"/>
<xs:element minOccurs="0" name="alarmStatus" type="xs:string"/>
<xs:element minOccurs="0" name="canelTime" type="xs:string"/>
<xs:element minOccurs="0" name="eventTime" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
</wsdl:types>
<wsdl:message name="queryPowerAlarmResponse">
<wsdl:part element="tns:queryPowerAlarmResponse" name="parameters"> </wsdl:part>
</wsdl:message>
<wsdl:message name="queryPowerAlarm">
<wsdl:part element="tns:queryPowerAlarm" name="parameters"> </wsdl:part>
</wsdl:message>
<wsdl:portType name="IPowerAlarm">
<wsdl:operation name="queryPowerAlarm">
<wsdl:input message="tns:queryPowerAlarm" name="queryPowerAlarm"> </wsdl:input>
<wsdl:output message="tns:queryPowerAlarmResponse" name="queryPowerAlarmResponse"> </wsdl:output>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="PowerAlarmImplServiceSoapBinding" type="tns:IPowerAlarm">
<soap12:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="queryPowerAlarm">
<soap12:operation soapAction="" style="document"/>
<wsdl:input name="queryPowerAlarm">
<soap12:body use="literal"/>
</wsdl:input>
<wsdl:output name="queryPowerAlarmResponse">
<soap12:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="PowerAlarmImplService">
<wsdl:port binding="tns:PowerAlarmImplServiceSoapBinding" name="PowerAlarmImplPort">
<soap12:address location="http://11.111.11.111:9556/xxx/ws/powerAlarmWs"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>

一、需要用到的maven

       <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-ws</artifactId>
            <version>1.3.3.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>wsdl4j</groupId>
            <artifactId>wsdl4j</artifactId>
        </dependency>

二、如何调用webservice接口

调用方法一:

最简单的就是用这种方法,可以直接调对方的webService接口

/**
* 调用webservice接口
* 原文章链接:https://blog.csdn.net/qq_27471405/article/details/105275657
* 其他均为盗版,公众号:灵儿的笔记(zygxsq)
*/
public String sendWsdl(Object obj) {
        logger.info("--------调用webservice接口begin-------");
        // 创建动态客户端
        JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();

        //对方的wsdl地址
        Client client = dcf.createClient("http://xx
.xxx.xx.xx:9556/xxx/ws/getAlarmWs?wsdl");
        String json = null;
        try {

            QName qName = new QName("http://xx.zygxsq.cn/", "getAlarmWs");                                                //*原文章链接:https://blog.csdn.net/qq_27471405/article/details/105275657     * 其他均为盗版,公众号:灵儿的笔记(zygxsq)
            Object[] objects1= client.invoke(qName, "aaa","bbb"); //参数1,参数2,参数3......按顺序放就看可以

            json = JSONObject.toJSONString(objects1[0]);
            System.out.println("返回数据:" + json.toString());

        } catch (Exception e) {
            e.printStackTrace();
            logger.info("服务器断开连接,请稍后再试");
        }
        logger.info("--------调用webservice接口end-------");
        return json;


    }

调用方法二:

得借助开发工具生成代码,比如myEclipse 和 idea 工具

myEclipse 生成的教程可以看下这篇文章:https://www.cnblogs.com/demojie/archive/2017/08/24/java_webservice.html

idea 生成的教程可以看下这篇文章:https://blog.csdn.net/weixin_40699910/article/details/103399292

myEclipse生成的例子:

myEclipse根据xsd文件生成webservice代码教程

1、如果选择本地的wsdl文件,生成后就是这么一堆代码,如图所示

看我截图中显示的一个文件,因为我把wsdl文件是放在D盘目录下, 然后生成的,如果你们是直接用对方url生成的,这里应该就是对方的url地址,当然你也可以跟我一样,放在本地生成,然后改成对方的地址,也是可以的。这个智者见智。

通过myeclipse生成上面的代码之后,不一定就要在myeclipse上面开发,可以copy上面9个这些代码到任何项目地方去,比如idea中,然后就可以通过下面的代码去调用对方

/**
*调用webservice接口
*原文章链接:https://blog.csdn.net/qq_27471405/article/details/105275657
* 其他均为盗版,公众号:灵儿的笔记(zygxsq)
*/
public String sendWsdlWebService(String aaa,String bbb) {
        logger.info("--------调用webservice查询接口begin-------");
        QueryPowerAlarmResponse queryPowerAlarmResponse=null;
        URL url;
        String json="";
        try {

            url = new URL("http://11.111.111.111:9556/xxx/ws/powerAlarmWs?wsdl");
            //Qnameqname是qualified name 的简写
            //2.构成:由名字空间(namespace)前缀(prefix)以及冒号(:),还有一个元素名称构成
            QName qname=new QName("http://xxx.zygxsq.cn/","PowerAlarmImplService");
            javax.xml.ws.Service service= javax.xml.ws.Service.create(url, qname);                                 //*原文章链接:https://blog.csdn.net/qq_27471405/article/details/105275657     * 其他均为盗版,公众号:灵儿的笔记(zygxsq)
            IPowerAlarm port = service.getPort(IPowerAlarm.class);
            PowerAlarmRsp powerAlarmRsp = port.queryPowerAlarm(aaa, bbb);

            json = JSONObject.toJSONString(powerAlarmRsp);
           // System.out.println("111返回数据:" + json.toString());

        }catch (Exception e){
            e.printStackTrace();
        }
        logger.info("--------调用webservice查询接口end-------");
        return json;

    }

idea生成的例子:

当然,idea也是可以生成代码的,只是相对myeclipse的生成比较麻烦,要引入一堆的maven,然后才能生成,

具体完整的可以参考这篇文章:https://blog.csdn.net/weixin_40699910/article/details/103399292

这里我就不写了,我就在这里写一下要注意的一点:要引入的maven,就是下面这一堆,而且生成代码后,要注释掉这些maven,或者去掉这些maven,不然你每编译一次,就会重新生成一份webSocket的代码。

  <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
      <plugin>
        <groupId>org.jvnet.jaxb2.maven2</groupId>
        <artifactId>maven-jaxb2-plugin</artifactId>
        <version>0.12.3</version>
        <executions>
          <execution>
            <goals>
              <goal>generate</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <schemaLanguage>WSDL</schemaLanguage>
          <generatePackage>com.dexcoder.ws</generatePackage>
          <generateDirectory>${basedir}/src/main/java</generateDirectory>
          <schemas>
            <schema>
              <fileset>
                <directory>${basedir}/src/main/resources</directory>
                <includes>
                <include>*.wsdl</include>
              </fileset>
            </schema>
          </schemas>
        </configuration>
      </plugin>
    </plugins>

参考文章

https://www.cnblogs.com/demojie/archive/2017/08/24/java_webservice.html

https://blog.csdn.net/weixin_40699910/article/details/103399292

感谢原作者的分享,让技术人能够更快的解决问题

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 一天只弹出1次的公告代码

    <html> <head> <title>温馨提醒</title> <meta http-equiv="Content-Type" content="text/...

    小小鱼儿小小林
  • [已解决]mysql查询一周内的数据,解决一周的起始日期是从星期日(星期天|周日|周天)开始的问题

    大家可以很明显的看到2018年12月2日的记录也查出来了,12月2日是星期日。为了让大家更直观的看,我把12月的月份截出来

    小小鱼儿小小林
  • Extjs中给一个组件命名时,id,name,hiddenName这三者的用法和区别是什么

    Extjs中给一个组件命名时,id,name,hiddenName这三者的用法和区别是什么 id,name与HTML中元素的id、name相对应 hidde...

    小小鱼儿小小林
  • leetcode: 57. Insert Interval

    JNingWei
  • 40道+JavaScript基础面试题(附答案)

    来源 | https://segmentfault.com/a/1190000015288700

    winty
  • python学习之旅(十六)

    在“主程序”中,变量'_name_'的值是'_main_',而在导入的模块中,这个值就被设定为模块的名字

    py3study
  • Struts2 Wildcard 和DMI

    关于Struts2 Action中的最基本method配置我就不说,那个比较死板。关于这个method有两个动态调用Action方法的方法:WildCard(...

    the5fire
  • JavaScript学习总结(四)——this、原型链、javascript面向对象

    一、this 在JavaScript中this表示:谁调用它,this就是谁。 JavaScript是由对象组成的,一切皆为对象,万物皆为对象。this是一个动...

    张果
  • 10个JavaScript常见BUG及修复方法

    Fundebug
  • Ajax轮询定时的通过Ajax查询服务端

    客户端按规定时间定时向服务端发送ajax请求,服务器接到请求后马上返回响应信息并关闭连接。

    挨踢小子部落阁

扫码关注云+社区

领取腾讯云代金券