如何在没有 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 墙
如何在没有 npm install 的情况下从 github 运行 react 项目
如何在不导入的情况下从 .dmp 文件中列出 Oracle 中的所有模式和表空间?