Apex, PL/JSON y web services Restful

Durante los últimos días he dedicado bastantes horas a este problema, y a pesar de resolverlo, la solución que he encontrado no me parece la más correcta. Sin embargo es la única solución que he encontrado, quizás alguno de vosotros pueda proponer alguna mejor.

Se trata de acceder a los recursos de una base de datos Oracle utilizando web services del tipo REST. Para ello, contamos con una base de datos Oracle 11g, y además la versión 4.2.2 de Application Express, más conocido como APEX. En la base de datos tenemos instalado el objeto PL/JSON, que nos permite trabajar con objetos del tipo JSON como si fuera un tipo de datos mas de PL/SQL.

La idea es tener la mayor parte del funcionamiento de nuestro software encapsulado en paquetes, funciones y procedimientos de base de datos. Mediante apex definiremos  web services RESTful para consumir esos recursos en nuestra aplicación cliente.

Apex permite crear diferentes tipo de web services REST muy fácilmente como se puede ver en este videoPor ejemplo, creamos una consulta sql, y apex nos devolverá automáticamente un objeto JSON con los datos de la query. Para esto basta con crear un web service rest de tipo GET y especificar que los datos de salida van en formato JSON. En el siguiente documento podéis encontrar una guía detallada de oracle de como se hace esto.

Teóricamente, también podemos invocar mediante apex bloques de pl/sql anónimo usando los métodos POST, PUT o DELETE, y cualquier parámetro OUT o IN/OUT de ese bloque de código anónimo, sera transformado automáticamente en objetos json y devueltos mediante el web service.

Apenas he encontrado ejemplos de este segundo caso, y los que he encontrado no utilizan llamadas a procedimientos o funciones de pl/sql en el handler del web service, sino solo consultas y cursores. Yo necesito poder invocar en el handler del web service, a procedimientos y funciones pl/sql que me devuelvan objetos generados con PL/JSON para después traspasar esos objetos JSON a través del web service a nuestro cliente.

En realidad no he encontrado ningún ejemplo decente de como crear un webservice rest con apex del tipo POST, PUT o DELETE.

Sin embargo, he conseguido emular esa funcionalidad mediante un método GET, que ejecuta un bloque de código anónimo de PL/SQL que puede a su vez invocar a funciones y procedimientos y finalmente retornar información en formato JSON. La manera en que lo he hecho es la que veis a continuación. No digo que sea la correcta, pero funciona. Quizás alguien me pueda poner en el buen camino de como utilizar apex, y rest con metodos post.

1.- Creamos una funcion de PL/SQL de prueba.

2.- Definir el web service Restful en la consola de administración de Apex

Creamos nuestro web service de acuerdo a la siguiente ilustración.

Como definir el servicio rest en la consola de administración de apex
Como definir el servicio rest en la consola de administración de apex

Nuestro web service se llamará «prueba». La plantilla del URI es «prueba666/{mi_parametro}» de manera que nuestro web service aceptará un parámetro de entrada. Establecemos que el método sera GET, y el tipo de handler PL/SQL.

En el código fuente del Handler, ponemos el siguiente (notad que en la ilustración hay un error en la sintaxis del código fuente, el bueno es el que sigue):

De tal manera que invocando nuestro web service con la siguiente url:

http://ip_servidor:8080/apex/mi_esquema/prueba/prueba666/Valor_del_parametro

obtendremosn es siguiente objeto JSON que podremos consumir en nuestra aplicación cliente:

Obviamente, el objeto Json puede ser todo lo complejo que queramos, y contener por ejemplo, arrays provenientes de otras querys, etc.

Recursos:

6 comentarios en “Apex, PL/JSON y web services Restful”

  1. Hola Roque. Verás soy nuevo en este foro y soy mas nuevo aunen el tema de arduino, jeje. y estoy interesado en hacer algo como lo que comentas con arduino yun y el head control, aunq no se nada de nada supongo que es menos complicado y me gustaria si pudieras que me dieras alguna pista. El tema es que tengo que hacer un proyecto de final de curso, en instalaciones termicas y calcularé una vivienda para ponerle una bomba de calor, y dicha bomba manejarla con arduino a traves de la wifi. El tema es que para hacerlo en una casa real si que me vale todo lo que expones anteriormente( muy bien detallado por cierto), pero en este caso necesito hacer una pequeña maqueta para mostrar el funcionamiento en la exposición. Pero como alli no podré tener linea de internet en el router que lleve a la exposicion me pregunto si se puede controlar el arduino a traves de la conexion wifi nada mas????? Muchas gracias.

    • Hola Joan,

      Lo que tienes que hacer es crear una red entre el arduino, el router que lleves a la exposicion, y el dispositivo que controle al arduino. En principio da igual donde enciendas el router, debería funcionar. Me explico: en mi casa yo tengo un router de vodafone, que me da acceso a internet, y al cual tengo conectado mi telefono movil, y el arduino. Ese router me proporciona mi red domestica, que se llama «Wifi-pepito». Si yo ese router me lo llevo a mi pueblo, donde ni siquiera tengo linea telefonica, y lo enchufo a la corriente electrica, el movil que llevo en el bolsillo, detectará la red «wifi-pepito» y se conectará. Obviamente, no tendre salida a internet, pero si podre conectar mi portatil, mi movil o tablet, y mi arduino, y tendré comunicación entre ellos.

      Obviamente, tendrás que usar la ip del arduino para acceder a el, o lo que en este proyecto he llamado «web service interno». En cualquier caso, pruebalo bien antes del momento de la exposicion ;).

      Otra cosa aparte y que no he probado, es que el propio arduino yun puede configurarse para funcionar como punto de acceso, es decir, podrias hacer que el dispositivo android se conectase al arduino yun, y este le asignaria una ip al android, etc. De esta forma tendrias comunicacion entre ambos, sin necesitar tan siquiera un router por el medio. Pero no lo he probado, ya que no es interesante para mi proyecto en particular, pero ahi queda la idea por si quieres desarrollarla.

      Un saludo

      • Roque:
        Antes que nada agradecer tu rápidísima respuesta. con respecto a lo que me dices, justo despues de escribirte seguí navegando por aqui por la página y justo vi que hay una publicación que habla de como encender una bombilla con el yun y android, y aunq no he leido el post 100% es creo lo que me servirá para hacer mi maqueta, para demostrar de manera facil y sencilla como encender o apagar en este caso, una caldera a distancia. De nuevo muchas gracias y na mas me compre el yun si tengo alguna duda o me surge algun problema te preguntaré a ver si me puedes ayudar 😉 .

Los comentarios están cerrados.