SpringBoot项目使用 axis 调用webservice接口(亲测可行)

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第7天,点击查看活动详情

实际工作场景中会存在对接去很多系统的数据的任务,数据对接呢 方式很多吧,接触过 :

  • http| https请求
  • 数据库视图
  • 数据库存储过程
  • soap+xml工单...

然后这两天接到一个关于webservice 数据接口的方式对接,说实话对于这个一脸懵逼,完全不知道是啥(听一个比较年长的大哥说一些比较老的系统中喜欢使用这个进行数据对接)。所以只能学习一下然后进行搞了

WebService

定义

image.png

个人理解

通过度娘等方式,个人理解为变相的soap协议加xml工单处理,

实践

webservice 常识

一个webservice 接口发布地址往往类似:

  • qq 在线验证接口:

www.webxml.com.cn/webservices…

  • 其他可测试接口:

email电子邮箱地址接口: www.webxml.com.cn/WebServices…

全国天气情况接口:

www.webxml.com.cn/WebServices…

qq在线接口验证接口为例

在接口后面加:/wsdl www.webxml.com.cn/webservices…

访问查看然后找到下图中定义的内容:注意使用关联key找到对应的必要使用的参数。

image.png

maven 使用 axis

应用依赖(不可缺失必须)

        <!-- https://mvnrepository.com/artifact/org.apache.axis/axis -->
        <dependency>
            <groupId>org.apache.axis</groupId>
            <artifactId>axis</artifactId>
            <version>1.4</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/wsdl4j/wsdl4j -->
        <dependency>
            <groupId>wsdl4j</groupId>
            <artifactId>wsdl4j</artifactId>
            <version>1.6.2</version>
        </dependency>
<!--        解决cell 转换问题-->
        <!-- https://mvnrepository.com/artifact/javax.xml/jaxrpc-api -->
        <dependency>
            <groupId>javax.xml</groupId>
            <artifactId>jaxrpc-api</artifactId>
            <version>1.1</version>
        </dependency>
<!--       解析调用结果以及数据转换包-->
        <!-- https://mvnrepository.com/artifact/commons-discovery/commons-discovery -->
        <dependency>
            <groupId>commons-discovery</groupId>
            <artifactId>commons-discovery</artifactId>
            <version>0.2</version>
        </dependency>
复制代码

代码(粘贴可用)

@Test
public void testWebService() {
    try {
        //wsdl地址
        String endpoint = "http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx";
        //命名空间
        String namespace = "http://WebXml.com.cn/";
        //服务名
        String serviceName = "qqOnlineWebService";
        //方法名
        String methodName = "qqCheckOnline";
        //soapAction
        String soapAction = "http://WebXml.com.cn/qqCheckOnline";


        Service service = new Service();
        Call call = (Call) service.createCall();
        //设置响应超时
        call.setTimeout(3000);

        //设置地址
        call.setTargetEndpointAddress(new java.net.URL(endpoint));

        //设置方法名
        call.setOperationName(new QName(namespace, methodName));


        //设置参数
        call.addParameter(new QName(namespace, "qqCode")
                , org.apache.axis.encoding.XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN);

        //设置返回类型
        call.setReturnType(XMLType.XSD_SCHEMA);

        //启用soap
        call.setUseSOAPAction(true);
        //设置soapAction
        call.setSOAPActionURI(soapAction);

        //设置服务名
        SOAPService soapService = new SOAPService();
        soapService.setName(serviceName);
        call.setSOAPService(soapService);


        Schema result = (Schema) call.invoke(new Object[]{"xxxxx"});

        for (int i = 0; i < result.get_any().length; i++) {
            System.out.println(result.get_any()[i]);
        }

    } catch (Exception e) {
        log.error("ddd", e);
    }

}
复制代码

对于以上代码,我这边吐槽一下,网上其实很多这个的例子但是实际调用的时候会出问题,注意点:

  • 设置参数

image.png

  • 获取结果

image.png xxxx需要填写真实的QQ号码

end

无力吐槽,网上很多关于这种方式调用的例子,但是实际情况用不了,所以大家自己好好甄别吧,当然遇见问题的话好好百度也是能够解决的,方向没有错就是。

忠告一点: 当遇见不知道的内容时 ,要学会百度学习的方式

  • 能google最好google
  • 去比较靠谱的社区找,云溪社区 ,华为云社区 ,然后才是 csdn ,掘金之类的...
  • github 也是可以的不过一般要求比较高

猜你喜欢

转载自juejin.im/post/7109655800326389767