IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 使用Oracle的utl_http曲线救国,调用webapi完成相关业务 -> 正文阅读

[网络协议]使用Oracle的utl_http曲线救国,调用webapi完成相关业务

最近涉及到系统改造,系统内一些存储过程不能再继续使用,改为供应商提供http接口,为了尽可能少改动系统,故利用oracle提供的utl_http包完成对供应商http的访问获取所需数据。

一、Oracle 创建ACL进行http请求

Oracle(11g及以上版本)进行http请求,需要先创建ACL权限(在管理员账号下创建)

begin
  dbms_network_acl_admin.create_acl (       -- 创建访问控制文件(ACL)
    acl         => 'utl_http.xml',          -- 文件名称
    description => 'HTTP Access',           -- 描述
    principal   => 'DBUSER',                -- 授权或者取消授权账号,大小写敏感
    is_grant    => TRUE,                    -- 授权还是取消授权
    privilege   => 'connect',               -- 授权或者取消授权的权限列表
    start_date  => NULL,                    -- 起始日期
    end_date    => NULL                     -- 结束日期
  );
 
  dbms_network_acl_admin.add_privilege (    -- 添加访问权限列表项
    acl        => 'utl_http.xml',           -- 刚才创建的acl名称 
    principal  => 'DBUSER',                 -- 授权或取消授权用户
    is_grant   => TRUE,                     -- 与上同 
    privilege  => 'resolve',                -- 权限列表 connect即可
    start_date => NULL,                     
    end_date   => NULL
  );
 
  dbms_network_acl_admin.assign_acl (       -- 该段命令意思是允许访问acl名为utl_http.xml下授权的用户,使用oracle网络访问包,所允许访问的目的主机,及其端口范围。
    acl        => 'utl_http.xml',
    host       => '10.78.236.127',          -- ip地址或者域名,填写
                                            -- 且建议使用ip地址或者使用域名,若用localhost,当oracle不是安装在本机上的情况下,会出现问题
    lower_port => 0,                        -- 允许访问的起始端口号
    upper_port => 30000                     -- 允许访问的截止端口号
  );
  commit;
end;

检查是否赋权成功,若查询到刚才操作的相关数据则表示赋权成功,即可使用utl_http包访问webapi了。

SELECT * FROM dba_network_acls
SELECT * FROM  dba_network_acl_privileges

二、利用UTL_HTTP包编写网络请求函数

GET

CREATE OR REPLACE FUNCTION HTTP_GET (v_url  VARCHAR2)
RETURN VARCHAR2
AS
BEGIN
  DECLARE
  req UTL_HTTP.REQ;
  resp UTL_HTTP.RESP;
  v_line VARCHAR2 ( 4000 );
  v_text VARCHAR2 ( 4000 );
  BEGIN
    v_text := '';
    BEGIN
      req := UTL_HTTP.BEGIN_REQUEST ( url => v_url, method => 'GET' );
      UTL_HTTP.SET_BODY_CHARSET('UTF-8');
      UTL_HTTP.SET_HEADER(req, 'Content-Type', 'application/x-www-form-urlencoded');
      resp := UTL_HTTP.GET_RESPONSE ( req );
      LOOP
      UTL_HTTP.READ_LINE ( resp, v_line, TRUE );
      v_text := v_text || v_line;
      END LOOP;
      UTL_HTTP.END_RESPONSE( resp );
      UTL_HTTP.END_REQUEST( req );
      EXCEPTION
        WHEN UTL_HTTP.END_OF_BODY THEN
        UTL_HTTP.END_RESPONSE ( resp );
        WHEN OTHERS THEN
        UTL_HTTP.END_RESPONSE(resp);
        UTL_HTTP.END_REQUEST(req);
    END;
    return v_text;
  END;
END;

POST

CREATE OR REPLACE FUNCTION HTTP_POST (v_url  VARCHAR2, v_body  VARCHAR2, v_body_type VARCHAR2)
RETURN VARCHAR2
AS
BEGIN
	DECLARE
	req UTL_HTTP.REQ;
	resp UTL_HTTP.RESP;
	v_line VARCHAR2 ( 4000 );
	v_text VARCHAR2 ( 4000 );
	BEGIN
		v_text := '';
		BEGIN
			req := UTL_HTTP.BEGIN_REQUEST ( url => v_url, method => 'POST' );
			UTL_HTTP.SET_BODY_CHARSET('UTF-8');
			UTL_HTTP.SET_HEADER(req, 'Content-Type', v_body_type);
			utl_http.set_header(req, 'Content-Length',lengthb(v_body));
		  utl_http.write_text(req, v_body);
      resp := UTL_HTTP.GET_RESPONSE ( req );      
      LOOP
      UTL_HTTP.READ_LINE ( resp, v_line, TRUE );
      v_text := v_text || v_line;
      END LOOP;

      UTL_HTTP.END_RESPONSE( resp );
      UTL_HTTP.END_REQUEST( req );
      EXCEPTION
        WHEN UTL_HTTP.END_OF_BODY THEN
        UTL_HTTP.END_RESPONSE ( resp );
        WHEN OTHERS THEN
        UTL_HTTP.END_RESPONSE(resp);
        UTL_HTTP.END_REQUEST(req);
    END;
    return v_text;
  END;
END;

三、编写RESTAPI测试

使用SpringBoot快速创建四个接口用于请求测试。

   @GetMapping("testGet")
    @ResponseBody
    public String testGet(){
        return "testGet";
    }

    @GetMapping("testGetParam")
    @ResponseBody
    public String testGetParam(HttpServletRequest request){
        String param = request.getParameter("aac001");
        log.info("aac001:"+param);
        return "testGetParam";
    }
    
    @PostMapping("testPost")
    @ResponseBody
    public String testPost(){
        return "testPost";
    }

    @PostMapping("testPostParam")
    @ResponseBody
    public String testPostParam(HttpServletRequest request){
        String aac001 = request.getParameter("aac001");
        String aab001 = request.getParameter("aab001");
        log.info("aac001:"+aac001);
        log.info("aab001:"+aab001);
        return "testPost";
    }

不带参数的GET请求
在这里插入图片描述
不带参数的POST请求
在这里插入图片描述
带参数的GET请求
在这里插入图片描述
带参数的POST请求
在这里插入图片描述
WEB后台打印的数据
在这里插入图片描述
至此,Oracle访问Web RESTAPI的过程结束。

参考链接:Oracle 使用UTL_HTTP发送http请求

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-10-01 17:14:41  更:2021-10-01 17:14:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年9日历 -2024/9/21 6:54:05-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码