在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的使用。
网友评论