一次搞定:借助Hutool封装代码快速解决webservice调用烦恼
前言
相信很多同行哪怕学了许多主流技术,但工作上依然免不了和传统企业打交道,而这样的企业往往还在用webservice做接口交互。
本文是作者近两年和医疗行业的厂家打交道研究出来的一点调用webservice接口的心得,代码在生产环境也用了挺久了,专门捞出来作为一期干货分享给大家。
愿天下再无webservice!
正文
引入Hutool依赖就不说了,直接上硬菜。
1、选择测试案例
因为公司内部调用的厂家webservice不方便公开,所以我在网上选择了一个免费的webservice接口作为案例。
地址:http://www.webxml.com.cn/WebServices/WeatherWebService.asmx
这里选择第一个即可

2、分析webservice
调试提供方的webservice接口,首先要学会分析一下,基本上就是三原则。
方法名称、命名空间、入参名称,如下图红框所示。

3、封装webservice客户端
借助Hutool中的SoapClient来实现客户端调用webservice的工具类。
首先,抽取命名空间和webservice地址,这里地址在调试阶段可以写死,后续再改为配置形式。

其次,定义调用客户端方法,入参分别是方法名、入参名、入参值。
这样这个方法被调用时,就可以动态传入webservice中不同的方法及参数,达到公用的目的。
红框部分就是Hutool提供的SoapClient创建客户端

4、优化客户端调用
webservice在Hutool的工具类集合中属于非核心维护的一类工具,所以内部本身是有一些地方没有优化的。
比如上面截图中的用法就是官网的说明,直接SoapClient.create()来创建。
我们点进去源码看一下,发现每次都是new一个对象。

但因为封装的比较深,我们还是写个简单的方法验证一下是不是每次都新建了对象。
直接创建两次对象,然后进行比较,看是否指向同一个引用,发现返回是false,说明确实是不同的对象。

考虑到生产环境下,存在访问量突增的可能,如果每次创建一个对象存在隐患,这里我们使用单例模式优化一下。
单例模式的写法很多,我这里选择Holder方式,也就是双重检查锁进一步优化之后的方式,在高并发场景下要更合适一点。

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

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

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

6、测试效果
调用一开始的webservice接口,看是否可以成功。

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

总结
1、拿到一个webservice接口后,首先分析命名空间、方法名、入参名分别是什么;
2、使用Hutool提供的SoapClient工具类完成webservice的动态调用,同时配合单例模式进行优化;
3、错误信息处理的优化。
4、最后有一点要注意,Hutool的webservice工具类还未支持Java17,只兼容了Java8,因此不建议高版本使用,但目前大多数企业依然是Java8为主流版本,后续Hutool肯定也会根据版本来升级的。
想查看完整工具类的也可以自己去下载,然后自己测一测效果。
喜欢的xdm,麻烦【点个赞】,【收藏一下】以备后用,持续输出干货和工作中的一些经验,也可以点头像【关注下我】哦~
一次搞定:借助Hutool封装代码快速解决webservice调用烦恼的更多相关文章
- 30行代码搞定WCF并发性能测试
[以下只是个人观点,欢迎交流] 30行代码搞定WCF并发性能 轻量级测试. 1. 调用并发测试接口 static void Main() { List< ...
- 【摸鱼神器】一次搞定 vue3的 路由 + 菜单 + tabs
做一个管理后台,首先要设置路由,然后配置菜单(有时候还需要导航),再来一个动态tabs,最后加上权限判断. 这个是不是有点繁琐?尤其是路由的设置和菜单的配置,是不是很雷同?那么能不能简单一点呢?如果可 ...
- 10天彻底搞定-webpack4.0
本机存放的路径: F:\教程\10天彻底搞定-webpack4.0 联想电脑代码存放的路径: D:\MyDemos\webpack4 10天彻底搞定-webpack4.0 1.webpack课程介绍 ...
- 对百度WebUploader的二次封装,精简前端代码之图片预览上传(两句代码搞定上传)
前言 本篇文章上一篇: 对百度WebUploader开源上传控件的二次封装,精简前端代码(两句代码搞定上传) 此篇是在上面的基础上扩展出来专门上传图片的控件封装. 首先我们看看效果: 正文 使用方式同 ...
- 对百度WebUploader开源上传控件的二次封装,精简前端代码(两句代码搞定上传)
前言 首先声明一下,我这个是对WebUploader开源上传控件的二次封装,底层还是WebUploader实现的,只是为了更简洁的使用他而已. 下面先介绍一下WebUploader 简介: WebUp ...
- 【开源】简单4步搞定QQ登录,无需什么代码功底【无语言界限】
说17号发超简单的教程就17号,qq核审通过后就封装了这个,现在放出来~~ 这个是我封装的一个开源项目:https://github.com/dunitian/LoTQQLogin ————————— ...
- 10行代码搞定移动web端自定义tap事件
发发牢骚 移动web端里摸爬滚打这么久踩了不少坑,有一定移动web端经验的同学一定被click困扰过.我也不列外.一路走来被虐的不行,fastclick.touchend.iscroll什么的都用过, ...
- 开源作品ThinkJDBC—一行代码搞定数据库操作
1 简介 ThinkJD,又名ThinkJDBC,一个简洁而强大的开源JDBC操作库.你可以使用Java像ThinkPHP框架的M方法一样,一行代码搞定数据库操作.ThinkJD会自动管理数据库连接, ...
- IOS 一句代码搞定启动引导页
前言引导页,一个酷炫的页面,自从微博用了之后一下就火起来了,对于现在来说一个app如果没有引导页似乎总显那么不接地气,那么为了让我们的app也“高大上”一次,我写了一个demo来实现启动引导页的实现, ...
- Tensorflow快餐教程(1) - 30行代码搞定手写识别
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/lusing/article/details ...
随机推荐
- Java程序设计复习提纲(下:图形界面)
目录 上:Java程序设计复习提纲(上:入门语法) - 孤飞 - 博客园 (cnblogs.com) 基本语法与编译运行 数据类型和关键字 常用语法 数组与字符串 异常处理 中:Java程序设计复习提 ...
- 去掉DosBox烦人的Status Windows
首先我们上成品动态图 很干净,很清爽有没有! 步骤 1.找到并选中DosBox快捷方式,鼠标右键点击选择属性 2.修改目标后面的参数,默认是 -userconf ,再添加一个 -noconsole 就 ...
- vue使用import()提示语法错误
一.使用import 引入 组件 二.编译时提示语法检测错误 三.解决方法 第一种方式:直接安装 D:\YLKJPro\CMWEB\03Implement\CustomMapWeb>npm in ...
- Vue3.3 的新功能的体验(下):泛型组件(Generic Component) 与 defineSlots
上一篇说了 DefineOptions.defineModel.Props 的响应式解构和从外部导入类型 这几个新功能,但是没有说Generic.defineSlots等,这是因为还没有完全搞清楚可以 ...
- 代码随想录算法训练营Day16二叉树|104.二叉树的最大深度 559.n叉树的最大深度 111.二叉树的最小深度 222.完全二叉树的节点个数
代码随想录算法训练营 代码随想录算法训练营Day16二叉树|104.二叉树的最大深度 559.n叉树的最大深度 111.二叉树的最小深度 222.完全二叉树的节点个数 104.二叉树的最大深度 题目 ...
- tryhackme-OWASP
tryhackme-OWASP Top 10部分记录 敏感信息泄露 在assets目录中 可以看到到一个sqlite数据库的webapp.db文件 使用sqlite3 webapp.db .table ...
- Java NIO原理 (Selector、Channel、Buffer、零拷贝、IO多路复用)
系列文章目录和关于我 零丶背景 最近有很多想学的,像netty的使用.原理源码,但是苦于自己对于操作系统和nio了解不多,有点无从下手,遂学习之. 一丶网络io的过程 上图粗略描述了网络io的过程,了 ...
- java接口返回图片链接或pdf链接如何设置在线预览还是下载
之前文章说到了如何通过将文件转成图片或者pdf来实现在线预览,一般来说在线预览图片或者pdf都是存储在图片服务器上的,在通过接口调用把文件返回给前端,但是把文件返回给前端效果一般是有两种:在线预览和下 ...
- C++容器(vector、deque、list、map)
(1) vector:将元素置于一个动态数组中,可以随机存储元素(也就是用索引直接存取). 数组尾部添加或删除元素非常迅速.但在中部或头部就比较费时. *代码演示:* 取: at在下标越界时会抛出异常 ...
- GPT生成式预训练Transformer架构应用实战
目录 1. 引言 2. 技术原理及概念 2.1 基本概念解释 2.2 技术原理介绍 2.3 相关技术比较 3. 实现步骤与流程 3.1 准备工作:环境配置与依赖安装 3.2 核心模块实现 3.3 集成 ...