前言
最近需要对接另一个系统提供的 WebService 接口,在网上查了很多种方法都不行,这里记录一下我使用的方法,仅供大家参考。注意我这里使用的是 Axis 而不是 Axis2,可能是提供的 WebService 接口版本太老了,我使用 Axis2 也无法调用。
实现
引入 Maven
<!-- Axis 调用 WebService 接口 Start -->
<dependency>
<groupId>org.apache.axis</groupId>
<artifactId>axis</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>javax.xml.rpc</groupId>
<artifactId>javax.xml.rpc-api</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>org.apache.geronimo.bundles</groupId>
<artifactId>commons-discovery</artifactId>
<version>0.4_1</version>
</dependency>
<!-- Axis 调用 WebService 接口 End -->
三个包都必须引入,不然会报错。
代码
@Slf4j
public class WebServiceUtil {
private final static String URL = "http://ip:port/WebService/WebServiceSOAP2.asmx";
private final static String AUTH_KEY = "123";
/**
* 发送请求
*
* @param localPart 接口名
* @param desc 接口描述
* @param params 请求参数
* @param rClass 响应实体
* @return R
*/
@SneakyThrows
private static <Q, R> R request(String localPart, String desc, Q params, Class<R> rClass) {
// 转换为xml
String requestXml = XmlUtil.beanToXML(params);
log.info("WebService-{}接口请求参数为:{}", desc, requestXml);
Service service = new Service();
Call call = (Call) service.createCall();
call.setTimeout(30000);
call.setTargetEndpointAddress(new URL(URL));
call.setSOAPActionURI("http://tempuri.org/" + localPart);
// 设置操作的名称
call.setOperationName(new QName("http://tempuri.org/", localPart));
// 设置返回的数据类型
call.setReturnType(XMLType.XSD_STRING);
// 设置参数
call.addParameter(new QName("http://tempuri.org/", "authkey"), XMLType.XSD_STRING, ParameterMode.IN);
call.addParameter(new QName("http://tempuri.org/", "Request_Xml"), XMLType.XSD_STRING, ParameterMode.IN);
// 执行调用
String responseXml = (String) call.invoke(new Object[]{AUTH_KEY, requestXml});
// 解析
log.info("HisWebService-{}接口请求成功,响应参数为:{}", desc, responseXml);
return JSONUtil.xmlToJson(responseXml).getJSONObject("Response").toBean(rClass);
}
}
出入参按照接口要求来传,代码仅供参考。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于