Hablemos primero un poco acerca de XML Gracias a los protocolos para conectar XML como XML-RPC,SOAP o RSS, XML sobrevivió al desastre de convertirse en un lenguaje que no aportara nada nuevo a lo existente (HTML), y que combinado con WSDL, JAVA y PHP obtenemos las herramientas más utilizadas en la red hoy en día: servicios.
XML es robusto, podemos modificar el fichero fácilmente sin que pierda su significado dramáticamente; podemos construir una estructura para moldear la forma en que se comunican nuestros servicios con los clientes y aplicaciones con diversas reglas, me gustaría que mirárais la documentación sobre XML, XML-RPC,SOAP,RSS,SAX,DOM, JDOM y WSDL que he puesto aquí (de la UGR , y también en un comprido manuales_comunicacion.rar para tenerlo en local) ya que se explican conceptos fundamentales, como el standalone de xml (para decir si la estructura del árbol documento [DOM] se construye sólo con un fichero o por medio de varios, etc.), o lo nuevo de XML que son los namespace para que dentro del nombre de la etiqueta se pueda incrustar un diccionario: <dic:alumno>…</dic:alumno>, etc.; también, indicando donde está mediante <Nombre xmlns=»url_del_diccionario_nombre»>…
Sabiendo que DTD y un esquema XSD definen de la misma forma la estructura de un XML, estos últimos XSD son los más utilizados hoy en día, porque es realmente sencillo (al menos cuando estuve construyendo zenphp me costó mucho tener reglas DTD válidas para el generador de aplicaciones php a partir de un xml) hacer dichas reglas usando XML, ya que XSD se basa en un DTD ,son los diccionarios predefenidos que se van incrustando como las muñecas rusas.
El protocolo XML funciona normalmente a través del puerto HTTP (80) y dió lugar al XML-RPC, fué más famoso que SOAP porque éste había que introducirlo mediante un conjunto de reglas propias y era pesado de hacer, actualmente existen librerías que crean los envoltorios para enviar mensajes:
..embebiendo tipos en parámetros y estos en valores dando forma así a las peticiones y las respuestas de los servicios.
SOAP : es ligero, tiene pocas etiquetas y casi no pesan nada, es como la evolución de XML-RPC ,al fin y al cabo, es otro envoltorio para enviar mensajes por HTTP o SMTP , (Facebook lo usa)…
WSDL: además define reglas para un servicio web…mirar la documentación propuesta anteriormente para más información…
Para empezar, veremos como conectar Java con un WSDL y obtener resultados, siguiendo los pasos:
Ahora que sabemos como comunicar servicios con esquemas XML veamos como utilizar Java para implementar una aplicación que haga lo que nuestro querido SOAP UI hace tan fácilmente en una serie de sencillos pasos:
package EscribirXML.SOAP; import java.net.*; import java.io.*; /** * * @author */ public class ClienteSOAP { public final static String DEFAULT_SERVER = "https://www.ebi.ac.uk/Tools/webservices/wsdl/WSDbfetch.wsdl"; // = "https://www.schemaweb.info/webservices/soap/SchemaWebSoap.asmx?WSDL"; /* public final static String SOAP_ACTION = "https://www.schemaweb.info/webservices/methods/GetObjects";*/ public static void main(String[] args) { String server = DEFAULT_SERVER; try { URL u = new URL(server); URLConnection uc = u.openConnection(); HttpURLConnection connection = (HttpURLConnection) uc; connection.setDoOutput(true); connection.setDoInput(true); connection.setRequestMethod("POST"); //connection.setRequestProperty("SOAPAction", SOAP_ACTION); OutputStream out = connection.getOutputStream(); Writer wout = new OutputStreamWriter(out); wout.write( "<soapenv:Envelope xmlns:xsi=\""+ "https://www.w3.org/2001/XMLSchema-instance\" "+ "xmlns:xsd=\"https://www.w3.org/2001/XMLSchema\" "+ "xmlns:soapenv=\"https://schemas.xmlsoap.org/soap/envelope/\" "+ "xmlns:wsd=\"https://wsdbfetch.ws.jdbfetch.ebi.ac.uk\">"+ "<soapenv:Header/>"+ "<soapenv:Body>"+ "<wsd:getSupportedDBs soapenv:encodingStyle=\""+ "https://schemas.xmlsoap.org/soap/encoding/\"/>"+ "</soapenv:Body>"+ "</soapenv:Envelope>"); wout.flush(); wout.close(); InputStream in = connection.getInputStream(); int c; System.err.println( "\n\nCONTESTACION\n\n"); while ((c = in.read()) != -1) System.out.write(c); in.close(); } catch (IOException e) { System.err.println("HA DADO UNA EXCEPCION"); System.err.println(e); } } // end main }
Por último vamos a probar un ejemplo del análisis sintáctico de un fichero XML a través del uso de un ParserDOM, abriendo el paquete DOM.Parsear y dentro el fichero «ParserDOM.java» sólo hemos de pasarle la ruta por línea de comandos del fichero y observar los resultados… (ver ejemplos con SAX del mismo proyecto de NetBeans proporcionado)…
El Modelo Objeto Documento de Java además de servir de analizador sintáctico con el método parse(), proporciona interfaces para manejar ficheros como árboles de datos, se obtiene con parsed.getDocument(), si no existen excepciones se trata, en otro caso es que el documento no ha pasado la validación, encontraremos información de prefijo, etc. dentro del árbol…
« Volver al curso de Arquitectura de Servicios en Java+PHP
Estoy probando este codigo para peticiones SOAP, y cuando pongo el localhost mi WSDL, me sale este error:
java.io.IOException: Server returned HTTP response code: 415 for URL: http://….
Con el del ejemplo si me funciona…
@JTR: Qué raro, cuál es la url completa de tu WSDL? seguro que estás haciendo una llamada correcta? desde el navegador?…tómate un tiempo para explicar qué cambios has introducido en tu código…
saludos
Como decían en los foros del web, para que la respuesta sea del tipo XML en lugar de HTML tienes que especificarlo en la cabecera, como decía «avatarr»:
—
connection.setRequestProperty(«Content-Type», «text/xml; charset=utf-8»);
—