文章目录
WebService 简介
概述
能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件,就可相互交换数据或集成。依据
WebService
规范实施的应用之间,无论它们所使用的语言、平台或内部协议是什么,都可以相互交换数据。
也就是说可以实现多语言、跨平台数据交互。
使用 axis 调用 WebService
引入依赖
pom.xml
依赖如下:
<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>axis</groupId><artifactId>axis-wsdl4j</artifactId><version>1.5.1</version></dependency><dependency><groupId>commons-discovery</groupId><artifactId>commons-discovery</artifactId><version>0.2</version></dependency>
WebService 调用工具类
packagecom.micromaple.common.utils;importcom.google.common.collect.Lists;importlombok.extern.slf4j.Slf4j;importorg.apache.axis.client.Call;importorg.apache.axis.client.Service;importorg.apache.axis.encoding.XMLType;importorg.apache.axis.encoding.ser.BeanDeserializerFactory;importorg.apache.axis.encoding.ser.BeanSerializerFactory;importorg.apache.axis.message.SOAPHeaderElement;importorg.apache.axis.types.Schema;importorg.apache.commons.collections.MapUtils;importjavax.xml.namespace.QName;importjavax.xml.rpc.ParameterMode;importjava.util.List;importjava.util.Map;importjava.util.Set;/**
* WebService - 工具类
* Title: WebServiceUtils
* Description:
*
* @author Micromaple
* @version 1.0.0
* @date 2022/7/1 12:14
*/@Slf4jpublicclassWebServiceUtils{/**
* WebService - 调用接口
*
* @param methodName 函数名
* @param params 参数
* @param clazz 返回对象class
* @return 返回结果(Object)
*/publicstatic<T>Tcall(String methodName,Map<String,String> params,Class<T> clazz){// log.info("调用 WebService 发送参数==>" + MapperUtils.mapToJson(params));String url ="http://127.0.0.1:8080/webservice.asmx";String namespace ="http://tempuri.org/";String soapActionURI = namespace + methodName;try{Service service =newService();SOAPHeaderElement header =newSOAPHeaderElement(namespace, methodName);
header.setNamespaceURI(namespace);Call call =(Call) service.createCall();
call.setTargetEndpointAddress(url);
call.setOperationName(newQName(namespace, methodName));// 添加参数List<String> parameterList =Lists.newArrayList();if(params !=null){Set<String> paramsKey = params.keySet();for(String key : paramsKey){
call.addParameter(newQName(namespace, key),XMLType.XSD_STRING,ParameterMode.IN);String pValue =MapUtils.getString(params, key);
header.addChildElement(key).setValue(pValue);
parameterList.add(pValue);}}
call.setUseSOAPAction(true);
call.setSOAPActionURI(soapActionURI);
call.addHeader(header);//进行序列化 实体类也要序列化 implements Serializable
call.registerTypeMapping(clazz,newQName(namespace, soapActionURI),newBeanSerializerFactory(clazz,newQName(namespace, soapActionURI)),newBeanDeserializerFactory(clazz,newQName(namespace, soapActionURI)));//设置输出的类
call.setReturnClass(clazz);// 接口返回结果T result =(T) call.invoke(parameterList.toArray());
log.info("调用 WebService 接口返回===>"+ result);return result;}catch(Exception e){
log.error("调用 WebService 接口错误信息==>"+ e.getMessage());}returnnull;}/**
* WebService - 接口调用
*
* @param methodName 函数名
* @param params 参数
* @return 返回结果(String)
*/publicstaticStringcall(String methodName,Map<String,String> params){// log.info("调用 WebService 发送参数==>" + MapperUtils.mapToJson(params));String url ="http://127.0.0.1:8080/webservice.asmx";String namespace ="http://tempuri.org/";String soapActionURI = namespace + methodName;try{Service service =newService();SOAPHeaderElement header =newSOAPHeaderElement(namespace, methodName);
header.setNamespaceURI(namespace);Call call =(Call) service.createCall();
call.setTargetEndpointAddress(url);
call.setOperationName(newQName(namespace, methodName));// 添加参数List<String> parameterList =Lists.newArrayList();if(params !=null){Set<String> paramsKey = params.keySet();for(String key : paramsKey){
call.addParameter(newQName(namespace, key),XMLType.XSD_STRING,ParameterMode.IN);String pValue =MapUtils.getString(params, key);
header.addChildElement(key).setValue(pValue);
parameterList.add(pValue);}}
call.setUseSOAPAction(true);
call.setSOAPActionURI(soapActionURI);
call.addHeader(header);// 设置返回类型
call.setReturnType(newQName(namespace, methodName),String.class);// 接口返回结果String result =(String) call.invoke(parameterList.toArray());
log.info("调用 WebService 接口返回===>"+ result);return result;}catch(Exception e){
log.error("调用 WebService 接口错误信息==>"+ e.getMessage());}returnnull;}/**
* WebService - 调用接口
*
* @param methodName 函数名
* @param params 参数
* @return 返回结果(String)
*/publicstaticStringcall2(String methodName,Map<String,String> params){// log.info("调用 WebService 发送参数==>" + MapperUtils.mapToJson(params));String url ="http://127.0.0.1:8080/webservice.asmx";String namespace ="http://tempuri.org/";String soapActionURI = namespace + methodName;try{Service service =newService();SOAPHeaderElement header =newSOAPHeaderElement(namespace, methodName);
header.setNamespaceURI(namespace);Call call =(Call) service.createCall();
call.setTargetEndpointAddress(url);
call.setOperationName(newQName(namespace, methodName));// 添加参数List<String> parameterList =Lists.newArrayList();if(params !=null){Set<String> paramsKey = params.keySet();for(String key : paramsKey){
call.addParameter(newQName(namespace, key),XMLType.XSD_STRING,ParameterMode.IN);String pValue =MapUtils.getString(params, key);
header.addChildElement(key).setValue(pValue);
parameterList.add(pValue);}}
call.setUseSOAPAction(true);
call.setSOAPActionURI(soapActionURI);
call.addHeader(header);// 设置返回类型
call.setReturnType(XMLType.XSD_SCHEMA);// 接口返回结果Schema schemaResult =(Schema)call.invoke(parameterList.toArray());String result ="";for(int i =0; i<schemaResult.get_any().length; i++){
result = result + schemaResult.get_any()[i];}
log.error("调用 WebService 接口返回===>"+ result);return result;}catch(Exception e){
log.error("调用 WebService 接口错误信息==>"+ e.getMessage());}returnnull;}}
- 第一个方法为返回对象的方式,区别在于需要定义返回对象,属性值需要跟
WebService
中的返回对象保持一致。 - 第二个方法适用于调用
WebService
后,返回的值为String
类型。
参数详解:
methodName
:函数名。需要调用的
WebService
的函数名称。
params
:参数。调用
WebService
时需传入的参数。
版权归原作者 micromaple 所有, 如有侵权,请联系我们删除。