Oracle 通过UTL_HTTP包发送http请求调用webapi
1、利用ORACLE中UTL_HTTP包提供的BEGIN_REQUEST方法发起请求。
CREATE OR REPLACE PROCEDURE P_DT_gettoken(v_corpid in varchar2,v_corpsecret in varchar2 ) IS
req UTL_HTTP.REQ;
resp UTL_HTTP.RESP;
v_text varchar2(10000);
xmlstr varchar2(30000);
errmsg varchar2(100);
url varchar2(100);
access_token varchar2(100);
begin
--正常情况下access_token有效期为7200秒,有效期内重复获取返回相同结果,并自动续期。
begin
select F_DT_URL() into url from dual;
req := UTL_HTTP.BEGIN_REQUEST(url || '/api/DingTalk/gettoken?corpid='|| v_corpid || '&' || 'corpsecret='|| v_corpsecret );
utl_http.set_header(req, 'Content-Type', 'text/html; charset=utf-8');
utl_http.write_text(req,xmlstr); --通过body发送消息;
resp := UTL_HTTP.GET_RESPONSE(req);
LOOP
UTL_HTTP.read_line(resp,v_text, TRUE);
--获取返回json中errmsg的值 {"expires_in":7200,"errmsg":"ok","access_token":"76a94aff8a4c3d","errcode":0}
select parsejson(v_text,'errmsg') into errmsg from dual;
--dbms_output.put_line(errmsg);
IF errmsg = 'ok' THEN
select parsejson(v_text,'access_token') into access_token from dual;
delete DT_INFO;
insert into DT_INFO (errmsg,access_token) values (errmsg,access_token);
ELSE
delete DT_INFO;
insert into DT_INFO (errmsg) values (errmsg);
END IF;
END LOOP;
utl_http.end_request(req);
utl_http.end_response(resp);
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;
END P_DT_gettoken;
2、Oracle中JSON处理函数
CREATE OR REPLACE TYPE ty_row_str_split as object (strValue VARCHAR2 (4000));
CREATE OR REPLACE TYPE ty_tbl_str_split IS TABLE OF ty_row_str_split;
CREATE OR REPLACE FUNCTION fn_split(p_str IN VARCHAR2,
p_delimiter IN VARCHAR2)
RETURN ty_tbl_str_split IS
j INT := 0;
i INT := 1;
len INT := 0;
len1 INT := 0;
str VARCHAR2(4000);
str_split ty_tbl_str_split := ty_tbl_str_split();
BEGIN
len := LENGTH(p_str);
len1 := LENGTH(p_delimiter);
WHILE j < len LOOP
j := INSTR(p_str, p_delimiter, i);
IF j = 0 THEN
j := len;
str := SUBSTR(p_str, i);
str_split.EXTEND;
str_split(str_split.COUNT) := ty_row_str_split(strValue => str);
IF i >= len THEN
EXIT;
END IF;
ELSE
str := SUBSTR(p_str, i, j - i);
i := j + len1;
str_split.EXTEND;
str_split(str_split.COUNT) := ty_row_str_split(strValue => str);
END IF;
END LOOP;
RETURN str_split;
END fn_split;
CREATE OR REPLACE FUNCTION parsejson(p_jsonstr varchar2,p_key varchar2) RETURN VARCHAR2
IS
rtnVal VARCHAR2(1000);
i NUMBER(2);
jsonkey VARCHAR2(500);
jsonvalue VARCHAR2(1000);
json VARCHAR2(3000);
BEGIN
IF p_jsonstr IS NOT NULL THEN
json := REPLACE(p_jsonstr,'{','') ;
json := REPLACE(json,'}','') ;
json := replace(json,'"','') ;
FOR temprow IN(SELECT strvalue AS VALUE FROM TABLE(fn_split(json, ','))) LOOP
IF temprow.VALUE IS NOT NULL THEN
i := 0;
jsonkey := '';
jsonvalue := '';
FOR tem2 IN(SELECT strvalue AS VALUE FROM TABLE(fn_split(temprow.value, ':'))) LOOP
IF i = 0 THEN
jsonkey := tem2.VALUE;
END IF;
IF i = 1 THEN
jsonvalue := tem2.VALUE;
END IF;
i := i + 1;
END LOOP;
IF(jsonkey = p_key) THEN
rtnVal := jsonvalue;
END if;
END IF;
END LOOP;
END IF;
RETURN rtnVal;
END parsejson;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通