miércoles, 7 de enero de 2015

Trasformar un WebService REST en uno SOAP

Hace poco en un cliente me pidieron leer un WebService de tipo REST desde PeopleNet.

Sin saber demasiado de que iba todo este mundo pregunté en Soporte y me indicaron que PeopleNet trabaja como consumidor de WebServices SOAP pero no REST, aunque si lo puede ser proveedor de ambos tipos.

Primera pregunta ¿Qué diferencias hay entre REST y SOAP?... encontré este artículo que explica de forma sencilla las diferencias más importantes: "REST vs SOAP al servicio de la web". Ahora el problema residía en cómo iba a conseguir leer desde PeopleNet ese tipo de WebService.

Lo primero que quiero que quede claro es que no soy ningún experto en Java y que buscando cosas por internet conseguí que el WebService que me proveían (REST) lo pudiera invocar desde PeopleNet. Seguro que existen mil problemas en hacerlo como muestro y no sé si servirá para todos. (Lo expertos en Java sabrán perdonarme [Espero])

Lo que hice fue crear, con Netbeans, un WebService SOAP al que yo le pasaba una serie de parámetros y éste invocara al WebService REST. Lo que hago, basicamente, es componer una llamada XML y lanzarla a la URL que me indicaban.

La clase completa está aquí; NewRequest.java

Ahora intento explicar el código

1ª Parte: definición del WebService
@WebMethod(operationName = "GetData") 
    public String GetData(@WebParam(name = "param1") String param1, @WebParam(name = "usr") String usr,@WebParam(name = "pwd") String pwd) { 

Esta parte simplemente prepara el encabezado del WebService o cómo invocarlo.

2ª Parte: composición de llamada XML
sParameters = "\r\n"; 
sParameters += "\r\n"; 
sParameters += "\r\n"; 
sParameters += ""+param1+"\r\n";
sParameters += ""+usr+"\r\n"; 
sParameters += ""+pwd+"\r\n"; 
sParameters += "\r\n"; 
sParameters += "\r\n"; 

Esta parte deja en una variable sParameters la solicitud al WebService REST, donde me exigen un código de una persona, un usuario y una contraseña.


3ª Parte: envío de la solicitud

URL uri = new URL("http://www.dominio.com/services/Dataservices.php"); 
HttpURLConnection connection  = (HttpURLConnection) uri.openConnection(); 
connection.setDoInput(true); 
connection.setDoOutput(true); 
connection.setRequestMethod("POST"); 
connection.setRequestProperty("Content-type", "text/xml"); 
            
OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream()); 
writer.write(sParameters); 
writer.flush(); 

Esta parte enlaza una llamada POST a la URL que me habían proporcionado a través de un objeto OutputStreamWriter (writer) sobre una HttpURLConnection

4ª Parte: recepción de la información del WebService REST y retorno del WebService SOAP
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); 
            
StringBuilder builder = new StringBuilder(); 
for (String line = null; (line = reader.readLine()) != null;) { 
     builder.append(line).append("\n"); 
}
            
writer.close(); 
reader.close(); 
            
return( builder.toString()); 

Esta parte genera un String que posteriormente retorno para mi código LN4 (Regla de un método meta4)

Una vez compilado y subido como war a un Tomcat por ejemplo, podremos generar el WSDL que PeopleNet necesita.

¿Simple? Sí, puede ser...
¿Efectivo? Para mi problema sí
¿Mejorable? Sí, supongo que mucho


Espero que a alguno os pueda servir
Hasta la próxima y perdón por no escribir tanto como me gustaría.

PD. Feliz 2015 a todos