I am newbie to web service. My requirement is given a WSDL link
- I want to dynamically find all the operations supported (Methods published by WSDL)
- Iterate though the different operations listed
- Dynamically get the list of Parameters and return values for each of these operations
- Consume a Service dynamically after getting the details of Operation Name, Param and return
I'm able to write a Dynamic client application ( Axis 2 , WSDL4J) which will consume the WSDL and gave the method Name, parameters defined for the method, data type etc. I have created an application which is taking the WSDL and giving me all the methods which is present in the 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());
Beyond this I’m not sure how to dynamically get the parameters name for the given method. Any sample codes / tutorials is greatly appreciated
The Complete Code for the client is attached.
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;
}
}
You need to compile your stub code from the given WSDL with the wsdl2java-tool (it's packaged with the axis2-zip). Then you'll find your web service-related classes including all methods, parameteres ready for you.
For an example, see Step 5 here