当前位置:   article > 正文

【Oracle】调用HTTP接口

【Oracle】调用HTTP接口

前情提要

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

1.创建HTTP请求函数

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;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48

2.创建ACL并授予权限

-- 验证数据库用户是否存在
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'; -- 确保使用正确的大小写
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

3.测试HTTP请求函数

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

其他操作

-- 查询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;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

一点建议

在oracle中发起http请求对oracle压力比较大,建议不要将完整报文都丢给oracle进行调用。
建议的方式是,请求报文在某个地方存储起来,然后入参就传递一个ID。接收方通过ID进行查询完整的报文。

参考文档

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/764157
推荐阅读
相关标签
  

闽ICP备14008679号