参照
https://docs.oracle.com/cd/E11882_01/appdev.112/e40758/u_http.htm#i1025869
https://docs.oracle.com/cd/E11882_01/network.112/e40393/asowalet.htm#ASOAG160
https://docs.oracle.com/cd/E11882_01/appdev.112/e40758/d_networkacl_adm.htm#ARPLS148
https://docs.oracle.com/cd/E11882_01/network.112/e36292/authorization.htm#DBSEG99980
版本:oracle 11.2.0.4.0
注意:服务器要发送外网http/https请求,配置其ip地址时,一定要配置dns。
配置wallet
要访问https接口,需要启用wallet。
下载证书
浏览器输入如上地址,下载证书。
上传至服务器
创建wallet
登录oracle数据库服务器,使用Oracle Wallet Manager新建wallet。
注意:linux系统Oracle Wallet Manager启动命令为owm,完整路径为:
$ORACLE_HOME/bin即/u01/app/oracle/product/11.2.0/dbhome_1/bin。owm需要启动图形界面,所以要使用图形类远程工具,本文中使用XQuartz
ssh -Y oracle@192.168.12.55
输入命令owm,启动Oracle Wallet Manager
会弹出一个提示框提示:默认wallet目录不存在,是否创建
创建即可。然后弹出新建wallet对话框,创建密码。walletpassword123
输入密码后,点击【OK】,提示是否现在就希望创建一个证书请求。选择【No】
点击保存按钮,保存wallet文件至默认位置即可
默认路径为:/u01/app/oracle/product/11.2.0/dbhome_1/owm/wallets/oracle
将之前下载的证书上传至服务器,然后导入信任证书。
导入信任证书
使用mac终端(终端会调用XQuartz,生成图形界面)连接oracle linux服务器,二者LANG都是zh_CN.UTF-8。owm图形界面显示乱码。关闭owm图形界面,直接在终端中输入命令设置LANG,export LANG=en_US.UTF-8,再次输入owm显示图形界面则正常。
保存后,将新生成的文件ewallet.p12
由/u01/app/oracle/product/11.2.0/dbhome_1/owm/wallets/oracle中复制到
/u01/app/oracle/wallet,覆盖原先的 ewallet.p12,用于发送https请求时,设置上下文。
发送请求
oracle发送https请求与发送http请求没有本质的不同,只是需要在发送前在请求上下文中加入wallet信息。
简单示例
存储过程
set serveroutput on
declare
request_context UTL_HTTP.REQUEST_CONTEXT_KEY;
req UTL_HTTP.REQ;
resp UTL_HTTP.RESP;
data VARCHAR2(10240);
BEGIN
request_context := UTL_HTTP.CREATE_REQUEST_CONTEXT(
wallet_path => 'file:/u01/app/oracle/wallet',
wallet_password => 'walletpassword123'
--enable_cookies => TRUE,
--max_cookies => 300,
--max_cookies_per_site => 20
);
req := UTL_HTTP.BEGIN_REQUEST(url => 'https://www.example.org',method => 'GET',request_context => request_context);
resp := UTL_HTTP.GET_RESPONSE(req);
BEGIN
LOOP
UTL_HTTP.READ_LINE(resp, data);
DBMS_OUTPUT.PUT_LINE(data);
-- DBMS_OUTPUT.PUT_LINE(instr(data,'access_token'));
END LOOP;
EXCEPTION
WHEN UTL_HTTP.END_OF_BODY THEN
UTL_HTTP.END_RESPONSE(resp);
END;
-- Destroy the request context
UTL_HTTP.DESTROY_REQUEST_CONTEXT(request_context);
END;
效果截图