如何在没有 Web 源模块的情况下从 Oracle APEX 中的 API 获取数据

Posted

技术标签:

【中文标题】如何在没有 Web 源模块的情况下从 Oracle APEX 中的 API 获取数据【英文标题】:How to fetch data from API in Oracle APEX without web source module 【发布时间】:2022-01-17 22:37:12 【问题描述】:

我是 APEX、PL/SQL 和 API/JSON 的新手,所以请多多包涵。

我需要创建一个搜索页面,数据将来自 API。

我尝试使用网络源进行此操作,但不幸的是,我遇到了错误,已经与 dba 团队进行了检查,等等。错误仍然存​​在,考虑到版本问题或其他问题,所以我删除了这个想法,不过这对我真的很有帮助。

所以解决方法是 PL/SQL 将连接到 API。

所以它是这样的: 在 APEX 中,我将在文本框上输入一些数据,当我单击搜索按钮时,它将从 API 获取数据到交互式报告中。

**已更新 这就是我所拥有的,我相信我还需要做一个 JSON 转换的事情。

 declare  
    v_url      varchar2(1000); 
    v_wallet_path   varchar2(120) :='<walletvalue>';
    v_body    clob :=  '<json body>';   
    l_response clob;
begin  
    apex_web_service.g_request_headers.delete;  
    apex_web_service.g_request_headers(1).name := 'Ocp-Apim-Subscription-Key';
    apex_web_service.g_request_headers(1).value := '<key value>';
    v_url := '<url>'; 
    l_response := apex_web_service.make_rest_request(
                             p_url        => v_url,   
                             p_http_method => 'POST',
                             p_wallet_path => v_wallet_path,
                             p_wallet_pwd =>'<password>',
                             p_body        => v_body);  
    if apex_web_service.g_status_code = 200 then    --OK    
         --dbms_output.put_line(l_response);
    else    --ERROR?
        dbms_output.put_line('ERROR');
    End If; 
End;

谁能帮帮我,我已经考虑了好几个星期了。我不知道从哪里开始。我需要有哪些东西,要知道以及如何创建页面的步骤。 我知道这很多,但我将非常感谢您的帮助!也提前致谢!

【问题讨论】:

您将为 JSON 使用的“API”在哪里/到底是什么? 很抱歉,我不确定是否能收到您的问题。它是 REST API。我的请求是“POST” 是的,但我们对您的 API 一无所知...是 ords/Oracle 还是完全在 oracle 外部的东西? 那就看看外网源功能docs.oracle.com/en/cloud/paas/autonomous-database/adbsa/… 如果您想手写大量的 plsql 代码,当然可以……但是当您可以利用此功能时,为什么还要这样做呢? 【参考方案1】:

这是一个非常广泛的问题,所以我的回答也很模糊。

我不认为你想创建一个函数——在引入 Web Source 模块之前,这种事情通常是在提交页面过程中完成的。在您的流程中,您需要:

    调用 Web API,输入您的搜索词,然后返回响应。执行此操作的旧方法 was with UTL_HTTP,但较新的 APEX_WEB_SERVICE 包更容易。 使用 APEX_COLLECTION 创建/截断集合并将响应 clob 保存到集合的 p_clob001 字段中。

编辑:这是一个代码 sn-p

l_clob := apex_web_service.make_rest_request(....);

APEX_COLLECTION.CREATE_OR_TRUNCATE_COLLECTION(p_collection_name => 'API_RESPONSE');

APEX_COLLECTION.ADD_MEMBER(
        p_collection_name => 'API_RESPONSE'
        p_clob001 => l_clob);

然后创建一个交互式报告。源将是一个 SQL 查询,它将获取集合的 clob parse it as JSON,并使用 JSON_TABLE 转换为表格格式(行和列)。

编辑:添加示例

SELECT jt.id, jt.name
FROM APEX_collections c
cross join JSON_TABLE(
        clob001,  -- the following lines depend on your JSON structure
        '$[*]',  
        columns(
            id number path '$.id',
            name varchar2(10) path '$.name')
    ) jt
WHERE collection_name = 'API_RESPONSE'

或者,您可以在页面进程中使用 JSON_TABLE 解析 clob,使用 APEX_COLLECTION.CREATE_COLLECTION_FROM_QUERY 将输出表保存到集合中,然后只需查询该集合以获取交互式报告。

编辑:我不确定这是否可行,但类似:

APEX_COLLECTION.CREATE_COLLECTION_FROM_QUERY (
    p_collection_name => 'API_RESPONSE',
    p_query => 'SELECT t.id, t.name
    FROM JSON_TABLE(
            l_clob,
            ''$[*]'',
            columns(
                id number path ''$.id'',
                name varchar2(10) path ''$.name'')
        ) t');

旁注:作为一个非常不同的选项,您也可以call the web service using javascript/jQuery/AJAX。我认为这会更复杂,但在技术上是可行的。

【讨论】:

嗨!非常感谢,这对我来说已经足够了。我会一步一步做的。我完成了第一步。只需要解析它,我想我已经完成了。 嗨,我需要你的帮助。不幸的是,我无法创建发布新问题。我遇到了 APEX 集合的问题。我是要创建一个仅包含 p_clob001 字段的集合,还是必须在集合中包含所有 json 参数(正文)? 我编辑添加了一些示例,看看是否有帮助 嗨!太感谢了!我会听从你的指导。

以上是关于如何在没有 Web 源模块的情况下从 Oracle APEX 中的 API 获取数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有用户修改消息的情况下从 iOS 应用程序发布到 Facebook 墙

如何在没有 CORS 问题的情况下从外部域获取 ttf

如何在没有 npm install 的情况下从 github 运行 react 项目

如何在不导入的情况下从 .dmp 文件中列出 Oracle 中的所有模式和表空间?

如何在没有调用者 UUID 的情况下从自定义 UI 结束 CallKit 调用?

是否可以在没有画布的情况下从 ImageBitMap Web 对象中获取像素?