oracle使用utl_http包来发送post请求

2019-02-03  本文已影响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的使用。

上一篇下一篇

猜你喜欢

热点阅读