Inicio > Forms & Reports > Llamar a un Web Services desde Oracle Forms

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.

  1. Victor
    mayo 25, 2010 en 00:52

    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

    • javier.gea
      mayo 31, 2010 en 08:27

      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.

  2. Rubén
    septiembre 10, 2010 en 18:48

    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.

  3. janeth
    febrero 22, 2011 en 23:18

    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??

    • javier.gea
      marzo 2, 2011 en 15:47

      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

    • Gustavo Doello
      marzo 6, 2014 en 21:40

      Hola, Por alguna razón que desconozco pero creo que te puede servir, cuando el java importer “levanta” la clase de java, a los métodos los renombra agregandoles un numerito al azar. Este número se puede ver en “Unidades de Programa” o “Program Units” en el navegador de objetos de form. Buscando la clase importada y abriéndola podrás ver en “Subprogramas” con qué nombre importó el método Ej: NEW_473. Entonces para crear la instancia del objeto en vez de:

      obj := myclass.new;

      deberás escribir

      obj := myclass.new_473; — (reemplazando 473 por el número que te haya asignado en tu caso).
      A mi me llevó un buen rato descubrirlo, espero les sirva.
      Saludos

  4. hernando
    marzo 4, 2011 en 19:55

    Buenas tardes!
    me gustaria en que parte del ORACLE-HOME tengo que almacenar el .jar que deseo utilizar?

    muchas gracias

    • javier.gea
      marzo 8, 2011 en 09:40

      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.

  5. Eli
    enero 5, 2012 en 17:43

    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

    • Javier Gea
      enero 9, 2012 en 09:44

      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.

  6. manuel
    enero 6, 2012 en 21:18

    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.

  7. Rubén
    enero 15, 2012 en 00:24

    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.

    • Javier Gea
      enero 24, 2012 en 13:31

      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.

  8. manuel
    febrero 2, 2012 en 21:39

    no veo la clase en el developer suite, como hago para poder verla e importarla

    gracias por su ayuda

    • Javier Gea
      febrero 6, 2012 en 09:50

      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

  9. Francisco
    julio 5, 2012 en 09:15

    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.

    • Javier Gea
      julio 5, 2012 en 16:05

      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.

  10. Francisco
    julio 6, 2012 en 16:22

    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.

    • Javier Gea
      julio 9, 2012 en 08:48

      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

      • Francisco
        julio 9, 2012 en 10:02

        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.

      • Javier Gea
        julio 9, 2012 en 10:36

        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

      • Francisco
        julio 9, 2012 en 13:08

        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.

  11. Francisco
    julio 10, 2012 en 08:17

    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.

    • Javier Gea
      julio 10, 2012 en 08:29

      Sí, hay que añadir en la variable CLASSPATH del fichero de environment la ruta y nombre completos del .jar.
      Un saludo

      • Francisco
        julio 10, 2012 en 09:01

        Perfecto, ya funciona. Muchas gracias por todo. Saludos.

  12. Fabio
    marzo 16, 2013 en 01:14

    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.

    • Javier Gea
      marzo 18, 2013 en 10:00

      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

  13. Mario
    abril 19, 2013 en 19:52

    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.

    • abril 26, 2013 en 11:06

      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

      • Mario
        abril 29, 2013 en 17:45

        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.

      • mayo 6, 2013 en 13:25

        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

  14. Marcelo
    junio 12, 2013 en 20:44

    tengo serios problemas para utilizar el WEBUTIL en Forms 10g, alguien tiene algún (paso a paso) instructivo de como instalarlo, ya no se que esta bien y que esta mal, simplemente no funciona y según yo he seguido todos los pasos,

    se agradece cualquier tipo de ayuda

  15. Yanny
    julio 16, 2013 en 20:34

    Hola,
    tengo problemas al ejecutar el JAR del proxy generado en JDeveloper (web services proxy) éste lo genere como un JAR, y quiero ejecutarlo desde la consola con un archivo .bat, con las configuraciones de las variables de entorno,
    si podrias apoyarme con un ejemplo,
    el objetivo de mi prueba, es crear un proxy que consuma un servicio web externo empaquetarlo en un JAR, y ejecutarlo en una maquina que solo tiene la maquina virtual de Java sin otros servidores ni tomcat nada, solo JVM.
    Si podrias ayudarme te lo agradecere mucho, saludos
    gracias por tu blog!!

    • Javier Gea
      julio 18, 2013 en 08:39

      Hola.

      ¿Qué error te da?
      ¿El fichero .bat tiene bien configurada la variable CLASSPATH? Debería de estar incluida tu clase con ruta y nombre (por ejemplo c:\proxy\miclase.jar)
      ¿Forms cómo ejecuta ese .bat, en el lado cliente o en el lado servidor?
      ¿El servidor o el cliente tienen acceso a internet?

      Un saludo.

  16. Yanny
    julio 19, 2013 en 15:51

    Hola gracias por contestar,
    Solucione el error que tenia con unas librerias de jaxrpc.jar,
    pero ahora el error es que no encuentra la clase “main” al ejecutar mi jar,
    al jar le indique cual es mi clase principal, y el archivo manifest.mf igual puse

    Main-Class: banxico.Principal
    Class-Path: xxxxxxxx
    Path: .\myjar.jar

    Se ejecuta en un .bat solamente.
    Saludos.

    • Javier Gea
      septiembre 3, 2013 en 08:29

      Buenas.
      Parece un problema de CLASSPATH. Asegúrese de que el .jar pertinente se encuentra incluido en el CLASSPATH.
      Un saludo

  17. Mary
    noviembre 19, 2013 en 21:12

    Hola, he creado el webservice igual que lo indica , puedo verlo e importarlo desde forms sin problema, pero al tratar de ejecutarlo me manda el siguiente error :
    java.lang.NoClassDefFoundError: javax/xml/rpc/ServiceFactory…..me pueden ayudar.
    Gracias..

    • Javier Gea
      noviembre 20, 2013 en 11:42

      Hola.
      El problema es que ese servicio ya no está disponible. Si intentas invocar a la URL http://www.webservicex.net/WCF/ServiceDetails.aspx?SID=48 verá que da error.
      El post del blog lleva tiempo publicado así que imagino que el publicador de ese servicio lo ha eliminado. Veo que en esa página hay varios servicios disponibles. Pruebe por ejemplo con http://www.webservicex.net/WeatherForecast.asmx?WSDL
      Un saludo.

      • Mary
        noviembre 20, 2013 en 15:30

        Gracias por tu repuesta, disculpa que no me haya explicado, me refería a un desarrollo propio el web service funciona correctamente el problema es al querer usarlo en forms, en tiempo de desarrollo no hay problema, el error lo manda ya en tiempo de ejecución. Los pasos que seguí para crear el proxy fueron los mismos, pero me envía el error
        java.lang.NoClassDefFoundError: javax/xml/rpc/ServiceFactory.
        la versión que usamos de JDeveloper es la 10.1.3, la versión de Forms es la 10.1.2.0.2.

      • Javier Gea
        noviembre 20, 2013 en 15:56

        Hola.
        Revisa la variable CLASSPATH del fichero de environment que utilizas en tu aplicación forms.
        La variable CLASSPATH debe de incluir la ruta completa y el nombre de vustro fichero .jar. Por ejemplo en un sistema LINUX CLASSPATH=…..:/aplicaciones/aplicacion/java/miproxy.jar
        Un saludo.

      • Mary
        noviembre 20, 2013 en 21:20

        hola: si ya revise el CLASSPATH de mi default.env y de la variable de sistema CLASSPATH si la tengo incluida….. pero me envía el mismo error.

      • Javier Gea
        diciembre 17, 2013 en 16:01

        LO siento, desde este medio no te puedo ayudar más. Se trataría de revisar un testcase y localizar el problema. Suerte y un saludo

  18. octubre 27, 2014 en 15:02

    Hola buenos días super interesante este tema, me gusta esta pagina por que todos los post son de calidad. Yo necesito consumir un web services desde pl/sql (trigger), no desde forms. He probado varias ejemplos que encuentro en la web pero la verdad ninguno me ha funcionado. Sera que existe un ejemplo de algo básico para consumir por ejemplo el http://www.webservicex.net/WCF/ServiceDetails.aspx?SID=48 igual que lo explicaron con forms pero desde Pl/sql.

  19. Antonio
    octubre 29, 2015 en 15:45

    Hola, Felicitaciones por el tema. Necesito consumir un webservice que está en el Oracle Bus desde Forms 11. Tienen algún ejemplo o documentación de cómo hacerlo o por donde iniciar ?

    • Javier Gea
      diciembre 21, 2015 en 14:20

      Hola. No debería de haber ninguna diferencia entre consumir un WS a través de un BUS o que no lo esté. un saludo

  1. enero 3, 2011 en 13:07
  2. enero 2, 2012 en 10:38
  3. enero 2, 2013 en 09:41
  4. enero 2, 2014 en 09:46
  5. mayo 6, 2014 en 23:40

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: