使用Oracle的utl_http曲线救国,调用webapi完成相关业务

最近涉及到系统改造,系统内一些存储过程不能再继续使用,改为供应商提供http接口,为了尽可能少改动系统,故利用oracle提供的utl_http包完成对供应商http的访问获取所需数据。

一、Oracle 创建ACL进行http请求

Oracle(11g及以上版本)进行http请求,需要先创建ACL权限(在管理员账号下创建)

begin
  dbms_network_acl_admin.create_acl (       -- 创建访问控制文件(ACL)
    acl         => 'utl_http.xml',          -- 文件名称
    description => 'HTTP Access',           -- 描述
    principal   => 'DBUSER',                -- 授权或者取消授权账号,大小写敏感
    is_grant    => TRUE,                    -- 授权还是取消授权
    privilege   => 'connect',               -- 授权或者取消授权的权限列表
    start_date  => NULL,                    -- 起始日期
    end_date    => NULL                     -- 结束日期
  );
 
  dbms_network_acl_admin.add_privilege (    -- 添加访问权限列表项
    acl        => 'utl_http.xml',           -- 刚才创建的acl名称 
    principal  => 'DBUSER',                 -- 授权或取消授权用户
    is_grant   => TRUE,                     -- 与上同 
    privilege  => 'resolve',                -- 权限列表 connect即可
    start_date => NULL,                     
    end_date   => NULL
  );
 
  dbms_network_acl_admin.assign_acl (       -- 该段命令意思是允许访问acl名为utl_http.xml下授权的用户,使用oracle网络访问包,所允许访问的目的主机,及其端口范围。
    acl        => 'utl_http.xml',
    host       => '10.78.236.127',          -- ip地址或者域名,填写
                                            -- 且建议使用ip地址或者使用域名,若用localhost,当oracle不是安装在本机上的情况下,会出现问题
    lower_port => 0,                        -- 允许访问的起始端口号
    upper_port => 30000                     -- 允许访问的截止端口号
  );
  commit;
end;

检查是否赋权成功,若查询到刚才操作的相关数据则表示赋权成功,即可使用utl_http包访问webapi了。

SELECT * FROM dba_network_acls
SELECT * FROM  dba_network_acl_privileges

二、利用UTL_HTTP包编写网络请求函数

GET

CREATE OR REPLACE FUNCTION HTTP_GET (v_url  VARCHAR2)
RETURN VARCHAR2
AS
BEGIN
  DECLARE
  req UTL_HTTP.REQ;
  resp UTL_HTTP.RESP;
  v_line VARCHAR2 ( 4000 );
  v_text VARCHAR2 ( 4000 );
  BEGIN
    v_text := '';
    BEGIN
      req := UTL_HTTP.BEGIN_REQUEST ( url => v_url, method => 'GET' );
      UTL_HTTP.SET_BODY_CHARSET('UTF-8');
      UTL_HTTP.SET_HEADER(req, 'Content-Type', 'application/x-www-form-urlencoded');
      resp := UTL_HTTP.GET_RESPONSE ( req );
      LOOP
      UTL_HTTP.READ_LINE ( resp, v_line, TRUE );
      v_text := v_text || v_line;
      END LOOP;
      UTL_HTTP.END_RESPONSE( resp );
      UTL_HTTP.END_REQUEST( req );
      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;
    return v_text;
  END;
END;

POST

CREATE OR REPLACE FUNCTION HTTP_POST (v_url  VARCHAR2, v_body  VARCHAR2, v_body_type VARCHAR2)
RETURN VARCHAR2
AS
BEGIN
	DECLARE
	req UTL_HTTP.REQ;
	resp UTL_HTTP.RESP;
	v_line VARCHAR2 ( 4000 );
	v_text VARCHAR2 ( 4000 );
	BEGIN
		v_text := '';
		BEGIN
			req := UTL_HTTP.BEGIN_REQUEST ( url => v_url, method => 'POST' );
			UTL_HTTP.SET_BODY_CHARSET('UTF-8');
			UTL_HTTP.SET_HEADER(req, 'Content-Type', v_body_type);
			utl_http.set_header(req, 'Content-Length',lengthb(v_body));
		  utl_http.write_text(req, v_body);
      resp := UTL_HTTP.GET_RESPONSE ( req );      
      LOOP
      UTL_HTTP.READ_LINE ( resp, v_line, TRUE );
      v_text := v_text || v_line;
      END LOOP;

      UTL_HTTP.END_RESPONSE( resp );
      UTL_HTTP.END_REQUEST( req );
      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;
    return v_text;
  END;
END;

三、编写RESTAPI测试

使用SpringBoot快速创建四个接口用于请求测试。

   @GetMapping("testGet")
    @ResponseBody
    public String testGet(){
        return "testGet";
    }

    @GetMapping("testGetParam")
    @ResponseBody
    public String testGetParam(HttpServletRequest request){
        String param = request.getParameter("aac001");
        log.info("aac001:"+param);
        return "testGetParam";
    }
    
    @PostMapping("testPost")
    @ResponseBody
    public String testPost(){
        return "testPost";
    }

    @PostMapping("testPostParam")
    @ResponseBody
    public String testPostParam(HttpServletRequest request){
        String aac001 = request.getParameter("aac001");
        String aab001 = request.getParameter("aab001");
        log.info("aac001:"+aac001);
        log.info("aab001:"+aab001);
        return "testPost";
    }

不带参数的GET请求
在这里插入图片描述
不带参数的POST请求
在这里插入图片描述
带参数的GET请求
在这里插入图片描述
带参数的POST请求
在这里插入图片描述
WEB后台打印的数据
在这里插入图片描述
至此,Oracle访问Web RESTAPI的过程结束。

参考链接:Oracle 使用UTL_HTTP发送http请求

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

再难也要坚持

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值