Oracle调用http接口
- 前情提要
- 1.创建HTTP请求函数
- 2.创建ACL并授予权限
- 3.测试HTTP请求函数
- 一点建议
前情提要
公司唯有oracle被允许访问内外网,因此在oracle中发起HTTP请求。
1.创建HTTP请求函数
CREATE OR REPLACE FUNCTION HTTP_REQUEST(v_url VARCHAR2,--請求地址v_param VARCHAR2,--POST請求參數-->>'muser=32323&&passwd=232323';GET拼接URLv_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--beginIF 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 ); ELSEv_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;EXCEPTIONWHEN UTL_HTTP.END_OF_BODY THENUTL_HTTP.END_RESPONSE ( resp );WHEN OTHERS THENUTL_HTTP.END_RESPONSE(resp);UTL_HTTP.END_REQUEST(req);end;
2.创建ACL并授予权限
-- 验证数据库用户是否存在
SELECT username FROM dba_users WHERE username = 'WXGZH';-- 如果用户不存在,创建用户
BEGINEXECUTE IMMEDIATE 'CREATE USER wxgzh IDENTIFIED BY password'; -- 替换 password 为实际密码EXECUTE IMMEDIATE 'GRANT CONNECT TO wxgzh';
END;-- 创建 ACL 并授予权限
BEGINDBMS_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;
一点建议
在oracle中发起http请求对oracle压力比较大,建议不要将完整报文都丢给oracle进行调用。
建议的方式是,请求报文在某个地方存储起来,然后入参就传递一个ID。接收方通过ID进行查询完整的报文。