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;


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章