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 += " \r\n"; sParameters += "\r\n";"+param1+" \r\n"; sParameters += ""+usr+" \r\n"; sParameters += ""+pwd+" \r\n"; sParameters += "
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