工作中需要调用python,c++等外来接口,其提供的方式为WSDL文档,WebService接口占有着很大份额,在最初我们以引入类似Axis等库来实现接口请求。需要引入多个依赖,这种方法过于麻烦。这里采用hutool提供的SoapClient来进行实现
一.单层情况
1.通过对wsdl地址进行访问,我们可以获取到wsdl文档的内容,可以确定调用的方法名与参数。
2.wsdl的xml文档内容较为复杂,当出现多层的情况下容易找不到内层的方法。最好通过soapUI工具先对地址进行解析,然后尝试调用请求。如下为两个参数,只有一层。
- 方法体为:
body
- 参数有2个,为:
urn:STARTDATE,urn:ENDDATE
- 定义了一个命名空间,前缀为
web
,URI为urn:DefaultNamespace
3.导入pom依赖
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.4.7</version>
</dependency>
采用java完成对接口的调用。
public static void temp(){
//传入的参数(命名空间与参数名称)
QName STARTDATE = new QName("urn:DefaultNamespace", "STARTDATE");
QName ENDDATE = new QName("urn:DefaultNamespace", "ENDDATE");
SoapClient client = SoapClient.create("wsdl的地址");
//传入参数的值
SOAPBodyElement body = client.setMethod(STARTDATE).getMethodEle();
body.setValue("2021-09-10 01:00:00");
SOAPBodyElement body2 = client.setMethod(ENDDATE).getMethodEle();
body2.setValue("2021-09-10 01:10:00");
//请求与调用ReUtil进行解析
String xml = client.send(true);
String data = ReUtil.get("\\{.*\\}", xml, 0);
System.out.println(data);
}
二.有子层的情况
方法属性被外侧套用,先获取外层再设置值
public static void temp2() throws SOAPException {
//调用的方法
QName STARTDATE = new QName("urn:DefaultNamespace", "GETCUSTOMERQUESTION");
SoapClient client = SoapClient.create("wsdl的地址");
//获取内层的方法STRPARAMS,然后对其进行设置值,为Json格式
SOAPElement s1 =
client.setMethod(STARTDATE).getMethodEle().addChildElement("STRPARAMS");
HashMap<String, String> map = new HashMap<>();
map.put("lastSubmitTimeStart","2021-09-10 01:00:00");
map.put("lastSubmitTimeEnd","2021-09-11 01:10:00");
String s = JSONUtil.toJsonStr(map);
s1.setValue(s);
String xml = client.send(true);
String data = ReUtil.get("\\{.*\\}", xml, 0);
System.out.println(data);
}