• 【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;
    

    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'; -- 确保使用正确的大小写
    

    3.测试HTTP请求函数

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

    其他操作

    -- 查询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)

  • 相关阅读:
    Spring学习笔记
    数组(数据结构)
    MOTOROLA MVME5500 电源模块
    Python之线性数据结构
    Jmeter二次开发实现rsa加密
    【NGINX】同时支持ws请求和http请求
    面试突击72:输入URL之后会执行什么流程?
    Dubbo+Zookeeper远程调用服务
    elasticsearch(es)的安装-macOs
    Azure Devops上模版化K8s部署
  • 原文地址:https://blog.csdn.net/Passer_hua/article/details/139815502