Oracle11g_发起http请求

之前在项目中使用到了在oracle中发起http请求调用后台接口,这里简单记录下。
我们主要是使用了oracle自带的工具包:utl_http
Oracle11g_发起http请求_第1张图片
还有个重要的就是acl网络权限问题,之前在记录发邮件的时候写到过如果创建acl权限,这里就不重复了。
实际在项目中,我是创建了一个oracle函数来使用的且发起的是GET请求,其中有些参数注释了,是关于blob数据格式、clob转blob、涉及临时表的post内容(项目其它地方使用,这里我就不删了)。

function getToServlet(xx  in varchar2,
                         xx in varchar2) return varchar2 is
    req utl_http.req; --请求
    rsp utl_http.resp; --响应
    --req_blob blob; --请求blob格式数据
    --rsp_blob blob; --响应blob格式数据
    --postdata varchar2(2000);
    v_value VARCHAR2(100);
    v_back  varchar2(100);
    vurl    varchar2(200);
  begin
    v_back := '';
    vurl   := '接口地址' 
    --构造供应商的json格式数据(没使用)
    --postdata := getJsonStr(xx);
  
    --发起请求
    req := utl_http.begin_request(vurl, 'GET', utl_http.HTTP_VERSION_1_1);
  
    --设置编码
    utl_http.set_body_charset(req, 'utf-8');
  
    --设置请求头
    utl_http.set_header(req,
                        'Content-Type',
                        'application/x-www-form-urlencoded');
    --在用户的临时表空间中,建立请求临时LOB且读取到缓冲区
    --dbms_lob.createtemporary(req_blob, true);
  
    --转换为二进制大数据
    --clob2blob(to_clob(postdata), req_blob, 'UTF8', 'UTF8');
  
    --设置post报文长度
    --utl_http.set_header(req,'Content-Length',dbms_lob.getlength(req_blob));
  
    --utl_http.Write_raw(req, req_blob);
  
    --获取响应
    rsp := utl_http.get_response(req);
  
    --处理错误
    if (rsp.status_code <> utl_http.HTTP_OK) then
      utl_http.end_response(rsp);
      v_back := 'false';
      raise_application_error(-20021, '有错误:' || rsp.reason_phrase);
    end if;
  
    --在用户的临时表空间中,建立响应临时LOB且读取到缓冲区
    --dbms_lob.createtemporary(rsp_blob, true);
  
    --处理返回数据
    BEGIN
      LOOP
        utl_http.read_text(rsp, v_value);
        --dbms_lob.writeappend(rsp_blob, length(v_value), v_value);
        v_back := v_back || v_value;
      END LOOP;
      UTL_HTTP.END_RESPONSE(rsp);
      UTL_HTTP.END_REQUEST(req);
    
    EXCEPTION
      WHEN UTL_HTTP.END_OF_BODY THEN
        utl_http.end_response(r => rsp);
      WHEN OTHERS THEN
        utl_http.end_response(r => rsp);
        UTL_HTTP.END_REQUEST(req);
        raise;
        null;
    END;
    dbms_output.put_line(v_back);
    return v_back;
  end;

以上只是个参考,可根据实际情况修改就Ok

你可能感兴趣的:(sql)