发送http请求这个需求大多数存在于发邮件这个功能中,这里就简单介绍如何用oralce发送http请求。
一.基础配置
我们首先要明白,完成发邮件,是基于oracle的acl,UTL_HTTP和站点的webapi。
下面展示oracle的acl配置方法
。
--sysdba用户执行如下命令
--创建访问控制文件(ACL)
begin
dbms_network_acl_admin.create_acl (
acl => 'UTL_HTTP.xml',
description => 'utl_http',
principal => 'YZ_SQJW', -- 授权或者取消授权账号,大小写敏感
is_grant => TRUE,
privilege => 'resolve'
);
commit;
end;
/
--添加访问权限列表项
begin
dbms_network_acl_admin.add_privilege (
acl => 'UTL_HTTP.xml',
principal => 'YZ_SQJW',
is_grant => TRUE,
privilege => 'connect'
);
commit;
end;
/
--配置对应ip地址
begin
dbms_network_acl_admin.assign_acl(
acl => 'UTL_HTTP.xml',
host => '172.10.4.12' -- ip地址或者域名,建议使用ip地址或者使用域名,若用localhost,当oracle不是安装在本机上的情况下,会出现问题
);
commit;
end;
/
BEGIN
DBMS_NETWORK_ACL_ADMIN.create_acl (
acl => 'open_acl_file.xml',
description => 'Open ACL File',
principal => '用ACL的用户',
is_grant => TRUE,
privilege => 'connect',
start_date => SYSTIMESTAMP,
end_date => NULL);
DBMS_NETWORK_ACL_ADMIN.assign_acl (
acl => 'open_acl_file.xml',
host => '*', --所有host,权限比较高
lower_port => 1, --端口号从1-9999
upper_port => 9999);
COMMIT;
END;
二.存储过程开发
先是发邮件的存储过程
下面展示一些 内联代码片
。
create or replace PROCEDURE PRO_POSTREQ(EMAIL in varchar2,SUBJECT in varchar2,v_content in varchar2 ) IS
req UTL_HTTP.REQ;
resp UTL_HTTP.RESP;
v_message varchar2(10000);
xmlstr varchar2(30000);
begin
begin
req := UTL_HTTP.BEGIN_REQUEST('http://XXX.XXX.XXX.XXX./API/SendEmail?Email='||EMAIL||'&&Subject='||SUBJECT||'&&Body='||utl_url.escape(v_content,true,'UTF8'), method => 'POST');--使用post方法发邮件,注意utl_url.escape这个的目的在于序列化字符串,因为body有可能是html
utl_http.set_header(req, 'Content-Type', 'text/html; charset=utf-8');
utl_http.write_text(req,xmlstr); --通过body发送消息
xmlstr:=utl_url.escape(v_content,true,'UTF8');
utl_http.set_header(req, 'Content-Length',lengthb(xmlstr));
utl_http.write_text(req,xmlstr);
resp := UTL_HTTP.GET_RESPONSE(req);
LOOP
UTL_HTTP.read_line(resp,v_message, TRUE);
dbms_output.put_line(v_message);
END LOOP;
utl_http.end_request(req);
utl_http.end_response(resp);
EXCEPTION
WHEN utl_http.end_of_body THEN
utl_http.end_response(resp);
WHEN OTHERS THEN
utl_http.end_response(resp);
utl_http.end_request(req);
end;
END PRO_POSTREQ;
这里有个注意的地方,每个xml对应的就是一个数据库的角色