Oracle11g_发起http请求
之前在项目中使用到了在oracle中发起http请求调用后台接口,这里简单记录下。
我们主要是使用了oracle自带的工具包:utl_http
还有个重要的就是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