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进行查询完整的报文。