我是网络服务的新手。我的要求是一个 WSDL 链接
- 我想动态查找所有支持的操作(WSDL 发布的方法)
- 迭代列出的不同操作
- 动态获取每个操作的参数列表和返回值
- 获取到Operation Name、Param的详细信息后动态消费一个Service并返回
我能够编写一个动态客户端应用程序(Axis 2,WSDL4J),它将使用 WSDL 并给出方法名称、为方法定义的参数、数据类型等。我创建了一个应用程序,它采用 WSDL 并给我WSDL 中存在的所有方法。
Definition def = reader.readWSDL(null, wsdlURI);
Map services = def.getServices();
// Services when Iterated will give all the Method Names
// .......
Operation operation = boperation.getOperation();
String OperationName = operation.getName();
System.out.println("OperationName :" + OperationName.toString());
除此之外,我不确定如何动态获取给定方法的参数名称。非常感谢任何示例代码/教程
附上客户端的完整代码。
public class DynamicInvoke {
public static void main(String[] args) throws WSDLException {
String wsdlURI = "WORKING_WSDL_LINK";
DynamicInvoke di = new DynamicInvoke();
List wsdlList = new ArrayList();
wsdlList = di.buildComponents(wsdlURI);
}
public List buildComponents(String wsdlURI) throws WSDLException {
// The list of components that will be returned
List serviceList = Collections.synchronizedList(new ArrayList());
// Create the WSDL Reader object
WSDLFactory factory = WSDLFactory.newInstance();
WSDLReader reader = factory.newWSDLReader();
try {
// Read the WSDL and get the top-level Definition object
Definition def = reader.readWSDL(null, wsdlURI);
java.util.Map<QName, Service> services = null;
// Get the services defined in the document
try {
services = def.getServices();
} catch (Exception e) {
System.out.println("Cast Exception " + e.getMessage());
}
if (services != null) {
// Create a component for each service defined
Iterator serviceIter = (services).values().iterator();
for (int i = 0; serviceIter.hasNext(); i++) {
// Create a new ServiceInfo component for each service found
ServiceInfo serviceInfo = new ServiceInfo();
// Populate the new component from the WSDL Definition read
populateComponent(serviceInfo, (Service) serviceIter.next());
// Add the new component to the List to be returned
serviceList.add(serviceInfo);
}
}
}
catch (Throwable t) {
// Process the error/exception
System.err.println(t.getMessage());
}
// return the List of services we created
return serviceList;
}
private ServiceInfo populateComponent(ServiceInfo component, Service service)
throws WSDLException {
// Get the qualified service name information
QName qName = service.getQName();
// Get the service's namespace URI
String namespace = qName.getNamespaceURI();
// Use the local part of the qualified name for the component's name
String name = qName.getLocalPart();
// Get the defined ports for this service
Map ports = service.getPorts();
// Use the Ports to create methods for all request/response messages
// defined
Iterator portIter = ports.values().iterator();
while (portIter.hasNext()) {
// Get the next defined port
Port port = (Port) portIter.next();
// Get the Port's Binding
javax.wsdl.Binding binding = port.getBinding();
// Now we will create operations from the Binding information
List operations = buildOperations(binding);
// Process methods built from the binding information
Iterator operIter = operations.iterator();
while (operIter.hasNext()) {
BindingOperation boperation = (BindingOperation) operIter.next();
Operation operation = boperation.getOperation();
// Get all the QName,Port Name,Name Space, WebService Name...
System.out.println("Port Name =" + port.getName());
System.out.println("QName = " + qName.toString());
System.out.println("Namespace = " + namespace.toString());
System.out.println("WebService Name = " + name.toString());
// Get All the Method Name...
String OperationName = operation.getName();
System.out.println("OperationName :" + OperationName.toString());
Input inDef = operation.getInput();
String ParamName = inDef.getName();
System.out.println("inDef--->" + ParamName);
Message inMessage = inDef.getMessage();
Map parts = inMessage.getParts();
System.out.print("\nAxis parameters gathered:\nTargetNamespace = " +"\n"+
"Service Name = "+namespace.toString() +"\n"+
"Port Name = "+port.getName() +"\n"+
"Operation Name = "+operation.getName()+"\n"+
"Input Parameters = ");
}
}
return component;
}
private List buildOperations(Binding binding) {
// TODO Auto-generated method stub
List list = binding.getBindingOperations();
System.out.println("Bindings :" + list);
return list;
}
}