Procedimiento para realizar una petición a un Web Service a través de Oracle utilizando XML

Pues eso amig@s,

Si necesitamos conectarnos a un webservice y obtener el resultado de la ejecución de una función determinada, podemos hacerlo a través del siguiente procedimiento. Recordar que es necesario cambiar el host y el nombre de la función (en el código aparece como FUNCIONWEBSERVICE) por la que necesiten llamar. Quizás también necesiten pasarles más parámetros a la función, en tal caso solo sería necesario añadir más variables a la petición XML.

CREATE OR REPLACE PROCEDURE Restful (p_login IN VARCHAR2, p_password IN VARCHAR2) IS

--Procedimiento para realizar una peticion a un función de un web service determinado y obtener su respuesta en formato XML, a través del dbmsoutput.
--
--(c) 2015 - by pibe


    soap_request  VARCHAR2(30000);
    soap_respond  CLOB;
    http_req      utl_http.req;
    http_resp     utl_http.resp;
    resp          XMLType;
    soap_err      exception;
    v_code        VARCHAR2(200);
    v_msg         VARCHAR2(1800);
    v_len number;
    v_txt Varchar2(32767);
  BEGIN
 
    soap_request:= '<?xml version="1.0" encoding="utf-8"?>'||
                   '<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">'||
                   '<soap:Body>'||
                   '<FUNCIONWEBSERVICE xmlns="http://tempuri.org/">'|| //Aquí definimos la función del webservice que vamos a utilizar.
                   '<login>'||p_login||'</login>'||
                   '<password>'||p_password||'</password>'||
                   '</FUNCIONWEBSERVICE>'||
                   '</soap:Body>'||
                   '</soap:Envelope>';
                 
    http_req:= utl_http.begin_request
              ( 'http://localhost/wsdemo.asmx' //indicar el host al que se realizará la petición.
              , 'POST'
              , 'HTTP/1.1'
              );
    utl_http.set_header(http_req, 'Content-Type', 'text/xml; charset=utf-8'); --el tipo de codificación de salida, es decir, en que formato lo vamos a recibir.
    utl_http.set_header(http_req, 'Content-Length', length(soap_request));
    utl_http.set_header(http_req, 'Download', ''); --Le indicamos al webservice lo que queremos hacer.
    utl_http.write_text(http_req, soap_request);
    http_resp:= utl_http.get_response(http_req);
    utl_http.get_header_by_name(http_resp, 'Content-Length', v_len, 1); -- Obtenemos el tamaño de la respuesta
    FOR i in 1..CEIL(v_len/32767) -- obtenemos la respuesta en bloques de 32ks por si existe un caso en el que se supera dicho valor, tenerlo controlado.
    LOOP
        utl_http.read_text(http_resp, v_txt, case when i < CEIL(v_len/32767) then 32767 else mod(v_len,32767) end);
        soap_respond := soap_respond || v_txt;
    END LOOP;
    utl_http.end_response(http_resp);
    resp:= XMLType.createXML(soap_respond); -- Convertimos la salida de CLOB a XMLTYPE
    dbms_output.put_line(soap_respond);
  END;


Ejemplo: (Recordar siempre el tema del código de la matricula, que ha de ser único)

exec  Resful('1234','1234');

Espero que les resulte útil.
Salu2.
Share on Google Plus
    Blogger Comment

0 comentarios: