• 一次搞定:借助Hutool封装代码快速解决webservice调用烦恼


    前言

    相信很多同行哪怕学了许多主流技术,但工作上依然免不了和传统企业打交道,而这样的企业往往还在用webservice做接口交互。

    本文是作者近两年和医疗行业的厂家打交道研究出来的一点调用webservice接口的心得,代码在生产环境也用了挺久了,专门捞出来作为一期干货分享给大家。

    愿天下再无webservice!

    正文

    引入Hutool依赖就不说了,直接上硬菜。

    1、选择测试案例

    因为公司内部调用的厂家webservice不方便公开,所以我在网上选择了一个免费的webservice接口作为案例。

    地址:http://www.webxml.com.cn/WebServices/WeatherWebService.asmx

    这里选择第一个即可

    image

    2、分析webservice

    调试提供方的webservice接口,首先要学会分析一下,基本上就是三原则。

    方法名称、命名空间、入参名称,如下图红框所示。

    image

    3、封装webservice客户端

    借助Hutool中的SoapClient来实现客户端调用webservice的工具类。

    首先,抽取命名空间和webservice地址,这里地址在调试阶段可以写死,后续再改为配置形式。

    image

    其次,定义调用客户端方法,入参分别是方法名、入参名、入参值。

    这样这个方法被调用时,就可以动态传入webservice中不同的方法及参数,达到公用的目的。

    红框部分就是Hutool提供的SoapClient创建客户端

    image

    4、优化客户端调用

    webservice在Hutool的工具类集合中属于非核心维护的一类工具,所以内部本身是有一些地方没有优化的。

    比如上面截图中的用法就是官网的说明,直接SoapClient.create()来创建。

    我们点进去源码看一下,发现每次都是new一个对象。

    image

    但因为封装的比较深,我们还是写个简单的方法验证一下是不是每次都新建了对象。

    直接创建两次对象,然后进行比较,看是否指向同一个引用,发现返回是false,说明确实是不同的对象。

    image

    考虑到生产环境下,存在访问量突增的可能,如果每次创建一个对象存在隐患,这里我们使用单例模式优化一下。

    单例模式的写法很多,我这里选择Holder方式,也就是双重检查锁进一步优化之后的方式,在高并发场景下要更合适一点。

    image

    接下来,我们验证下单例模式是否生效。

    image

    修改下之前创建客户端的代码,这样每次请求时,只获取一次客户端就可以了。

    image

    5、处理异常信息

    官网没有明确指出如何处理错误信息,但本身提供了相关的方法,我这边通过不断验证之后,给出了最优解。

    image

    6、测试效果

    调用一开始的webservice接口,看是否可以成功。

    image

    最后,这里展示下我负责的项目在生产环境调用第三方厂家webservice接口的入参和出参,同样使用的是上面封装的工具类。

    对方的入参和出参都是XML格式,最终效果如下:

    image

    总结

    1、拿到一个webservice接口后,首先分析命名空间、方法名、入参名分别是什么;

    2、使用Hutool提供的SoapClient工具类完成webservice的动态调用,同时配合单例模式进行优化;

    3、错误信息处理的优化。

    4、最后有一点要注意,Hutool的webservice工具类还未支持Java17,只兼容了Java8,因此不建议高版本使用,但目前大多数企业依然是Java8为主流版本,后续Hutool肯定也会根据版本来升级的。

    想查看完整工具类的也可以自己去下载,然后自己测一测效果。


    喜欢的xdm,麻烦【点个赞】,【收藏一下】以备后用,持续输出干货和工作中的一些经验,也可以点头像【关注下我】哦~


    __EOF__

  • 本文作者: 程序员济癫
  • 本文链接: https://www.cnblogs.com/fulongyuanjushi/p/17658768.html
  • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。
  • 相关阅读:
    iOS高级理论: Block介绍和使用
    【Java EE初阶二十二】https的简单理解
    解决启动项目初始化报错required a bean of type ‘int‘ that could not be found.的问题
    在 Azure ML 上用 .NET 跑机器学习
    php图片素材网毕业设计源码110907
    mysql加密存储敏感数据
    opencv创建图片,绘制图片,画框,划线,改变像素点颜色
    拓扑排序(一部分)
    Google Earth Engine(GEE)分析多个地区的植被覆盖趋势
    嵌入式 - 瑞萨宣讲
  • 原文地址:https://www.cnblogs.com/fulongyuanjushi/p/17658768.html