Llamar a un Web Services desde Oracle Forms
Una de las ventajas que aporta Forms en tres capas ya desde la versión 9i pero en especial en la nueva versión 11g, es la integración con otras tecnologías.
En este post vamos a ver lo sencillo que es integrar forms, una tecnología de más de 20 años, con una de las tecnologías que han irrumpido últimamente en el mundo del desarrollo de aplicaciones y de soluciones TI empresariales, que no es otra que SOA y en concreto Web Services.
Para consumir un Servicio desde Forms hay que seguir los siguientes 4 pasos.
Paso 1. Identificar el WSDL
El proveedor del servicio nos ha facilitar la URL del WSDL (Web service definition lenguaje). Mediante WSDL se define la interfaz pública a los servicios Web. En definitiva describe la forma de comunicación entre consumidor del servicio y proveedor del servicio.
Como ejemplo utilizaremos el siguiente servicio público que nos devuelve la temperatura actual de la ciudad indicada. El WSDL está en.
http://www.webservicex.net/WCF/ServiceDetails.aspx?SID=48
Paso 2. Crear un proxy
Desde JDeveloper y a través de un wizard crearemos una clase Java que tendrá como misión actuar de “puente” entre forms y el Servicio Web. Os muestro los pasos más importantes en el siguiente GIF animado.

Una vez creado nuestro proyecto podemos probarlo desde el mismo JDeveloper.
Paso 3. Empaquetar el proxy
Crearemos un .jar que será lo que utilizaremos desde Oracle Forms.

Paso 4. Importar desde Oracle Forms
Para poder utilizar el proxy JAVA desde forms hemos primero de configurar lo siguiente.
- En tiempo de diseño. Añadir en variable de sistema CLASSPATH el nuevo .jar
- En ejecución. Configurar el fichero de environment del servidor de aplicaciones donde está desplegada nuestra aplicación Forms añadiendo nuestro .jar en la variable CLASSPATH
Una vez configurado, desde la utilidad Java Importer del Forms builder importaremos las clases Java necesarias para utilizar el proxy.


El PL/SQL para consumir el servicio desde forms.

El resultado.



Hola siguiendo los pasos me envia el siguiente error al tratar de importar a forms el jar
Error – Unsupported major.minor version 50.0
Espero que me puedas ayudar
El error está relacionado con la versión de JDK utilizada para crear el proxy desde la cual se accede al WS.
Concretamente se está produciendo una incompatibilidad de versiones entres Oracle forms y la JDK utilizada para crear el proxy.
En mi “paso a paso” utilicé un JDK 1.6.0.14 para empaquetar el WS y Forms 11g para consumirlo. Debería de empaquetar el WS con una versión de JDK acorde con la versión de Oracle Forms que esté utilizando.
Un saludo.
Buen día, cómo podría lograr implementar un paso mas donde el resultado obtenido del webservice (datos xml) quede grabado en un archivo XML en el disco duro.
Lo que necesito al final subir este archivo XML a una tabla que tiene una columna de tipo XMLType en la base de datos Oracle.
No sé cómo conseguir esto desde forms o si talvés es mejor usar PL/SQL.
De antemano gracias por sus sugerencias.
Saludos cordiales.
Buenas.
Te paso un par de links que hablan de ello.
http://www.oracle.com/technetwork/database/features/xmldb/oracle-xml-db-and-forms-integration-132939.pdf
http://www.oradev.com/xml.jsp
Recuerda que un XMLTYPE es un CLOB.
Espero que te sirva de ayuda.
Un saludo
Buenas
EN El PL/SQL para consumir el servicio desde forms. me genera el siguiente error:
Error 302 component ‘NEW’ must be declared
Por favor me pueden indicar que debo hacer??
Lo siento, sin más datos nos es imposible ofrecer o pensar una solución a lo que nos está ocurriendo.
Sigue el ejemplo de nuestro post y quizás te ayude a encontrar que está pasando
Buenas tardes!
me gustaria en que parte del ORACLE-HOME tengo que almacenar el .jar que deseo utilizar?
muchas gracias
Hola.
Si quieres utilizar desde lado cliente un fichero .jar copialo en $ORACLE_HOME/forms/java y configúralo en el “formsweb.cfg”, concretamente en la variable “archive”.
Si lo necesitas para desarrollar desde el forms builder este fichero .jar ha de estar configurado en el CLASSPATH de la máquina de desarrollo.
Un saludo.
Buenos días:
Quisiera un ejemplo de la llamada a un web services que me retorne una lista de objetos. El stub generado en Jdeveloper y la forma de llamarlo en el Oracle Forms. Muchas gracias
Cuando un web services retorna una lista de datos es necesario hacer desde Oracle Forms un import de la clase Java en cuestión para poder tratarla. La creación del proxy desde Jdeveloper es idéntica a la del ejemplo del post.
No dude en ponerse en contacto con avanttic si necesita profundizar en el desarrollo de una solución a su necesidad.
buenas tengo problema para crear el proxy, estoy tratando de usar el jdeveloper 10g, pero no me da la opcion para crear este tipo de web services.
que estoy haciendo mal o debo usar otra version del jdeveloper.
Cierto, desde Jdeveloper 10g no es posible crear este tipo de proyectos. Descárguese la última versión de Jdeveloper desde el siguiente enlace.
http://www.oracle.com/technetwork/developer-tools/jdev/overview/index.html.
Hola, buenas noches.
¿Es posible consumir un webservice que tiene compresión desde Oracle Forms?
He seguido paso a paso sus instrucciones y es exitoso con webservices públicos pero cuando lo intento con el webservice que es de nuestro interés no es posible.
Según la documentación de este webservice, hay que agregar el esquema de compresión en el lado del consumidor y para ello nos proveen de un archivo DLL (WSSoapCompression.dll).
No soy experto en el tema y no sé qué pasos adicionales debo seguir.
Por cierto, tengo Oracle Forms 10g con el conjunto de parches 10.1.2.3.0
Muchas gracias por sus luces.
Hola.
Para utilizar una .DLL desde forms hay varias alternativas. Le indico alguna de ellas:
- Utilizando WEBUTIL de Oracle. WEBUTIL se ejecuta en el lado cliente por lo que la .dll también deberá de estar en el cliente.
- JAVA es capaz de hacerlo, por lo que si JAVA es capaz de hacerlo también forms:
a. A través de un PJC en el lado del cliente y si la .dll está en el cliente
b. A través de un “import java class” si la .dll se encuentra en el servidor de aplicaciones y éste es Windows
- ORA_FFI. Sólo si la .dll se encuentra en el servidor de aplicaciones y este es Windows
Un saludo.
no veo la clase en el developer suite, como hago para poder verla e importarla
gracias por su ayuda
Hola.
Si usted tiene instalada un versión 10gR2 el fichero frmjdapi.jar se encuentra en %ORACLEHOME%\forms\java
Si usted tiene instalada una versión 11g ó una 11gR2 el fichero frmjdapi.jar se encuentra en %ORACLEHOME%\fr_1\jlib
Un saludo
Tengo un package de bbdd que consume un WS utilizando UTL_HTTP. Yo no conocía esta forma de hacerlo con JDeveloper. Mi pregunta es: cual es la mejor opción o mas óptima? Y que diferencias hay? Muchas gracias por su atención.
Teniendo en cuenta que ambas opciones son nativas de Oracle, tanto consumir el servicio desde la base de datos como desde un formulario, no tendremos problemas en cuanto a su correcto funcionamiento y si hubiese algún tipo de problema oracle daría soporte para ayudar a solucionar el problema.
A nivel de rendimiento se va a obtener un rendimiento similar.
Desde mi punto de vista yo me basaría desde dónde consumir el servicio teniendo en cuentas estas consideraciones:
-¿Dónde se encuentra la lógica de negocio de mi aplicación?
Si toda la lógica de negocio se encuentra en la Base de datos yo consumiría el servicio desde la base de datos.
Si toda la lógica de negocio se encuentra en la aplicación forms yo consumiría el servicio desde el forms.
Si la lógica está repartida entonces dejo a su criterio dónde se consumirá el servicio.
Por otro lado si el servicio ha de ser consumido desde varias aplicaciones sean o no forms, por ejemplo un desarrollo ADF o .net, entonces ha de ser la base de datos la encargada de consumir el servicio.
-Seguridad de la base de datos
Para consumir el servicio la base de datos ésta ha de tener acceso a la web por lo que quizás no sea posible o el administrador de sistemas no acceda a abrir este acceso desde la base de datos.
Un saludo.
He creado un WS con JDeveloper, lo ejecuto y me responde correctamente. Después he generado el .jar y me lo he importado al forms. Cuando ejecuto el forms e invoco el WS siempre me da el siguiente error: Exception: java.lang.Exception: java.lang.NoClassDefFoundError: …….
Sabeis a que puede ser debido?
Muchas gracias y saludos.
Hola.
¿Tiene configurado la variable CLASSPATH del fichero de environment de la aplicación incluyendo la ruta y nombre exacto de dónde se encuentra el fichero .jar que incluye la clase proxy que se encarga de llamar al WS?
Un saludo
Sí, tengo configurada la variable CLASSPATH tal como me dices. Lo que pasa es que en el error parece que quiere ir a buscar la clase en otro sitio. Por ejemplo, yo tengo el .jar en C:\dev\s-tdp\jar y el error es el siguiente: Exception: java.lang.NoClassDefFoundError: com/sap/document/sap/soap/functions/mc_style/ZMfrPruebaResponse. Tengo que crearme un sistema de directorios como este? Gracias.
Quizás lo que sucede es que estás utilizando otra clase en tu .jar que también se debería de incluir en la variable CLASSPATH.
Un saludo
He hecho vuestro ejemplo y me da el mismo error Exception: java.lang.NoClassDefFoundError:net/webservicex/GlobalWeather, en el momento de ejecución. En cambio, no tengo ningún problema para importar la clase en el forms builder.
¿Tendría que copiar el fichero GlobalWeather-Client.jar el algún directorio en particular?
Gracias y saludos.
Hola, es posible que este error “Exception: java.lang.NoClassDefFoundError:” en tiempo de ejecución sea debido a que se tiene que añadir la ruta del .jar en el CLASSPATH del fichero de environment del servidor? Gracias.
Sí, hay que añadir en la variable CLASSPATH del fichero de environment la ruta y nombre completos del .jar.
Un saludo
Perfecto, ya funciona. Muchas gracias por todo. Saludos.
Buena tarde amigos, tengo un problema cuando estoy intentando importar desde oracle Forms (Forms [32 bits] Versión 10.1.2.3.0) mi jdk con el cual se genero el .jar es 1.4. el mensaje que arroja es :
Importando Clase C:\DevSuite\forms\java\connectWSCerCat…
Se ha producido una excepción: java.lang.ClassNotFoundException: C:\DevSuite\forms\java\connectWSCerCat
Lo intento importar por Programa – Importar Clases java, el me muestra una lista de clases (entre las cuales no aparece mi .jar que ya coloque bajo la ruta de mi CLASSPATH), entonces lo coloco en el campo de ruta de clases (manualmente), pero nada….
mi .jar se llama connectWSCerCat.jar.
Por favor me podrian dar una luz en el tema…
Sls.
Hola.
Prueba de añadir en tu variable CLASSPATH la localización del archivo .class y no el del .jar. Por ejemplo:
CLASSPATH=%CLASSPATH%;c:\midir\ConnectWSCerCat.class
un saludo
Tengo un problema con un web service, lo que hace es agarrar de una direccion archivos xml y subirlos al servidor, pero el programa los revisa si estan correctos, entonces marca error en el archivo xml, la duda es, si mediante jdeveloper o mediante oracle puedo consultar el web service, para verificar si el xml es correcto o le faltan campos ,etc.
Hola Mario,
No acabo de entender el problema: tu aplicación Forms está mandando los ficheros al servicio web pero este no te los reconoce y lo que quieres es probar el servicio directamente mandándole un xml concreto? Si es eso, te recomiendo utilizar soapui para hacer las pruebas del servicio. Mira en el post que escribimos al respecto. Si no es eso y puedes proporcionar información más detallada, seguramente podremos orientarte mejor.
Saludos,
Carles Biosca
Hola
Si gracias ya estoy usando el soapui, pero tengo otra duda, el web service pero lo pasaron ya funcionando, pero nosotros tenemos que generar la estructura del xml con la informacion , que ese xml se enviara atravez del web service, pero marca un error en el xml, dice el error:There is an error in XML document (2, 525)., pero supuestamente el codigo del web service esta correcto, entonces quiero ver como puedo generar la estructura del xml con informacion correcta y estructura tambien para que ya no marque el error. no se si me di a explicar.
Hola Mario,
Por lo que comentas, entiendo que generasteis las clases Java y las utilizasteis en el Form para hacer la llamada al servicio, y ahora os está dando error del mensaje que se manda desde Forms al servicio, quejándose de la estructura del XML. Si este es el caso, parecería que el Web Service ha cambiado desde que generasteis las clases Java. Deberíais comparar el WSDL que utilizasteis en su día con el actual. Si no es el caso, deberíais interceptar la petición para ver exactamente el mensaje que se está mandando. Quizá no llenáis algún campo obligatorio…
Saludos,
Carles Biosca