文章目录

    • WebService 简介
      • 概述
    • 使用 axis 调用 WebService
      • 引入依赖
      • WebService 调用工具类

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 调用工具类

package com.micromaple.common.utils;import com.google.common.collect.Lists;import lombok.extern.slf4j.Slf4j;import org.apache.axis.client.Call;import org.apache.axis.client.Service;import org.apache.axis.encoding.XMLType;import org.apache.axis.encoding.ser.BeanDeserializerFactory;import org.apache.axis.encoding.ser.BeanSerializerFactory;import org.apache.axis.message.SOAPHeaderElement;import org.apache.axis.types.Schema;import org.apache.commons.collections.MapUtils;import javax.xml.namespace.QName;import javax.xml.rpc.ParameterMode;import java.util.List;import java.util.Map;import java.util.Set;/** * WebService - 工具类 * Title: WebServiceUtils * Description: * * @author Micromaple * @version 1.0.0 * @date 2022/7/1 12:14 */@Slf4jpublic class WebServiceUtils {// 接口调用地址private static String url = "http://127.0.0.1:8080/webservice.asmx";// 命名空间private static String namespace = "http://tempuri.org/";/** * WebService - 调用接口 * * @param methodName 函数名 * @param params 参数 * @param clazz返回对象class * @return 返回结果(Object) */public static <T> T call(String methodName, Map<String, String> params, Class<T> clazz) {// log.info("调用 WebService 发送参数==>" + MapperUtils.mapToJson(params));String soapActionURI = namespace + methodName;try {Service service = new Service();SOAPHeaderElement header = new SOAPHeaderElement(namespace, methodName);header.setNamespaceURI(namespace);Call call = (Call) service.createCall();call.setTargetEndpointAddress(url);call.setOperationName(new QName(namespace, methodName));// 添加参数List<String> parameterList = Lists.newArrayList();if (params != null) {Set<String> paramsKey = params.keySet();for (String key : paramsKey) {call.addParameter(new QName(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 Serializablecall.registerTypeMapping(clazz, new QName(namespace, soapActionURI),new BeanSerializerFactory(clazz, new QName(namespace, soapActionURI)),new BeanDeserializerFactory(clazz, new QName(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());}return null;}/** * WebService - 接口调用 * * @param methodName 函数名 * @param params 参数 * @return 返回结果(String) */public static String call(String methodName, Map<String, String> params) {// log.info("调用 WebService 发送参数==>" + MapperUtils.mapToJson(params));String soapActionURI = namespace + methodName;try {Service service = new Service();SOAPHeaderElement header = new SOAPHeaderElement(namespace, methodName);header.setNamespaceURI(namespace);Call call = (Call) service.createCall();call.setTargetEndpointAddress(url);call.setOperationName(new QName(namespace, methodName));// 添加参数List<String> parameterList = Lists.newArrayList();if (params != null) {Set<String> paramsKey = params.keySet();for (String key : paramsKey) {call.addParameter(new QName(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(new QName(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());}return null;}/** * WebService - 调用接口 * * @param methodName 函数名 * @param params 参数 * @return 返回结果(String) */public static String call2(String methodName, Map<String, String> params) {// log.info("调用 WebService 发送参数==>" + MapperUtils.mapToJson(params));String soapActionURI = namespace + methodName;try {Service service = new Service();SOAPHeaderElement header = new SOAPHeaderElement(namespace, methodName);header.setNamespaceURI(namespace);Call call = (Call) service.createCall();call.setTargetEndpointAddress(url);call.setOperationName(new QName(namespace, methodName));// 添加参数List<String> parameterList = Lists.newArrayList();if (params != null) {Set<String> paramsKey = params.keySet();for (String key : paramsKey) {call.addParameter(new QName(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());}return null;}}
  • 第一个方法为返回对象的方式,区别在于需要定义返回对象,属性值需要跟 WebService 中的返回对象保持一致。
  • 第二个方法适用于调用 WebService后,返回的值为 String 类型。

参数详解:

methodName:函数名。需要调用的 WebService 的函数名称。

params:参数。调用 WebService 时需传入的参数。