【Oracle】调用HTTP接口

Oracle调用http接口

前情提要

公司唯有oracle被允许访问内外网,因此在oracle中发起HTTP请求。

1.创建HTTP请求函数

sql 复制代码
CREATE OR REPLACE FUNCTION HTTP_REQUEST(
  v_url  VARCHAR2,--請求地址
  v_param  VARCHAR2,--POST請求參數-->>'muser=32323&&passwd=232323';GET拼接URL
  v_type  varchar2--類型
  )return varchar2 is
  --GET--
   req UTL_HTTP.REQ;
   resp UTL_HTTP.RESP;
   v_line VARCHAR2 ( 4000 );
 v_text VARCHAR2 ( 4000 );
  v_param_length NUMBER ;
 --post--
 begin
     IF V_TYPE='GET' THEN  
           v_text := '';
           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/json');
           resp := UTL_HTTP.GET_RESPONSE ( req );
           UTL_HTTP.READ_LINE ( resp, v_line, TRUE );
           v_text := v_text || v_line;
           UTL_HTTP.END_RESPONSE( resp );  
         
     ELSE
           v_param_length  := LENGTHB(v_param);
           req := UTL_HTTP.BEGIN_REQUEST (url=> v_url, method => 'POST');
 
           UTL_HTTP.SET_BODY_CHARSET('UTF-8');
           UTL_HTTP.SET_HEADER (r      =>  req,
                                name   =>  'Content-Type',
                                VALUE  =>  'application/json');
           UTL_HTTP.SET_HEADER (r      =>   req,
                                name   =>   'Content-Length',
                                VALUE  =>   v_param_length);
           UTL_HTTP.WRITE_RAW (r    => req,
                               data => UTL_RAW.CAST_TO_RAW(v_param)); 
                               resp := UTL_HTTP.GET_RESPONSE(req);
           UTL_HTTP.READ_LINE(resp, v_text, TRUE);
           UTL_HTTP.END_RESPONSE(resp);
     END IF;
     return v_text;
 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;

2.创建ACL并授予权限

sql 复制代码
-- 验证数据库用户是否存在
SELECT username FROM dba_users WHERE username = 'WXGZH';

-- 如果用户不存在,创建用户
BEGIN
  EXECUTE IMMEDIATE 'CREATE USER wxgzh IDENTIFIED BY password'; -- 替换 password 为实际密码
  EXECUTE IMMEDIATE 'GRANT CONNECT TO wxgzh';
END;

-- 创建 ACL 并授予权限
BEGIN
  DBMS_NETWORK_ACL_ADMIN.CREATE_ACL(
    acl         => 'http_request_acl.xml',
    description => 'Allow HTTP requests',
    principal   => 'WXGZH', -- 确保使用正确的大小写
    is_grant    => TRUE,
    privilege   => 'connect'
  );

  DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL(
    acl         => 'http_request_acl.xml',
    host        => '192.168.0.19',
    lower_port  => 18882,
    upper_port  => 18882
  );
END;

-- 提交更改
COMMIT;

-- 验证 ACL 配置
SELECT acl, principal, privilege, is_grant
FROM dba_network_acl_privileges
WHERE principal = 'WXGZH'; -- 确保使用正确的大小写

3.测试HTTP请求函数

sql 复制代码
-- 测试 HTTP 请求函数
SELECT HTTP_REQUEST('http://192.168.0.1:8080/commonMsg/pushMsg?id=2', '{}', 'POST') AS data FROM dual;

其他操作

sql 复制代码
-- 查询ACL的权限
-- 字段说明 ACL-文件所在位置,principal-拥有权限的用户名,privilege-拥有的权限
SELECT * FROM dba_network_acl_privileges

-- 查询ACL开放的ip端口权限
SELECT * FROM DBA_NETWORK_ACLS


-- 追加ip
BEGIN
DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL(
    acl         => 'http_request_acl.xml',
    host        => '127.0.0.1',
    lower_port  => 8080,
    upper_port  => 8080
);
END;
COMMIT;

一点建议

在oracle中发起http请求对oracle压力比较大,建议不要将完整报文都丢给oracle进行调用。

建议的方式是,请求报文在某个地方存储起来,然后入参就传递一个ID。接收方通过ID进行查询完整的报文。

参考文档

链接: 一篇文章带你了解Oracle 11G 中的访问控制列表 (ACL)

相关推荐
ClickHouseDB9 小时前
ClickHouse Cloud 与 Snowflake 实时性价比对比:CostBench 测试中的 412 倍差距来
运维·数据库·系统架构
m0_639906949 小时前
Redis入门|五种数据结构、使用场景、持久化RDB&AOF
数据结构·数据库·redis
情 九9 小时前
MCP 实战 06:把 HTTP 接口接成工具,让 AI 帮你查数据
人工智能·网络协议·http·mcp
时间售卖铺10 小时前
触发器与函数实战:MySQL高效编程秘诀
运维·数据库·mysql·云原生
qetfw10 小时前
UOS MariaDB 数据库:安装、最小权限与备份验证
linux·数据库·mariadb·uos
数智园区合作社11 小时前
问数平台怎么把同一个指标锁成一个数
大数据·数据库·人工智能·ai
lbb 小魔仙12 小时前
Windows搭建PaddleOCR+飞书Webhook自动打卡通知机器人:识别、推送与远程触发完整教程
数据库·人工智能·prometheus·时序数据库
captain37613 小时前
MyBatis操作数据库(入门2)
java·数据库·spring boot·后端·spring·mybatis
心中有你021413 小时前
Java实现Dijkstra最短路径算法(邻接表 + 优先队列)
java·数据库·算法
龙亘川13 小时前
综合素质评价业务建模:从过程性评价到成长档案全链路闭环
数据库·智慧城市·数据可视化