Apache Axis2, el cual ya esta siendo dejado de lado por su complejidad y el surgimiento de otros web services stack como Metro y Apache CXF con mayor performance, brinda a los usuarios variadas opciones de data bindings.

Este artículo muestra como llamar a un Web Service utilizando Axis Object Model. Esta técnica es de "bajo nivel", parecida a la API de JAX-WS Provider/Dispatcher. Utilizar AXIOM es mejor que trabajar con XML DOM elements pero ciertamente más complejo que hacerlo con ADB o JAXB.

Primero los imports de las classes utilizadas

import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.client.ServiceClient;

 

Y ahora el código para el llamado al WS

OMFactory factory = OMAbstractFactory.getOMFactory();
OMNamespace omNs = fac.createOMNamespace("yournamespace", "someprefix");
OMElement method = fac.createOMElement("theActionName", omNs);

OMElement param1 = fac.createOMElement("someParam", omNs);
param1.setText("someValue");
method.addChild(param1);

String url = "http://server/webserviceURL";
ServiceClient client = new ServiceClient();
Options opts = new Options();
// es super importante, el timeout siempre lo define 
// el cliente, hay que tener en cuenta que si la operación
// es larga es importante darle un buen timeout en ms
opts.setTimeOutInMilliSeconds(300000);
opts.setTo(new EndpointReference(url));
opts.setAction("theActionName");
client.setOptions(opts);
OMElement res = client.sendReceive(method);

// finalmente la respuesta que es nada mas
// y nada menos que un XML
System.out.println(res);

 

La implementacion de AXIOM no es sencilla pero es lo más versátil en cuanto a customización de un request a un WebService.