Como crear un WebService en Java e invocarlo desde VS.Net Fecha: 21/Jul/2004 (17/07/2004) |
Introducción
Constantemente leo artículos donde comparan a Java vs .Net y viceversa. Nunca pude sacar nada productivo de los mismos, ya que mi papel está en el medio de ambos. Cuando se trata de integrar aplicaciones de ambos mundos, lo mejor es buscar un especialista de cada aplicativo y comenzar a trabajar. En este caso yo trate de demostrar como en un par de horas se puede hacer una aplicación que integre ambos mundos a través de un protocolo común, Soap.
Como crear un WebService en Java
Lo primero con lo que me encontré en el momento de ver la creación de un WebService (WS) en Java, fue la elección de la herramienta de desarrollo. Los que estamos acostumbrados al mundo Microsoft, utilizamos solo una herramienta (Visual Studio 2003), y tal vez algún aplicativo de algun tercero para una funcionalidad especial.
En el mundo Java no es asi, empecé a escuchar nombres como JDeveloper, WebSphere Application Developer, Visual Café, etc. Para no complicarme con diferentes opciones, recurrí a una conocida y con una versión trial excelente; JDeveloper 10G de Oracle. El download es bastante simple y para ejecutarlo simplemente se descomprime un zip y se ejecuta el exe.
Download http://www.oracle.com/webapps/dialogue/dlgpage.jsp?p_dlg_id=3037860&src=1952635&Act=32
Nota: Les aconsejo descomprimirla en el disco C:, en el root, ya que si la descomprimen en algún directorio con espacios en su nombre, hay que tocar un archivo de configuración para que compile el IDE.
Figura 1. Oracle JDeveloper 10G
Ya dentro de la herramienta cree lo que en Visual Studio seria una Solución, en este caso se llama un Workspace. Como nombre le puse WsSample1 y le definí un namespace común de trabajo. Esto me creo una solución y un proyecto vacío.
Nota: Podría crear un proyecto concreto que sea específicamente para un werbservice, pero me pareció mas educativo empezarlo de cero.
Figura 2. Creación del nuevo projecto en Java.
Dentro del proyecto agregue una nueva clase de java, la nombre SampleServer. Y en la clase agregué una función que retorna el nombre completo de una persona a partir del nombre y apellido de la misma.
Figura 3. Nueva clase de Java.
He aquí el código java :
public String GetFullName(String FirstName, String LastName) {
return "Tu nombre completo es : " + FirstName + ", " + LastName;
}
Figura 4. Funcion GetFullName().
Nota: "String" es en mayúscula !!! los que usamos C# sabemos a que me refiero.
A continuación compile mi proyecto (Ctrl. + M) y lo publique como un servicio web. Esta tarea es bastante simple, uno selecciona una clase java, hace boton derecho y selecciona la opción create J2EE WebService. El WebService se crea usando los valores por defecto de la clase y se publica en un servlet en el puerto 8988.
Nota: la ayuda de esta herramienta es fantástica, si ponemos como criterio de búsqueda J2EE WebServices, aparecen un par de artículos muy buenos. Les recomiendo leerlos.
Figura 5. Publicar la clase SampleServer como un WebService.
Figura 6. Dentro del WorkSpace se agregan los nuevos elementos del WebService.
El siguiente paso (a este lo conocía de antes) es probar nuestro WS. Para esto seleccionamos nuestro WS MyWebService1, menu contextual y seleccionamos la opción Run. Esta acción levanta un pequeño Application Server, y nos publica nuestro WS en un Servlet de Java.
Figura 7. Correr el WebService.
Si nos fijamos en la pestaña de Output OC4J Server, nos muestra el resultado y estado de nuestro WS. Parte del mensaje es el siguiente :
The application can be accessed at location: http://172.16.2.202:8988/WsSample-Project-context-root/MyWebService1
Navegando esta url nos aparece un formulario de prueba del webservice muy parecido al que conocemos de .Net. Si queremos ver la estructura del WS, simplemente navegamos http://172.16.2.202:8988/WsSample-Project-context-Root/MyWebService1?wsdl. Desde este formulario de prueba podemos navegar y testear el WS.
Figura 8. Formulario de prueba del WebService.
Figura 9. Formulario de prueba para la funcion GetFullName().
Figura 10. Resultado del Formulario de prueba para la funcion GetFullName().
Invocando el WebService desde Vb.Net
Esta parte es mucho mas simple, no voy a entrar en muchos detalles ya que asumo que todos conocemos como invocar WS desde Visual Studio.
Figura 11. Visual Studio 2003 :D.
La idea es simplemente hacer un cliente Vb.Net para poder invocar y ejecutar el WebService. Para esto cree una nueva aplicación para Windows en Vb.Net. La nombre “WsSampleClient”.
Figura 12. Nueva aplicación para windows en Vb.Net.
Al form principal de la aplicación, le agregue 2 cajas de texto y un botón. La idea es ingresar el Nombre y Apellido, e invocando el WS obtener el nombre completo. Luego agregue una Referencia web al WS de Java.
Figura 13. Formulario de Prueba en Vb.Net.
Figura 14. Agregar Referencia Web al WS de Java.
Y en el clic del botón escribí el siguiente código
Private Sub btnNombreCompleto_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnNombreCompleto.Click
Dim JWS As New WebReference.MyWebService1
MsgBox(JWS.GetFullName(txtNombre.Text, txtApellido.Text))
End Sub
Figura 15. Ejecutando el WebService desde Vb.Net.
Llego el momento de probar, es bastante simple y lo único que debemos tener el cuenta es que el WS este corriendo en el Oracle, F5 (ejecutar) y listo !!
Nota: Todavía no se porque, pero cuando Visual Studio 2003 crea el Proxy local para el WS, le pone como Puerto 8888, a este error hay que corregirlo a mano. Para esto, seleccionamos el proyecto de VB, luego presionamos la opción para ver todos los archivos y expandiendo todos los archivos de las referencias web, editamos el Reference.vb. Dentro de esta clase, en el constructor de la misma, se define la url del WS. Hay q cambiar
Me.Url = "http://pcbcapuano:8888/WsSample-Project-context-root/MyWebService1"
Por
Me.Url = "http://pcbcapuano:8988/WsSample-Project-context-root/MyWebService1"
pbcapuano es el nombre de mi pc, en su proyecto debería figurar el suyo.
Depurando
Hasta aquí era todo demasiado fácil, la creación es simple, y la invocación desde Vb.Net también. Pensé que si ambas herramientas respetaban los protocolos Soap y un esquema de depuración, levantarlas en modo debug no seria complicado. Levantar nuestro proyecto dentro del JDeveloper 10G en modo Debug, consiste en seleccionar el MyWebService1 y sobre el menú contextual seleccionar Debug . Para poner un punto de interrupción en la línea que arma el nombre, nos paramos sobre la misma y presionamos F5 o hacemos clic sobre el margen izquierdo del editor de código, al igual que lo hacemos en Vb.Net (o que lo hacíamos en VB6). Si el panel de output nos mostró ningún error, la aplicación puede ser depurada.
Nota: Podemos probar la depuración de la misma desde la url http://172.16.2.202:8988/WsSample-Project-context-root/MyWebService1, en el formulario de prueba en el Explorer.
Luego para depurar mi aplicación Vb.Net puse un punto de interrupción en la línea
MsgBox(JWS.GetFullName(txtNombre.Text, txtApellido.Text))
Y ejecute mi aplicación. Siguiendo el paso a paso en Vb.Net y luego en Java, parece transparente la integración entre ambas.
Nota: En este caso no pongo un detalle paso a paso de la ejecución, sino que prepare un flash con el resultado de esta ejecución. Demo : Depurando.htm
Conclusión
Desde mi punto de vista y como desarrollador .Net, realmente es una alegría (léase alivio también) poder comprobar que la integración entre 2 mundos completamente distintos es tan fácil gracias a un protocolo comén. En este caso ambas herramientas respetan la versión 1.1 de WebServices, pero si probáramos con la versión 2.0 (WSE 2.0, ya esta disponible para utilizar en Visual Studio) o con Visual Studio 2005, la integración seria aun mayor ya que podríamos contar con ejecución de eventos, mensajes asincrónicos y demás. Quiero agradecer especialmente a Julian De Anquin, que me ayudó con la parte de Java. Hasta la próxima.
Si tienen alguna duda o comentario, me pueden contactar en [email protected].