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.
Procedimiento para realizar una petición a un Web Service a través de Oracle utilizando XML
-
Cursos Paso a Paso
,
Noticias
,
Oracle
Edit
0 comentarios:
Publicar un comentario