我们一般在开发项目中很多时候都会涉及到调用三方的接口,比如一个电商项目需要调用物流接口、支付接口等等;一个旅游类的系统会调用国内的各大旅游厂商的接口甚至一些硬件厂商的接口等等。在这些接口中遇到最多的就是Http/Https的接口,但是在一些老的项目中还是延续了WebService这种接口,所以本文介绍两种WebService客户端的程序编写(axis及hutool中的封装),以及axis这种方式常见的异常解决方案。
一、WebService客户端程序
1、axis方式
首先引入以下包:
<dependency>
<groupId>org.apache.axis</groupId>
<artifactId>axis</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>org.apache.axis</groupId>
<artifactId>axis-jaxrpc</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>commons-discovery</groupId>
<artifactId>commons-discovery</artifactId>
<version>0.2</version>
</dependency>
<!--以下的mail包是springboot项目引入包,如果你是maven项目请看“二->3”引入对应的包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
编写客户端代码:
package com.test.webservice;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import javax.xml.namespace.QName;
public class WebService {
public String exec(String url,String namespaceURI,String method,Object[] params) throws Exception {
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress(new java.net.URL(url));
call.setOperationName(new QName(namespaceURI,method));
String result = (String)call.invoke(params);
System.out.println("webService接口返回数据"+result);
return result;
}
}
然后根据返回的数据是xml则按照xml格式进行解析,json格式按照json格式解析即可。
2、Hutool的SoapClient方式
Hutool官方文档 首先引入Hutool的包:
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.12</version>
</dependency>
编写客户端代码:
package com.test.webservice;
import cn.hutool.http.webservice.SoapClient;
import java.util.Map;
public class WebService {
public String exec(String url, String namespaceURI, String method, Map<String, Object> params) {
SoapClient client = SoapClient.create(url)
.setMethod(method, namespaceURI)
.setParams(params, false);
String result = client.send();
System.out.println("webService接口返回数据" + result);
return result;
}
}
说明: setParams方法设置请求参数,useMethodPrefix为true表示为每个参数的key自动加上方法的前缀,false则不加,比如方法为web:getName那么前缀就是web,即是否为每个参数的key添加web:前缀。 send方法参数传true那么会将webService接口返回的数据使用XmlUtil转换为xml格式,如果不需要转换比如该webService接口返回为json格式已经很方便解析了则不传参数或者传入false,则会保留原格式返回。 然后根据返回的数据是xml则按照xml格式进行解析,json格式按照json格式解析即可。
二、axis常见异常解决方案
1、Call call = (Call) service.createCall() 出现类型转换异常
原因是service.createCall()方法返回的是javax.xml.rpc.Call而非我们需要强转的org.apache.axis.client.Call 解决方案:引入axis-jaxrpc 1.4包
2、Exception in thread “main” java.lang.NoClassDefFoundError: org/apache/commons/discovery/tools/DiscoverSingleton异常
解决方案:引入commons-discovery包
3、Unable to find required classes (javax.activation.DataHandler and javax.mail异常
解决方案:引入mail包 maven项目引入以下两个包:
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4</version>
</dependency>
spring boot项目引入以下包:
4、faultCode:{http://schemas.xmlsoap.org/soap/enevlope/}Server.userException异常
出现此异常的原因大概率是因为WebService的服务端非正常可用状态,比如未启动或者服务端已经挂掉等等
|