Foros del Web » Programación para mayores de 30 ;) » Java »

[SOLUCIONADO] Web Service XML

Estas en el tema de Web Service XML en el foro de Java en Foros del Web. Amigos necesito ayuda con este tema : invoco un web service : @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código Java: Ver original wss. ConsultaNombreDir_Service service = new wss. ConsultaNombreDir_Service ...
  #1 (permalink)  
Antiguo 16/09/2016, 18:34
 
Fecha de Ingreso: noviembre-2013
Mensajes: 147
Antigüedad: 10 años, 4 meses
Puntos: 1
Web Service XML

Amigos necesito ayuda con este tema :

invoco un web service :

Código Java:
Ver original
  1. wss.ConsultaNombreDir_Service service = new wss.ConsultaNombreDir_Service();
  2.     wss.ConsultaNombreDir port = service.getConsultaNombreDirPort();
  3.     java.lang.String result = port.consultaNombreDirector(idDir);
  4.     out.println("Result = "+result);
  5.     } catch (Exception ex) {
  6.     // TODO handle custom exceptions here
  7.     }

Pero debo recorrer un XML, pero ya tengo los ojos rojos de leer y ver videos tutoriales y no se como recuperar el archivo XML la variable "result", contiene esto :

result = (java.lang.String)<?xml version="1.0" encoding="ISO-8859-1" ?><Modulos></Modulos>

Pero el XML que deberia recibir es :


Código XML:
Ver original
  1. <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
  2.    <S:Body>
  3.       <ns0:menuUsuarioAplicacionResponse xmlns:ns0="http://services.web.seguridad.ciax.com/">
  4.          <return>&lt;?xml version="1.0" encoding="ISO-8859-1" ?>&lt;Modulos codigoPerfil="EXT_PROVEE" nombrePerfil="ANALISTA EXTERNO" codigoPais="CO" FechaUltimoIngreso="08/09/2016">&lt;Transaccion label="DATOS PROVEEDOR" idTarea="1271" breadcrumb="/DATOS PROVEEDOR" transaccion="/faces/pages/ficha/datosproveedor.xhtml?icono=/images/datproveedor.png&amp;amp;codigoLocalidad=8220" actualiza="N" adiciona="N" consulta="N" ejecuta="N" elimina="N" imprime="N" clasificacion="PENDIENTE" criticidad="PENDIENTE" />&lt;/Modulos></return>
  5.       </ns0:menuUsuarioAplicacionResponse>
  6.    </S:Body>
  7. </S:Envelope>

Como puedo obtenerlo?...cuando ejecuto un test en SOAPUI...me genera el XML, como lo hago a travez de mi aplicacion?

Trabajo en Web con netbeans

Gracias por sus aportes
  #2 (permalink)  
Antiguo 19/09/2016, 11:11
 
Fecha de Ingreso: enero-2009
Ubicación: Kandor
Mensajes: 209
Antigüedad: 15 años, 1 mes
Puntos: 11
Respuesta: Web Service XML

En eclipse
Crear un proyecto java normal y luego clic derecho al proyecto->new Web Service client->
Pegar url o ruta de archivo wsdl y bajar la barra a Develop Client
Darle siguiente a todo. Eclipse genera unas clases.
La clase que hay que instanciar siempre es la que contiene Proxy en el nombre
En un WebService soap no hay que desarmar XMLs a menos que el método a invocar lo devuelva
  #3 (permalink)  
Antiguo 19/09/2016, 13:34
 
Fecha de Ingreso: noviembre-2013
Mensajes: 147
Antigüedad: 10 años, 4 meses
Puntos: 1
Respuesta: Web Service XML

gracias abrahamhs, por tu respuesta, pero eso ya lo tengo hecho, lo que quiero saber es como recorro el XML resultante que queda dentro de la variable "result"
  #4 (permalink)  
Antiguo 19/09/2016, 14:56
 
Fecha de Ingreso: noviembre-2013
Mensajes: 147
Antigüedad: 10 años, 4 meses
Puntos: 1
Respuesta: Web Service XML

De todo lo que he leido...siempre hacen referencia al "ARCHIVO.XML", pero a mi me llega como respuesta del web service.....no tengo el nombre del archivo...

No se si debo guardarlo de alguna manera en el equipo....

Vamos...echenme una manito....
  #5 (permalink)  
Antiguo 19/09/2016, 16:24
 
Fecha de Ingreso: enero-2009
Ubicación: Kandor
Mensajes: 209
Antigüedad: 15 años, 1 mes
Puntos: 11
Respuesta: Web Service XML

Es que ese es el problema, el protocolo SOAP establece que el mensaje de comunicación lleva formato XML. Internamente este XML puede llevar dentro otro XML que representaría la respuesta del método a invocar. El 1er XML no es necesario tocarlo o modificarlo ya que las APIs de cualquier lenguaje de programación hacen eso internamente. Tu estas tratando de modificar ese XML(el 1ro, el del protocolo SOAP) y esa es la razón por la que se te ha complicado tanto. No tienes que parsear ese XML, y lo sé por los tags que tiene el XML que pusiste, esos son de SOAP y no es una respuesta del método que invocas. Es por eso que te puse como desarrollarlo en mi respuesta anterior. Mira esto: http://www.imagineanddo.com/2011/10/...ir-un-web.html

Última edición por abrahamhs; 19/09/2016 a las 16:34
  #6 (permalink)  
Antiguo 19/09/2016, 17:17
 
Fecha de Ingreso: noviembre-2013
Mensajes: 147
Antigüedad: 10 años, 4 meses
Puntos: 1
Respuesta: Web Service XML

Si...es lo mismo con los demas textos que he leido, no explican como accedo a cada nodo....en este caso simplemente traen la respuesta dentro del servicio, que es lo que haria un ejemplo sencillo, pero si tienes varios nodos por ejemplo :

Código XML:
Ver original
  1. <Transaccion label="null" idTarea="1448" breadcrumb="/" transaccion="Estructuras/Estructuras1.jsp" actualiza="S" adiciona="S" consulta="S" ejecuta="S" elimina="S" imprime="S" clasificacion="USO INTERNO" criticidad="BAJA" />
  2. <Transaccion label="null" idTarea="1448" breadcrumb="/" transaccion="Estructuras/Estructuras2.jsp" actualiza="S" adiciona="S" consulta="S" ejecuta="S" elimina="S" imprime="S" clasificacion="USO INTERNO" criticidad="BAJA" />
  3. <Transaccion label="null" idTarea="1448" breadcrumb="/" transaccion="Estructuras/Estructuras3.jsp" actualiza="S" adiciona="S" consulta="S" ejecuta="S" elimina="S" imprime="S" clasificacion="USO INTERNO" criticidad="BAJA" />

Dentro de algun nodo padre...pues no es tan claro....y en otros ejemplos donde explican como recorrer los nodos por ejemplo con DOM o JDOM, de entrada se debe especificar el nombre del XML, pero eso no lo recibo yo.....
  #7 (permalink)  
Antiguo 19/09/2016, 18:58
 
Fecha de Ingreso: enero-2009
Ubicación: Kandor
Mensajes: 209
Antigüedad: 15 años, 1 mes
Puntos: 11
Respuesta: Web Service XML

Los textos no explican como acceder a nodos de XML porque no lo tienes que hacer. Tu lo estas haciendo mal, no tienes que parsear un XML. Eso es lo que trato de decirte. Todo lo que has hecho esta mal. ¿Así te quedo mas claro?
Una vez que veas que el método te regresa un XML, entonces si tienes que acceder al XML, pero no al de soap sino al que regresa el método y ahi podrias usar XPATH. Ejemplo:
Código Java:
Ver original
  1. String expression = "/Employees/Employee[@emplid='3333']/email";
  2.  
  3. //read a string value
  4. String email = xPath.compile(expression).evaluate(xmlDocument);
  5.  
  6. //read an xml node using xpath
  7. Node node = (Node) xPath.compile(expression).evaluate(xmlDocument, XPathConstants.NODE);
  8.  
  9. //read a nodelist using xpath
  10. NodeList nodeList = (NodeList) xPath.compile(expression).evaluate(xmlDocument, XPathConstants.NODESET);

http://viralpatel.net/blogs/java-xml...ial-parse-xml/

Pero este código de ejemplo de nada sirve, si no invocas correctamente el WS soap, ya que tendrás problemas.
Eclipse genera las clases para leer el mensaje SOAP, no lo tienes que hacer a mano, por eso estas mal. Tu código no lee un soap, parece mas bien que lees un socket o un http.

Y perdón por ser tan directo, pero es que parece que no comprendes.

Saludos
  #8 (permalink)  
Antiguo 20/09/2016, 06:35
 
Fecha de Ingreso: noviembre-2013
Mensajes: 147
Antigüedad: 10 años, 4 meses
Puntos: 1
Respuesta: Web Service XML

abrahamhs, al contrario, gracias por tu tiempo y tus comentarios.

Pero sigo sin comprender que debo hacer. Es decir, cuando invoco el servicio el codigo que inserta en mi jsp es este :

Código Java:
Ver original
  1. try {
  2.     com.cia.seguridad.web.services.WSMenuWebService service = new com.cia.seguridad.web.services.WSMenuWebService();
  3.     com.cia.seguridad.web.services.WSMenuWeb port = service.getWSMenuWebPort();
  4.      // TODO initialize WS operation arguments here
  5.     java.math.BigDecimal documento = null;
  6.     java.math.BigDecimal aplicativo = null;
  7.     java.lang.String pais = "";
  8.     // TODO process result here
  9.     java.lang.String result = port.menuUsuarioAplicacion(documento, aplicativo, pais);
  10.     out.println("Result = "+result);
  11.     } catch (Exception ex) {
  12.     // TODO handle custom exceptions here
  13.     }

Ahora esto mismo en otro servicio web que devuelve un solo dato funciona, y cuando publico la variable "result", presenta el resultado del servicio.

Pero el que recibo ahora es la lista de permisos (pueden ser 1 o varios), no se como extraerlos....con lo que me has explicado he estado leyendo sobre soap...pero aun no logro entender que es lo que debo hacer. O dime que es lo que estoy pasando por alto.

Gracias por tu ayuda.
  #9 (permalink)  
Antiguo 20/09/2016, 12:01
 
Fecha de Ingreso: enero-2009
Ubicación: Kandor
Mensajes: 209
Antigüedad: 15 años, 1 mes
Puntos: 11
Respuesta: Web Service XML

Haber si con esto te queda mas claro. Este es el xml en cuestion:

Código XML:
Ver original
  1. <?xml version="1.0" encoding="ISO-8859-1" ?>
  2. <Modulos codigoPerfil="EXT_PROVEE" nombrePerfil="ANALISTA EXTERNO" codigoPais="CO" FechaUltimoIngreso="08/09/2016">
  3.     <Transaccion label="DATOS PROVEEDOR" idTarea="1271" breadcrumb="/DATOS PROVEEDOR" transaccion="/faces/pages/ficha/datosproveedor.xhtml?icono=/images/datproveedor.png&amp;amp;codigoLocalidad=8220" actualiza="N" adiciona="N" consulta="N" ejecuta="N" elimina="N" imprime="N" clasificacion="PENDIENTE" criticidad="PENDIENTE" />
  4. </Modulos>
Nota que no tiene estos tags <S:Envelope> o <S:Body> ya que esos son de SOAP y ese xml no se debe tocar.
Este código es para parsear tu xml una vez que sea invocado el método del web service correctamente y se ha guardado el resultado en result, por ejemplo:
Código Java:
Ver original
  1. String result="<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?><Modulos codigoPerfil=\"EXT_PROVEE\" nombrePerfil=\"ANALISTA EXTERNO\" codigoPais=\"CO\" FechaUltimoIngreso=\"08/09/2016\"><Transaccion label=\"DATOS PROVEEDOR\" idTarea=\"1271\" breadcrumb=\"/DATOS PROVEEDOR\" transaccion=\"/faces/pages/ficha/datosproveedor.xhtml?icono=/images/datproveedor.png&amp;amp;codigoLocalidad=8220\" actualiza=\"N\" adiciona=\"N\" consulta=\"N\" ejecuta=\"N\" elimina=\"N\" imprime=\"N\" clasificacion=\"PENDIENTE\" criticidad=\"PENDIENTE\" /></Modulos>";
  2.             Document xmlDocument = builder.parse(new ByteArrayInputStream(result.getBytes()));
  3.             XPath xPath =  XPathFactory.newInstance().newXPath();
  4.            
  5.             String expressionCodigoPerfil = "/Modulos/@codigoPerfil";
  6.             String codigoPerfil = xPath.compile(expressionCodigoPerfil).evaluate(xmlDocument);
  7.             System.out.println(codigoPerfil);
  8.            
  9.             String expressionClasificacion = "/Modulos/Transaccion/@clasificacion";
  10.             String clasificacion = xPath.compile(expressionClasificacion).evaluate(xmlDocument);
  11.             System.out.println(clasificacion);
Ahora lo que me has dicho, de que estas en un JSP y tu ultimo código me a aclarado una cosa. Debido a estas lineas out.println(... me parecia que invocabas un SOAP como HTTP. Pero con eso me ha quedado claro que tu invocación ya esta bien. Solo te queda desarmar el xml con el código que acabo de poner. En XPATH los atributos se acceden con "@" como aqui /Modulos/@codigoPerfil
Busca teoria del lenguaje XPATH, para acceder al resto de nodos solo tienes que editar lineas como esta: /Modulos/Transaccion/@clasificacion
  #10 (permalink)  
Antiguo 20/09/2016, 12:10
 
Fecha de Ingreso: enero-2009
Ubicación: Kandor
Mensajes: 209
Antigüedad: 15 años, 1 mes
Puntos: 11
Respuesta: Web Service XML

Una de la mejores APIs para convertir XML en objetos java y viceversa es XSTREAM pero no usa xpath y es mas compleja, pero mucho mas potente. Aquí hay un buen tutorial en su propia pagina http://x-stream.github.io/alias-tutorial.html . Aunque para sacar tu aplicación te recomiendo que sigas con XPATH, XSTREAM es para cuando tengas mas conocimiento y tiempo.
  #11 (permalink)  
Antiguo 21/09/2016, 07:14
 
Fecha de Ingreso: noviembre-2013
Mensajes: 147
Antigüedad: 10 años, 4 meses
Puntos: 1
Respuesta: Web Service XML

Maestro abrahamhs, gracias por el empujon que necesitaba. Aqui dejo el programa por si a alguien le sirve (es solo la parte para extraer los datos del XML)

Código Java:
Ver original
  1. //recibo el parametro en mi caso es el documento del usuario
  2.         int id1=Integer.parseInt(request.getParameter("id1"));
  3.         BigDecimal idusuario = new BigDecimal(id1);
  4.         BigDecimal idapp     = new BigDecimal(2206);
  5.         String documento2=request.getParameter("id1");
  6.         int posx=0;
  7.         int tamanio=0;
  8.        
  9.     try {
  10.         //invoco el servicio web
  11.     com.cia.seguridad.web.services.WSMenuWebService service = new com.cia.seguridad.web.services.WSMenuWebService();
  12.     com.cia.seguridad.web.services.WSMenuWeb port = service.getWSMenuWebPort();
  13.         com.cia.seguridad.web.services.WSMenuWeb port2 = null;
  14.         // aqui se inicializan los parametros que necesita el servicio web
  15.     java.math.BigDecimal documento = null;
  16.     java.math.BigDecimal aplicativo = null;
  17.     java.lang.String pais = "";
  18.         documento=idusuario;
  19.         aplicativo=idapp;
  20.     // TODO process result here
  21.     //java.lang.
  22.         //guardo el resultado en la variable "result"
  23.         String result = port.menuUsuarioAplicacion(documento, aplicativo, pais);
  24.         //con DocumentBuilder convierto el String a XML
  25.         DocumentBuilder builder = null;
  26.         builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();            
  27.         Document xmlDocument = builder.parse(new ByteArrayInputStream(result.getBytes()));
  28. // con xpath recorro el xml, realmente es facil
  29.             XPath xPath =  XPathFactory.newInstance().newXPath();
  30.             // Instancia de xPath necesaria para compilar las expresiones
  31.             XPathExpression exprParameter = xPath.compile("/Modulos/Transaccion");
  32.             /* Compilo la expresion con el termino que necesito extraer del xml, en mi caso
  33.              * las transacciones que debe permitirsele al usuario (permisos).
  34.              * Con el fin que entre al ciclo y extraiga todos los registros.
  35.              */
  36.             NodeList parametros = (NodeList)exprParameter.evaluate(xmlDocument, XPathConstants.NODESET);
  37.             // dentro de la variable parametros inserto todos los registros para extraerlos mediante el ciclo
  38.             for(int i=0; i<parametros.getLength(); i++){
  39.                 // extraigo el parametro especifico ...para este ejemplo lo presento en pantalla
  40.                 // pero desde aqui ya se puede utilizar de acuerdo a sus necesidades
  41.                 Node paramNode = parametros.item(i);
  42.                 String pTransaccion = paramNode.getAttributes().getNamedItem("transaccion").getNodeValue();
  43.  
  44.                 System.out.println("Parametro Leido : " + pTransaccion );
  45.                 //System.out.println("Leido parámetro " + parameterName + " de clase " + parameterClass);
  46.             }            
  47.            
  48.            
  49.            
  50.             String expressionCodigoPerfil = "/Modulos/@codigoPerfil";
  51.             String codigoPerfil = xPath.compile(expressionCodigoPerfil).evaluate(xmlDocument);
  52.             System.out.println(codigoPerfil);
  53.  
  54.             String expressionClasificacion = "/Modulos/Transaccion/@clasificacion";
  55.             String clasificacion = xPath.compile(expressionClasificacion).evaluate(xmlDocument);
  56.             System.out.println(clasificacion);        
  57.  
  58.             String expressionTransaccion = "/Modulos/Transaccion/@transaccion";
  59.             String transaccion = xPath.compile(expressionTransaccion).evaluate(xmlDocument);
  60.             System.out.println(transaccion);
  61.  
  62.             String expressionMenu = "/Modulos/Transaccion/transaccion";
  63.             String menu = xPath.compile(expressionMenu).evaluate(xmlDocument);
  64.             System.out.println(menu);
  65.            
  66.            
  67.     out.println("Transaccion = "+transaccion);
  68.     out.println("menu = "+menu);
  69.         //*************************************************************        
  70.     } catch (Exception ex) {
  71.     // TODO handle custom exceptions here
  72.     }

Etiquetas: service, xml
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:00.