Webservice WSDL接口封装

package com.tscloud.common.utils;

import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.DeserializerFactory;
import org.apache.axis.encoding.ser.SimpleDeserializer;
import org.apache.axis.wsdl.gen.Parser;
import org.apache.axis.wsdl.symbolTable.*;
import org.apache.axis.wsdl.toJava.Utils;
import sun.reflect.generics.tree.BaseType;

import javax.wsdl.Binding;
import javax.wsdl.Operation;
import javax.wsdl.Port;
import javax.xml.namespace.QName;
import javax.xml.rpc.encoding.Deserializer;
import java.util.*;

/**
 * @Description webservice解析wsdl
 * @Author fc.huang
 * @Date 2021/9/2 19:55 星期四
 */
public class WebServiceWsdl {
    private Parser wsdlParser = null;

    private Map<String, SymTabEntry> services = null;

    public WebServiceWsdl(String wsdlURL) {
        this.wsdlParser = new Parser();
        try {
            this.wsdlParser.run(wsdlURL);
      } catch (Exception e) {
            e.printStackTrace();
      }
        this.services = enumSymTabEntry(ServiceEntry.class);
  }

    /**
     * @param serviceName     服务名称
     * @param portName        服务类
     * @param operationName   方法
     * @param parameterValues 参数
     * @return
     * @throws Exception
     */
    public Map<String, Object> invoke(String serviceName, String portName, String operationName, Vector<?> parameterValues) throws Exception {
        Vector<Object> inputs = new Vector();
        String returnName = null;
        ServiceEntry serviceEntry = (ServiceEntry) this.services.get(serviceName);
        javax.wsdl.Service service = serviceEntry.getService();
        Service clientService = new Service(this.wsdlParser,
                service.getQName());
        Call call = (Call) clientService.createCall(QName.valueOf(portName), QName.valueOf(operationName));
        call.setTimeout(new Integer(15000));
        BindingEntry bindingEntry = getBindingEntry(serviceName, portName);
        Operation o = getOperation(bindingEntry, operationName);
        Parameters parameters = bindingEntry.getParameters(o);
        if (parameters.returnParam != null) {
            QName returnQName = parameters.returnParam.getQName();
            returnName = returnQName.getLocalPart();
      }
        int size = parameters.list.size();
        for (int i = 0; i < size; i++) {
            Parameter p = (Parameter) parameters.list.get(i);
            switch (p.getMode()) {
                case 1:
                    inputs.add(getParamData(call, p, (String) parameterValues.elementAt(i)));
                    break;
                case 3:
                    inputs.add(getParamData(call, p, (String) parameterValues.elementAt(i)));
                    break;
          }
      }
        Object ret = call.invoke(inputs.toArray());
        Map<?, ?> outputs = call.getOutputParams();
        HashMap<String, Object> map = new HashMap<>();
        map.put("RESULT", ret);
        if (ret != null && returnName != null) {
            map.put(returnName, ret);
      }
        if (outputs != null) {
            for (Iterator<?> iterator = outputs.keySet().iterator(); iterator.hasNext(); ) {
                String name;
                Object obj = iterator.next();
                if (obj.getClass().getName().equals("java.lang.String")) {
                    name = (String) obj;
              } else {
                    name = ((QName) obj).getLocalPart();
              }
                Object value = outputs.get(obj);
                map.put(name, value);
          }
      }
        return map;
  }

    /**
     * 获取所有服务名称
     *
     * @return
     */
    public Vector<String> enumServiceNames() {
        Vector<String> v = new Vector<>();
        Iterator<String> i = this.services.keySet().iterator();
        while (i.hasNext()) {
            String s = i.next();
            v.addElement(s);
      }
        return v;
  }

    /**
     * 获取服务信息
     *
     * @param serviceName
     * @return
     */
    public SymTabEntry getServiceInfo(String serviceName) {
        return this.services.get(serviceName);
  }

    /**
     * 获取服务类
     *
     * @param serviceName
     * @return
     */
    public Vector<String> enumPortNames(String serviceName) {
        Vector<String> v = new Vector<>();
        ServiceEntry serviceEntry = (ServiceEntry) this.services.get(serviceName);
        Map<?, ?> ports = serviceEntry.getService().getPorts();
        Iterator<?> i = ports.keySet().iterator();
        while (i.hasNext()) {
            String s = (String) i.next();
            v.addElement(s);
      }
        return v;
  }

    /**
     * 获取方法
     *
     * @param serviceName
     * @param portName
     * @return
     */
    public Vector<String> enumOperationNames(String serviceName, String portName) {
        Vector<String> v = new Vector<>();
        BindingEntry entry = getBindingEntry(serviceName, portName);
        Set<?> operations = entry.getOperations();
        Iterator<?> i = operations.iterator();
        while (i.hasNext()) {
            Operation o = (Operation) i.next();
            String s = o.getName();
            v.addElement(s);
      }
        return v;
  }

    /**
     * 获取参数
     *
     * @param serviceName
     * @param portName
     * @param operationName
     * @return
     */
    public Parameters enumParameters(String serviceName, String portName, String operationName) {
        BindingEntry entry = getBindingEntry(serviceName, portName);
        Operation o = getOperation(entry, operationName);
        Parameters parameters = entry.getParameters(o);
        return parameters;
  }

    /**
     * 获取参数类型
     *
     * @param p
     * @return
     */
    public String getParameterModeString(Parameter p) {
        String ret = null;
        switch (p.getMode()) {
            case 1:
                ret = "[IN]";
                break;
            case 3:
                ret = "[IN, OUT]";
                break;
            case 2:
                ret = "[OUT]";
                break;
      }
        return ret;
  }

    private BindingEntry getBindingEntry(String serviceName, String portName) {
        ServiceEntry serviceEntry = (ServiceEntry) this.services.get(serviceName);
        Port port = serviceEntry.getService().getPort(portName);
        Binding binding = port.getBinding();
        SymbolTable table = this.wsdlParser.getSymbolTable();
        return table.getBindingEntry(binding.getQName());
  }

    private Operation getOperation(BindingEntry entry, String operationName) {
        Set<?> operations = entry.getOperations();
        Iterator<?> i = operations.iterator();
        while (i.hasNext()) {
            Operation o = (Operation) i.next();
            if (operationName.equals(o.getName())) {
                return o;
          }
      }
        return null;
  }

    private Map<String, SymTabEntry> enumSymTabEntry(Class<ServiceEntry> cls) {
        HashMap<String, SymTabEntry> ret = new HashMap<>();
        HashMap<?, ?> map = this.wsdlParser.getSymbolTable().getHashMap();
        Iterator<?> iterator = map.entrySet().iterator();
        while (iterator.hasNext()) {
            Map.Entry entry = (Map.Entry) iterator.next();
            QName key = (QName) entry.getKey();
            Vector<?> v = (Vector) entry.getValue();
            int size = v.size();
            for (int i = 0; i < size; i++) {
                SymTabEntry symTabEntry = (SymTabEntry) v.elementAt(i);
                if (cls.isInstance(symTabEntry)) {
                    ret.put(key.getLocalPart(), symTabEntry);
              }
          }
      }
        return ret;
  }

    private Object getParamData(Call c, Parameter p, String arg) throws Exception {
        QName paramType = Utils.getXSIType(p);
        TypeEntry type = p.getType();
        if (type instanceof BaseType && type.isBaseType()) {
            DeserializerFactory factory = (DeserializerFactory) c.getTypeMapping().getDeserializer(paramType);
            Deserializer deserializer = factory.getDeserializerAs("Axis SAX Mechanism");
            if (deserializer instanceof SimpleDeserializer) {
                return ((SimpleDeserializer) deserializer).makeValue(arg);
          }
      }
        throw new RuntimeException("not know how to convert '" + arg + "' into " + c);
  }

    public static void main(String[] args) {
        WebServiceWsdl dynamicInvoker = new WebServiceWsdl("http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl");

        Vector<String> vector = dynamicInvoker.enumServiceNames();
        for (String serviceName : vector) {
            System.out.println("服务名称:" + serviceName);
            SymTabEntry symTabEntry = dynamicInvoker.getServiceInfo(serviceName);
            System.out.println(symTabEntry.getQName().getNamespaceURI());
           /* Vector<String> portNames = dynamicInvoker.enumPortNames(serviceName);
            for (String portname : portNames) {
                System.out.println("类型:" + portname);
                Vector<String> operationNames = dynamicInvoker.enumOperationNames(serviceName, portname);

                for (String operationName : operationNames) {
                    System.out.println("方法名:" + operationName);
                    Parameters parameters = dynamicInvoker.enumParameters(serviceName, portname, operationName);
                    Vector<Object> parameterValues = new Vector<>();

                    if (parameters == null || parameters.list == null) {
                  } else {

                        for (Object parameter : parameters.list) {
                            Parameter parameter1 = (Parameter) parameter;
                            String mode = dynamicInvoker.getParameterModeString((Parameter) parameter);
                            System.out.println("入参:" + mode + ",参数名称:" + parameter1.getName() + ",参数类型:" + parameter1.getType().getQName().getLocalPart());
                      }

                        if (!parameters.list.isEmpty()) {
                            parameterValues.addElement("15330056406");
                            parameterValues.addElement("");
                      }
                  }
               *//*     try {

                        Map<String, Object> relutInvoke = dynamicInvoker.invoke(serviceName, portname, operationName, parameterValues);
                        for (Map.Entry entry : relutInvoke.entrySet()) {
                            System.out.println(String.format("key:%s,value:%s", entry.getKey(), entry.getValue()));
                      }
                  } catch (Exception e) {
                        e.printStackTrace();
                  }*//*
              }
          }*/
      }
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WebService接口的书是指介绍和讲解WebService接口相关技术原理、实践应用和开发实例的书籍。WebService是一种基于互联网的通信协议,通过该协议可以实现不同平台之间的数据交换和通信。它使用了标准的XML格式进行数据传输,并且支持使用HTTP、SMTP、FTP等常用的协议进行通信。 这本书可能会从不同的角度去介绍WebService接口的相关知识和技术。它可能会讲解WebService接口的基本原理,包括SOAP(Simple Object Access Protocol)和WSDL(Web Services Description Language)的概念和使用方法。SOAP是WebService接口中的通信协议,它规定了数据的封装和传输方式,而WSDL则是用于描述WebService接口语言,它定义了接口的输入参数、输出结果以及调用方式等信息。 此外,这本书也可能会涉及WebService接口开发实践,包括如何使用不同的开发工具和编程语言(如Java、C#等)来创建WebService接口,以及如何使用各种开发框架和库来简化接口开发和维护过程。 除了基本的原理和实践,这本书可能还会介绍WebService接口在各种场景下的应用,例如在企业应用中如何使用WebService接口实现系统间的数据交换和集成,如何利用WebService接口提供服务化的业务功能,以及如何使用WebService接口搭建跨平台的分布式系统等。 综上所述,WebService接口的书是帮助读者深入了解和掌握WebService接口相关技术和应用的一本专业书籍,它可以帮助读者在实际项目中灵活运用WebService接口,提高系统的互操作性和扩展性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值