利用utl_http在oracle数据库调用webservice

--用oracle的utl_http调用,oracle11g需要建ACL
--可参考http://log-cd.iteye.com/blog/1345093和http://blog.sina.com.cn/s/blog_952ddba50102wung.html两篇文章,https://www.cnblogs.com/huanghongbo/p/7145365.html

/*创建ACL
用具有管理员权限的用户进入数据库,执行以下脚本创建ACL。
BEGIN
DBMS_NETWORK_ACL_ADMIN.create_acl (
acl =>'test_acl_file.xml', --控制的xml
description => 'A test of theACL functionality',
principal => 'TEST1',--用户
is_grant => TRUE, --是否可以访问
privilege => 'connect',--设置权限
start_date => SYSTIMESTAMP,
end_date => NULL);

COMMIT;
END;

ACL分配网络
ACL分配网络,执行以下脚本分配网络。
BEGIN
DBMS_NETWORK_ACL_ADMIN.assign_acl (
acl => 'test_acl_file.xml',
host => '192.168.2.3', --acl可以访问的网络
lower_port => 80,
upper_port => NULL);
COMMIT;
END;

查看ACL
如果访问的网络数量比较多,可以执行以下脚本,就可以访问所有网络。
CONN / AS SYSDBA
BEGIN
DBMS_NETWORK_ACL_ADMIN.create_acl (
acl => 'open_acl_file.xml',
description => 'A test of the ACL functionality',
principal => 'TEST',
is_grant => TRUE,
privilege => 'connect',
start_date => SYSTIMESTAMP,
end_date => NULL);

DBMS_NETWORK_ACL_ADMIN.assign_acl (
acl => 'open_acl_file.xml',
host => '*',
lower_port => 1,
upper_port => 9999);

COMMIT;
END;

建好ACL和分配网络后可以通过下面的方式查看。
SELECT acl,
principal,
privilege,
is_grant,
TO_CHAR(start_date, 'DD-MON-YYYY') AS start_date,
TO_CHAR(end_date, 'DD-MON-YYYY') AS end_date
FROM dba_network_acl_privileges;

SELECT host, lower_port, upper_port, privilege, status
FROM user_network_acl_privileges;*/

/*
1 名称 scm_webcall_service
2 功能 CMS调用外部服务连接
3 伪代码
4 修改记录
5 说明
5.1
6 存在问题
7 需完善的环节
*/
procedure scm_webcall_service
(
as_paramType in varchar2,
as_paramValue in varchar2,
ai_rtd out number,
as_rmsg out varchar2
)
is
--1标准参数定义-----------------------------------------------------------------------------
p_object_name constant varchar2(200) := SYS_PUBLIC.F_SYS_GET_OBJNAME()||'.scm_webcall_service.';
ls_step varchar2(100);

--2其它参数定义---------------------
env VARCHAR2(32767);
http_req utl_http.req;
http_resp utl_http.resp;
return_value xmltype;
error_value xmltype;
error_code VARCHAR(256);
error_string VARCHAR2(32767);

ls_result varchar2(32767);

--3游标定义-------------------------
begin
/*
1 参数校验
*/
ls_step := '1. 参数校验';
if nvl(as_paramType, '!@#') = '!@#' then
as_rmsg := '参数类型不能为空!';
goto ERRORPRM;
end if;

if nvl(as_paramValue, '!@#') = '!@#' then
as_rmsg := '参数值不能为空!';
goto ERRORPRM;
end if;

/*
2 执行webservice
*/
ls_step := '2. 执行webservice';

begin

--此处注意编码要与webservice的编码一致,否则报错
env := '<?xml version="1.0" encoding="GB2312"?>
<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>
<invoke xmlns="http://www.sinopharmsoft.com/ws">
<paramType>' || as_paramType || '</paramType>
<paramString>' || as_paramValue || '</paramString>
</invoke>
</soap:Body>
</soap:Envelope>
';
--172.15.2.23:9001,172.16.10.166:9009
http_req := utl_http.begin_request('http://172.16.10.166:9009/ids-cms-rtl/ws/rest/cmsrtlinptService?wsdl',
'POST',
'HTTP/1.0');
utl_http.set_header(http_req, 'Content-Type', 'text/xml;charset=gb2312');--此处注意编码要与webservice的编码一致,否则报错
--utl_http.set_header(http_req, 'Content-Type', 'text/xml;charset=utf-8');
utl_http.set_header(http_req, 'Content-Length', length(env));
utl_http.set_header(http_req, 'SOAPAction', '');
utl_http.write_text(http_req, env);

http_resp := utl_http.get_response(http_req);
utl_http.read_text(http_resp, env);
utl_http.end_response(http_resp);

return_value := xmltype.createxml(env)
.extract('/soap:Envelope/soap:Body/child::node()',
'xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"');
error_value := return_value.extract('/soap:Fault',
'xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"');

if (error_value is not null) THEN
error_string := error_value.extract('/soap:Fault/faultstring/child::text()',
'xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"')
.getstringval();
error_code := error_value.extract('/soap:Fault/faultcode/child::text()',
'xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"')
.getstringval();

raise_application_error(-20000,
'error in authentification: ' || error_string ||
' - ' || error_code);
end if;

ls_result := return_value.getStringVal();
ls_result := replace(ls_result, '&quot;', '"');
as_rmsg := ls_result;

exception
when utl_http.end_of_body then
utl_http.end_response(http_resp);
as_Rmsg := '执行webservice出错,'|| sqlerrm;
when others then
utl_http.end_response(http_resp);
utl_http.end_request(http_req);
as_Rmsg := '执行webservice出错,'|| sqlerrm;
goto ERRORPRM;
end;

------------------------------------------
<<endprm>>
if nvl(ai_rtd,1)<0 then
ai_rtd := 1;
end if;
ai_rtd := nvl(ai_rtd,1);
as_rmsg := p_object_name||'存储过程成功操作,webservice返回内容:'||ls_result||'!' ;
return ;
<<errorprm>>
rollback;
if nvl(ai_rtd,-1)>0 then
ai_rtd := -1;
end if;
ai_rtd := nvl(ai_rtd,-1);
as_rmsg := p_object_name||ls_step||':'||chr(13)||SYS_PUBLIC.F_SYS_GET_MESSPETEXT()||as_rmsg ;
return ;
------------------------------------------------------
exception
when others then
ai_rtd := -1;
as_rmsg := p_object_name||ls_step||':'||chr(13)||SYS_PUBLIC.F_SYS_GET_MESSPETEXT()||as_rmsg ||sqlerrm(sqlcode);
rollback;
return ;
end;

猜你喜欢

转载自www.cnblogs.com/ydjs/p/9145525.html