Apex, PL/JSON y web services Restful con el método POST

Hace un par de semanas me quejaba de lo dificil que es crear un webservice del tipo Restful con Apex y utilizar el método post para enviar datos complejos al servidor. La documentación era escasa, los ejemplos casi inexistentes, y encontré una manera de utilizar los webservices pero usando solo e método get.

Finalmente he conseguido encontrar la manera de configurar en Apex un servicio REST que emplea el método post para enviar datos complejos en el header. No era tan dificil como parecía, lo cual me hace pensar que quizás la falta de documentación no es tal, sino que es algo obvio y el despistado era yo. En cualquier caso, aqui teneis como se hace.

Webservice rest con metodo post en Apex
Webservice rest con metodo post en Apex

Lo primero, creamos nuestro webservice en la consola de administración de Apex, de la siguiente manera:

En método seleccionamos Post, y en tipo de codigo fuente, PL/SQL. En el código fuente, pondremos lo siguiente:

[code]

declare
salida json;

begin
apex_plugin_util.print_json_http_header;
–Ojito con el nombre del parametro OBJETO_ENTRADA, es sensitivo al caso.
salida:= FUNCION_PRUEBA(:OBJETO_ENTRADA);
sys.htp.p(salida.to_char);
end;

[/code]

Detalle de como se define el mapeo del objeto de entrada:

Mapeo del objeto de entrada
Mapeo del objeto de entrada

En nuestra función de PL/SQL, trataremos los datos de la siguiente manera:

[code]

CREATE OR REPLACE FUNCTION FUNCION_PRUEBA (OBJETO_ENTRADA VARCHAR2)
RETURN JSON
IS

mi_objeto_json json;

cadena varchar2;

BEGIN

mi_objeto_json :=json(OBJETO_ENTRADA);

cadena:=mi_objeto_json.get (‘nombre_clave’).get_string;

–Hacemos algo con el objeto json o sus datos.

RETURN mi_objeto_json;

EXCEPTION
WHEN NO_DATA_FOUND
THEN
NULL;
WHEN OTHERS
THEN
— Consider logging the error and then re-raise
RAISE;
END FUNCION_PRUEBA;
[/code]

Finalmente, desde nuestra aplicación, en este caso una aplicación en Java que utiliza las librerias Apache HttpClient y Jackson para trabajar con peticiones http y objetos JSON: