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.

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:

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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
/*Tenemos un objeto POJO que queremos convertir en JSON para enviar mediante nuestro webservice POST al servidor*/ MI_OBJETO_POJO=new MI_OBJETO_POJO(los parametros que sean); //Creamos el mapeador de la libreria Jackson que convertirá el pojo en una cadena de texto con formato JSON. ObjectMapper mapper = new ObjectMapper(); //Convertimos el objeto POJO a json String cadena_aux = mapper.writeValueAsString(MI_OBJETO_POJO); //Lo añadimos a una lista de pares de valores, que posteriormente añadiremos al header de nuestra peticion. //Podriamos añadir mas parametros si fuera necesario //Muy importante: el nombre del par de valores es sensitivo al caso, asi que si en //el manejador del webservice lo teneis que poner igual que aqui. ArrayList<NameValuePair> pares_valores.add(new BasicNameValuePair("OBJETO_ENTRADA", cadena_aux)); HttpPost mRequest = new HttpPost(url_del_webservice); mRequest.setEntity(new UrlEncodedFormEntity(pares_valores)); HttpClient client = new DefaultHttpClient(); HttpResponse response = client.execute(mRequest); InputStream source = response.getEntity().getContent(); Reader reader = new InputStreamReader(source); MI_CLASE_RETORNO m = mapper.readValue(reader, MI_CLASE_RETORNO.class); } |