文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java使用Hutool调用WebService接口详解

2023-09-01 19:29

关注

提示:本文显示baidu.com,皆为脱敏用,并非真正地址。

目录

前言

一、WebService是什么?

二、使用步骤

1.验证链接。

2.Soap调用测试

3.获取需要用到的数据

4.Hutool工具类调用

三、示例

1.单个入参

2.多个入参

3.动态地址

4.多命名空间

总结


前言

大家WebService接口还在使用生成的类去实现调用的吗?

其实Hutool的WebService工具很厉害,但是文档写的不太清楚,或者示例不够多,我主要做医疗业务,对接方基本都是WebService接口,刚开始使用hutool的时候确实花费了挺长时间研究,最终失败告终,奈何业务多,有丰富的机会去尝试,现在基本啥格式的都可以克服了。


一、WebService是什么?

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

二、使用步骤

1.验证链接。

拿到三方提供的链接后,需要进行验证下 

例如:第三方提供链接:http://localhost:8080/XXX/services/xxxxxxImpl

 需要改成:第三方提供链接:http://localhost:8080/XXX/services/xxxxxxImpl?wsdl

然后用浏览器打开能像下图展示即可:

2.Soap调用测试

使用SoapUI进行接口调用一次(没有SoapUI的自己去安装下)

如下图进行创建

 打开,选择要调用的接口,点开request后,后边会出现一个框,里面有调用入参和请求地址

3.获取需要用到的数据

  1. 接口请求地址:http://localhost:8080/xxxxx/services/xxxxServiceImpl
  2. 请求头:SOAPAction:""
  3. 请求方法/接口:ser:ReceiveDataAll
  4. 前缀命名空间:http://service.mocire.baidu.com/
  5. 入参:
1]]>

4.Hutool工具类调用

针对上面的数据,我这边写好工具类,先上干货,然后一一为大家讲解:

package com.ceshi;import cn.hutool.core.lang.UUID;import cn.hutool.core.util.XmlUtil;import cn.hutool.http.webservice.SoapClient;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.util.Map;public class a {    private static Logger log = LoggerFactory.getLogger(a.class);    public static void main(String[] args) {        StringBuilder params = new StringBuilder("");        params.append("0]]>");        request("ReceiveDataAll",params.toString());    }        private static Map request(String method, String params){        String result = "";        String requestId = UUID.randomUUID().toString();        try{            String url = "http://localhost:8080/xxxxxx/services/xxxxServiceImpl";            SoapClient client = SoapClient.create(url)                    .header("SOAPAction","")                    // 设置要请求的方法,此接口方法前缀为web,传入对应的命名空间                    .setMethod("ser:"+method, "http://service.mocire.baidu.com/")                    .setParam("message",params,false);//此处写true,会自动填写命名空间            log.info("[请求ID:{}]CSDN测试方法字符串接口:{},入参:{}",requestId,url,client.getMsgStr(true));            // 发送请求,参数true表示返回一个格式化后的XML内容            // 返回内容为XML字符串,可以配合XmlUtil解析这个响应            result = client.send(false);            log.info("[请求ID:{}]CSDN测试方法字符串出参:{}",requestId,result);            if(result.contains(""));            }else{                result = result.substring(result.indexOf("Result>")+7,result.indexOf("} resultMap = XmlUtil.xmlToMap(result);            return resultMap;        }catch (Exception ex){            log.error("[请求ID:{}]CSDN测试方法字符串出现异常,入参:{},出参:{},{}",requestId,params,result,ex);            throw ex;        }    }}

如果是多个入参,可以选用setParams,写入一个map,键值对,然后统一配置是否添加前缀

我这边只是拿这个接口做了一个测试,下面会给大家整理下我这边遇到的各种不通类型的请求信息和工具类

三、示例

1.单个入参

请求数据:

接口地址:http://localhost:8080/xxxxxx/services/xxxxServiceImpl请求头:SOAPAction: ""                              1]]>         

请求方法:

public static void main(String[] args) {        StringBuilder params = new StringBuilder("");        params.append("0]]>");        request("ReceiveDataAll",params.toString());    }        private static Map request(String method, String params){        String result = "";        String requestId = UUID.randomUUID().toString();        try{            String url = "http://localhost:8080/xxxxxx/services/xxxxServiceImpl";            SoapClient client = SoapClient.create(url)                    .header("SOAPAction","")                    // 设置要请求的方法,此接口方法前缀为web,传入对应的命名空间                    .setMethod("ser:"+method, "http://service.mocire.baidu.com/")                    .setParam("message",params,false);//此处写true,会自动填写命名空间            log.info("[请求ID:{}]CSDN测试方法字符串接口:{},入参:{}",requestId,url,client.getMsgStr(true));            // 发送请求,参数true表示返回一个格式化后的XML内容            // 返回内容为XML字符串,可以配合XmlUtil解析这个响应            result = client.send(false);            log.info("[请求ID:{}]CSDN测试方法字符串出参:{}",requestId,result);            if(result.contains(""));            }else{                result = result.substring(result.indexOf("Result>")+7,result.indexOf("} resultMap = XmlUtil.xmlToMap(result);            return resultMap;        }catch (Exception ex){            log.error("[请求ID:{}]CSDN测试方法字符串出现异常,入参:{},出参:{},{}",requestId,params,result,ex);            throw ex;        }    }

2.多个入参

请求数据:

接口地址:http://localhost:8080/xxxxxx/services/xxxxServiceImpl请求头:SOAPAction: "http://tempuri.org/GetThirdAppData"                     1000001         1         11000001]]>         

请求示例:

public static Map write(String param){        String result = "";        String requestId = UUID.randomUUID().toString();        try{            String hospitalNo = "1";            String patientId = "1000001";            //拼接strXML            Map paramMap = new HashMap<>();            paramMap.put("HOSPITAL_NO", hospitalNo);//医院编码            paramMap.put("PATIENT_ID",patientId);//患者ID            String paramStr = "";            //拼接外层入参            Map params = new HashMap<>();            params.put("strPatientId",patientId);            params.put("strHospitalNo",hospitalNo);            params.put("strXML",paramStr);            //新建客户端            String url = "";            SoapClient client = SoapClient.create("http://localhost:8080/xxxxxx/services/xxxxServiceImpl")                    .header("SOAPAction","http://tempuri.org/GetThirdAppData")                    // 设置要请求的方法,此接口方法前缀为web,传入对应的命名空间                    .setMethod("tem:GetThirdAppData", "http://tempuri.org/")                    .setParams(params,true);            log.info("[请求ID:{}]CSDN测试方法字符串接口:{},入参:{}",requestId,url,client.getMsgStr(true));            // 发送请求,参数true表示返回一个格式化后的XML内容            // 返回内容为XML字符串,可以配合XmlUtil解析这个响应            result = client.send(false);            log.info("[请求ID:{}]CSDN测试方法字符串出参:{}",requestId,result);            if(result.contains(""));            }else{                result = result.substring(result.indexOf("Result>")+7,result.indexOf("} resultMap = XmlUtil.xmlToMap(result);            return resultMap;        }catch (Exception ex){            log.error("[请求ID:{}]CSDN测试方法字符串出现异常出参:{},{}",requestId,result,ex);            throw ex;        }    }

3.动态地址

请求数据:

接口地址:http://localhost:8080/xxxxxx/services/xxxxServiceImpl.cls?CfgItem=A101查询患者信息接口请求头:SOAPAction: "http://baidu.com/BS.XmlService.Send"                     0]]>         

请求示例:

public static void main(String[] args) {        StringBuilder params = new StringBuilder("");        params.append("0]]>");        request("A101查询患者信息接口",params.toString());    }        private static Map request(String method, String params){        String result = "";        String requestId = UUID.randomUUID().toString();        try{            String url = "http://localhost:8080/xxxxxx/services/xxxxServiceImpl.cls?CfgItem="+method;            SoapClient client = SoapClient.create(url)                    .header("SOAPAction","http://baidu.com/BS.XmlService.Send")                    // 设置要请求的方法,此接口方法前缀为web,传入对应的命名空间                    .setMethod("bjg:Send", "http://baidu.com")                    .setParam("pInput",params,true);            log.info("[请求ID:{}]CSDN请求方法字符串接口:{},入参:{}",requestId,url,client.getMsgStr(true));            // 发送请求,参数true表示返回一个格式化后的XML内容            // 返回内容为XML字符串,可以配合XmlUtil解析这个响应            result = client.send(false);            log.info("[请求ID:{}]CSDN请求方法字符串出参:{}",requestId,result);            if(result.contains(""));            }else{                result = result.substring(result.indexOf("Result>")+7,result.indexOf("} resultMap = XmlUtil.xmlToMap(result);            return resultMap;        }catch (Exception ex){            log.error("[请求ID:{}]CSDN请求方法字符串出现异常,接口:{},入参:{},出参:{},{}",requestId,method,params,result,ex);            throw ex;        }    }

4.多命名空间

请求数据:

接口地址:http://localhost:8080/xxxxxx/services/xxxxServiceImpl.cls请求头:SOAPAction: "http://tempuri.org/ITJTCService/SubmitReservationExam"                      111111111111            

请求示例:

private static Map request(String params) throws SOAPException {        String result = "";        String requestId = UUID.randomUUID().toString();        try{            //新建客户端            String url = "http://localhost:8080/xxxxxx/services/xxxxServiceImpl";            SoapClient client = SoapClient.create(url)                    .header("SOAPAction","http://tempuri.org/ITJTCService/SubmitReservationExam")                    // 设置要请求的方法,此接口方法前缀为web,传入对应的命名空间                    .setMethod("tem:SubmitReservationExam","http://tempuri.org/");            //修改一级和二级前缀为tem            SOAPBodyElement soapBodyElement = client.getMethodEle();            soapBodyElement.getParentElement().getParentElement().addNamespaceDeclaration("tem","http://tempuri.org/").addNamespaceDeclaration("ly","http://schemas.datacontract.org/2004/07/LY.WebService.Service.Models");            SOAPElement soapElement = soapBodyElement.addChildElement(new QName("http://tempuri.org/","info","tem"));            soapElement.addChildElement("CardNo","ly").setValue("111111111111111111");            log.info("[请求ID:{}]CSDN测试方法字符串接口:{},入参:{}",requestId,url,client.getMsgStr(true));            // 发送请求,参数true表示返回一个格式化后的XML内容            // 返回内容为XML字符串,可以配合XmlUtil解析这个响应            result = client.send(false);            log.info("[请求ID:{}]CSDN测试方法字符串出参:{}",requestId,result);            if(result.contains(""));            }else{                result = result.substring(result.indexOf("Result>")+7,result.indexOf("} resultMap = XmlUtil.xmlToMap(result);            return resultMap;        }catch (Exception ex){            log.error("[请求ID:{}]CSDN请求方法字符串出现异常,入参:{},出参:{},{}",requestId,params,result);            throw ex;        }    }

此入参类型方法特别难调用,之前反馈过hutool,hutool暂不打算深入优化,我这边提供的解决方案hutool推荐使用。


总结

其实大部分入参类型都包含在这里面了,如果还有新的,无法使用的可以将wsdl页面右键查看源文件把html代码发给我,我这边研究下,有啥问题也欢迎在下面提问,我这边看见就会回答的。

来源地址:https://blog.csdn.net/zpwvip/article/details/127487596

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯