oracle发送HTTP请求

发送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对应的就是一个数据库的角色

在这里插入图片描述
在这里插入图片描述

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页