UTL_HTTP包让SQL和PLSQL能够调用超文本传输协议(HTTP),也就是说可以使用它在Internet上访问数据。
当包用HTTPS从Web site获取数据时,要使用Oracle Wallet,它是由Oracle Wallet Manager或者orapki utility创建。非HTTPS获取时,则不需要Oracle wallet。
参照
https://docs.oracle.com/cd/E11882_01/appdev.112/e40758/u_http.htm#ARPLS070
概述
操作步骤
函数、存储解析:
begin_request:开始一个HTTP请求,会和目标web server建立一个网络连接。
set_xxx:设置请求header
write_xxx:设置请求body 参数
get_response:获取响应的header
get_xxx:获取响应header
read_xxx:将响应内容转换成oracle识别的字符串等格式
end_request:在请求未完成时中断请求
示例代码
set serveroutput on
DECLARE
req UTL_HTTP.REQ;
resp UTL_HTTP.RESP;
value VARCHAR2(1000);
BEGIN
--UTL_HTTP.SET_PROXY('proxy.my-company.com', 'corp.my-company.com');
-- 1、开始放送请求
req := UTL_HTTP.BEGIN_REQUEST('http://192.168.12.55:8080/ords/test/ttest/');
-- 2、设置请求header
UTL_HTTP.SET_HEADER(req, 'User-Agent', 'Mozilla/4.0');
-- 3、设置请求body
-- 4、接收请求返回的响应
resp := UTL_HTTP.GET_RESPONSE(req);
-- 5、获取响应header
-- 6、转换响应格式为字符串
LOOP
UTL_HTTP.READ_LINE(resp, value, TRUE);
DBMS_OUTPUT.PUT_LINE(value);
END LOOP;
-- 7、结束响应 整个请求结束
UTL_HTTP.END_RESPONSE(resp);
EXCEPTION
WHEN UTL_HTTP.END_OF_BODY THEN
UTL_HTTP.END_RESPONSE(resp);
END;
示例集合
参照
https://www.cnblogs.com/zjw-blog/p/14060723.html
get请求
set serveroutput on
DECLARE
req UTL_HTTP.REQ;
resp UTL_HTTP.RESP;
value VARCHAR2(10000);
BEGIN
-- 1、开始放送请求
req := UTL_HTTP.BEGIN_REQUEST('http://192.168.12.51:8081/user/save?name=ccc'||'&'||'age=15');
-- 2、设置请求header
-- 3、设置请求body
-- 4、接收请求返回的响应
resp := UTL_HTTP.GET_RESPONSE(req);
-- 5、获取响应header
-- 6、转换响应格式为字符串
LOOP
UTL_HTTP.READ_LINE(resp, value, TRUE);
DBMS_OUTPUT.PUT_LINE(value);
END LOOP;
-- 7、结束响应 整个请求结束
UTL_HTTP.END_RESPONSE(resp);
EXCEPTION
WHEN UTL_HTTP.END_OF_BODY THEN
UTL_HTTP.END_RESPONSE(resp);
END;
执行效果,如下所示
post请求
DECLARE
req UTL_HTTP.REQ;
resp UTL_HTTP.RESP;
value VARCHAR2(10000);
BEGIN
-- 1、开始放送请求
req := UTL_HTTP.BEGIN_REQUEST('http://192.168.12.51:8081/user/save','POST');
-- 2、设置请求header
UTL_HTTP.SET_BODY_CHARSET('UTF-8');
UTL_HTTP.SET_HEADER(req, 'Content-Type', 'application/x-www-form-urlencoded');
UTL_HTTP.SET_HEADER(req, 'Content-Length',lengthb('name=ccc'||'&'||'age=15'));
-- 3、设置请求body
UTL_HTTP.WRITE_TEXT(req,'name=ccc'||'&'||'age=15');
-- 4、接收请求返回的响应
resp := UTL_HTTP.GET_RESPONSE(req);
-- 5、获取响应header
-- 6、转换响应格式为字符串
LOOP
UTL_HTTP.READ_LINE(resp, value, TRUE);
DBMS_OUTPUT.PUT_LINE(value);
END LOOP;
-- 7、结束响应 整个请求结束
UTL_HTTP.END_RESPONSE(resp);
EXCEPTION
WHEN UTL_HTTP.END_OF_BODY THEN
UTL_HTTP.END_RESPONSE(resp);
END;
执行效果,如下所示