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(); }*//* } }*/ } } }
Webservice WSDL接口封装
最新推荐文章于 2024-04-20 18:36:27 发布