【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)

相关推荐
倔强的石头_11 小时前
KingbaseES 新版MySQL 兼容版体验:旧版迁移 + 功能实测
数据库
倔强的石头_3 天前
《Kingbase护城河》——数据库存储空间全景探测与精细化瘦身实战
数据库
冬奇Lab4 天前
每日一个开源项目(第134篇):Zvec - 阿里开源的嵌入式向量数据库,向量搜索界的 SQLite
数据库·人工智能·llm
霜落长河4 天前
抛弃TCP改用UDP,HTTP3怎么了?
http
ClouGence4 天前
Oracle CDC 架构优化:从主库直连到 DataGuard 备库同步
数据库·后端·oracle
无响应de神4 天前
三、用户与权限管理
数据库·mysql
麦聪聊数据5 天前
数据服务化时代:企业数据能力输出的核心路径
数据库
shushangyun_5 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
DARLING Zero two♡5 天前
【MySQL数据库】数据类型与表约束
数据库·mysql
之歆5 天前
现代 HTTP 客户端深度解析:Fetch 与 Axios
chrome·网络协议·http