美文网首页
oracle使用utl_http包来发送post请求

oracle使用utl_http包来发送post请求

作者: 清_晨_ | 来源:发表于2019-02-03 08:13 被阅读49次

    在oracle中使用utl_http来发送post请求的时候,刚开始由于LENGTHB()设置的不合适,在网上搜索了好长时间,才解决了这个问题,记录一下。
    整个过程如下,其中v_content 入参为要传送的json串

    create or replace   procedure sendhttp(v_content in varchar2) is
     req       utl_http.req;
     resp      utl_http.resp;
     v_return  varchar2(4000); -- 存放返回值
     v_pk      varchar2(32); -- 存放主键列
     v_tradeno varchar2(4); -- 存放交易号
     v_idno    varchar2(18); -- 存放身份证号码
     v_err_msg varchar2(2048); -- 存放异常信息
    begin
     begin
       req := utl_http.begin_request(url    => 'http://127.0.0.1:8080/fyinterface/api/invoke',
                                     method => 'POST');
       utl_http.set_body_charset('utf-8');
       utl_http.set_header(req, 'Content-Type', 'text/html;charset=utf-8');
       utl_http.set_header(req,
                           'Content-Length',
                           lengthb(v_content));               
      -- utl_http.write_raw(req,UTL_RAW.cast_to_raw(v_content));
       utl_http.write_text(req, v_content);
       resp := utl_http.get_response(req);
       loop
         utl_http.read_line(resp, v_return, true);
         if v_return is not null then
           exit;
         end if;
       end loop;
       utl_http.end_response(resp);
       -- 获取身份证号码
       v_idno := json_ext.get_string(json_ext.get_json(json(v_content), 'body'),
                                     'idNo');
       -- 获取交易号
       v_tradeno := json_ext.get_string(json_ext.get_json(json(v_content),
                                                          'head'),
                                        'code');
       -- 获取主键
       v_pk := json_ext.get_string(json_ext.get_json(json(v_content), 'body'),
                                   'cId');
    
       -- 记录日志
       insert into tb_send_log
         (send_date, send_content, return_content, success, tradeno, idno, pk)
       values
         (sysdate, v_content, v_return, '1', v_tradeno, v_idno, v_pk);
       commit;
     exception
       when others then
        --- v_err_msg :=SUBSTR(SQLERRM, 1, 512);
         utl_http.end_response(resp);
         v_err_msg := sqlerrm;
    
         -- 获取身份证号码
         v_idno := json_ext.get_string(json_ext.get_json(json(v_content),
                                                         'body'),
                                       'idNo');
         -- 获取交易号
         v_tradeno := json_ext.get_string(json_ext.get_json(json(v_content),
                                                            'head'),
                                          'code');
         -- 获取主键
         v_pk      := json_ext.get_string(json_ext.get_json(json(v_content),
                                                            'body'),
                                          'cId');
         ---v_err_msg :=SUBSTR(SQLERRM, 1, 512);
         -- 记录日志
         insert into tb_send_log
           (send_date,
            send_content,
            return_content,
            success,
            tradeno,
            idno,
            pk)
         values
           (sysdate, v_content, v_err_msg, '0', v_tradeno, v_idno, v_pk);
           
         commit;
     end;
     commit;
    end sendhttp;
    
    

    ps:我是利用springboot在本地写了一个接口,放在tomcat启动之后,在oracle中将业务表中的相关数据取到之后,通过utl_http将报文请求发送到自己搭建的接口上,而后通过接口将相关业务数据又插入到另外一张表中,顺便来练习一下oracle中utl_http的使用。

    相关文章

      网友评论

          本文标题:oracle使用utl_http包来发送post请求

          本文链接:https://www.haomeiwen.com/subject/brqysqtx.html