如何通过pl / sql块调用web服务,我们知道url,用户名和密码。
如何看待回复?
提供一些示例代码......
提前致谢
我使用了以下代码:
CREATE OR REPLACE FUNCTION READ_DATA_FROM_WS (url IN VARCHAR2,
username IN VARCHAR2,
password IN VARCHAR2)
RETURN CLOB
IS
req UTL_HTTP.req;
resp UTL_HTTP.resp;
DATA VARCHAR2 (2000);
data1 CLOB;
def_timeout PLS_INTEGER;
l_envelope VARCHAR2(32767);
BEGIN
req := utl_http.begin_request(url, 'POST','HTTP/1.0');
UTL_HTTP.set_authentication (req, username, password);
utl_http.set_header(req, 'Content-Type', 'text/xml');
resp := utl_http.get_response(req);
IF (resp.status_code = UTL_HTTP.http_ok)
THEN
UTL_HTTP.set_body_charset (resp, 'UTF-8');
BEGIN
LOOP
UTL_HTTP.read_text (resp, DATA);
data1 := data1 || DATA;
END LOOP;
EXCEPTION
WHEN UTL_HTTP.end_of_body
THEN
UTL_HTTP.end_response (resp);
UTL_HTTP.set_transfer_timeout (def_timeout);
WHEN OTHERS
THEN
NULL;
END;
UTL_HTTP.set_transfer_timeout (def_timeout);
ELSE
UTL_HTTP.end_response (resp);
DBMS_OUTPUT.put_line ('HTTP response status code: ' || resp.status_code);
END IF;
RETURN (data1);
END read_data_from_ws;
/
答案 0 :(得分:4)
我使用pl / sql的web服务没有问题! 我正在使用这个(+我自己的改进):http://www.oracle-base.com/dba/miscellaneous/soap_api.sql
确保正确定义名称空间,我认为你应该只使用它来检索ASCII而不是二进制数据......
答案 1 :(得分:0)
以下是一些示例代码。留下一些,但它给你一个想法。该函数返回WMS Web服务的XML功能。
function getcapabilities(p_url varchar2
,p_version varchar2) return xmltype is
pragma autonomous_transaction;
req utl_http.req;
resp utl_http.resp;
c varchar2(255);
l_clob clob;
begin
dbms_lob.createtemporary(lob_loc => l_clob, cache => true, dur => dbms_lob.call);
-- -----------------------------------
-- OPEN TEMPORARY LOB FOR READ / WRITE
-- -----------------------------------
dbms_lob.open(lob_loc => l_clob, open_mode => dbms_lob.lob_readwrite);
utl_http.set_proxy(proxy => <proxy>, no_proxy_domains => <no_proxy>);
/* request that exceptions are raised for error Status Codes */
utl_http.set_response_error_check(enable => true);
/* allow testing for exceptions like Utl_Http.Http_Server_Error */
utl_http.set_detailed_excp_support(enable => true);
if instr(p_url, '?') > 0
then
req := utl_http.begin_request(p_url || '&REQUEST=GetCapabilities&SERVICE=WMS&VERSION=' ||
p_version);
else
req := utl_http.begin_request(p_url || '?REQUEST=GetCapabilities&SERVICE=WMS&VERSION=' ||
p_version);
end if;
utl_http.set_header(req, 'User-Agent', 'Mozilla/4.0');
resp := utl_http.get_response(req);
begin
loop
utl_http.read_text(r => resp, data => c);
/* function that adds a string to a clob */
add_to_clob(l_clob, c);
end loop;
exception
when utl_http.end_of_body then
null;
when others then
raise;
end;
utl_http.end_response(resp);
dbms_lob.close(lob_loc => l_clob);
/* this was for some Oracle bug */
execute immediate 'alter session set events =''31156 trace name context forever, level 2''';
commit;
return xmltype.createxml(l_clob);
end;
答案 2 :(得分:-1)
即使有办法做到这一点,这也是一种非常糟糕的做法!
此外,这里有很多问题。这项服务将返回什么?你如何将结果解析为sql可以理解的东西?您如何处理从服务中返回的错误?
只需返回返回应用程序所需的任何内容,让应用程序调用Web服务。