You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle 19c本地库调用apex_web_service.make_rest_request报错求助

问题描述

已创建ACL并授予权限,但调用apex_web_service.make_rest_request时仍报错。以下PL/SQL块在apex.oracle.com可正常运行并向表中插入数据,但在本地Oracle 19c数据库(APEX版本22.2)中执行时出现错误,请排查问题所在。

错误截图:
错误截图1
错误截图2

PL/SQL代码:

DECLARE
  l_respclob CLOB;
  l_reqbody CLOB;
  v_access_token VARCHAR2(4000);
  l_Status VARCHAR2(200);
BEGIN
  apex_web_service.g_request_headers(1).name := 'Content-Type';
  apex_web_service.g_request_headers(1).value := 'application/json';


  apex_json.initialize_clob_output;
  apex_json.open_object;

  l_reqbody :=
    '{
    "grant_type": "client_credentials",
    "client_id": "2KDLXfdDZAKdeRivIg4",
    "client_secret": "UqPvcfZ43yVbF0QlC58PcVYkSuSr6sTW88QTPUTEb56BGoH19goIj2Zzzxl"
}';

  l_respclob :=
    apex_web_service.make_rest_request(
      p_url => 'https://git-ss.piwik.pro/auth/token',
      p_http_method => 'POST',
      p_body => l_reqbody
    );

  v_access_token := JSON_VALUE(l_respclob, '$.access_token');

  insert into TBL_MAKE_REQ(TOKEN)
  values (v_access_token);
END;
排查步骤

1. 验证ACL配置完整性

虽然已创建ACL,但本地环境可能存在配置遗漏:

  • 确认ACL已正确分配给当前执行用户:
    SELECT * FROM DBA_NETWORK_ACLS WHERE HOST = 'git-ss.piwik.pro';
    SELECT * FROM DBA_NETWORK_ACL_PRIVILEGES WHERE HOST = 'git-ss.piwik.pro';
    
  • 确保ACL包含connect权限,且用户被授予该权限,有效期未过期。
  • 若目标URL使用HTTPS,需确认ACL是否涵盖443端口,或未限制端口(端口设为*)。

2. 检查Oracle Wallet/SSL配置

本地环境可能缺少SSL证书信任:

  • 调用HTTPS接口时,Oracle需要信任目标站点的SSL证书。若本地未配置Oracle Wallet,或未将目标站点的根CA证书导入Wallet,会导致SSL握手失败。
  • 验证APEX是否配置了正确的Wallet路径:进入APEX管理界面 → 实例设置 → 安全 → Web服务,确认“SSL Wallet”路径正确且可访问。
  • 手动测试SSL连接:使用utl_http测试目标URL,看是否能建立连接:
    DECLARE
      l_req utl_http.req;
      l_resp utl_http.resp;
    BEGIN
      utl_http.set_wallet('file:/path/to/your/wallet', 'wallet_password'); -- 替换为实际路径和密码
      l_req := utl_http.begin_request('https://git-ss.piwik.pro/auth/token', 'POST');
      utl_http.end_request(l_req);
    EXCEPTION
      WHEN OTHERS THEN
        dbms_output.put_line('Error: ' || sqlerrm);
    END;
    

3. 检查APEX Web服务参数设置

本地APEX实例的Web服务参数可能与apex.oracle.com不同:

  • 确认apex_web_service的代理设置:若本地网络需要通过代理访问外部站点,需配置APEX的代理服务器:
    BEGIN
      apex_instance_admin.set_parameter('PROXY_SERVER', 'proxy.example.com:8080'); -- 替换为实际代理
      commit;
    END;
    
  • 检查Web服务超时设置:本地环境网络延迟较高,可能导致超时,可尝试增加超时参数:
    修改make_rest_request调用,添加p_timeout参数:
    l_respclob :=
      apex_web_service.make_rest_request(
        p_url => 'https://git-ss.piwik.pro/auth/token',
        p_http_method => 'POST',
        p_body => l_reqbody,
        p_timeout => 30 -- 设置30秒超时
      );
    

4. 验证用户权限与APEX工作区关联

  • 确认执行PL/SQL的用户是当前APEX工作区的有效用户,且被授予APEX_WEB_SERVICE相关权限(如EXECUTE权限)。
  • 检查是否在APEX环境中执行代码:若直接在SQL*Plus或PL/SQL Developer中执行,需确保用户已被授予访问APEX包的权限,且环境变量(如APEX_SESSION_ID)正确设置(若依赖会话)。

5. 捕获详细错误信息

修改代码,添加异常处理,获取更详细的错误信息:

DECLARE
  l_respclob CLOB;
  l_reqbody CLOB;
  v_access_token VARCHAR2(4000);
  l_Status VARCHAR2(200);
BEGIN
  apex_web_service.g_request_headers(1).name := 'Content-Type';
  apex_web_service.g_request_headers(1).value := 'application/json';

  l_reqbody :=
    '{
    "grant_type": "client_credentials",
    "client_id": "2KDLXfdDZAKdeRivIg4",
    "client_secret": "UqPvcfZ43yVbF0QlC58PcVYkSuSr6sTW88QTPUTEb56BGoH19goIj2Zzzxl"
}';

  l_respclob :=
    apex_web_service.make_rest_request(
      p_url => 'https://git-ss.piwik.pro/auth/token',
      p_http_method => 'POST',
      p_body => l_reqbody
    );

  v_access_token := JSON_VALUE(l_respclob, '$.access_token');

  insert into TBL_MAKE_REQ(TOKEN)
  values (v_access_token);
EXCEPTION
  WHEN OTHERS THEN
    dbms_output.put_line('Error Code: ' || sqlcode);
    dbms_output.put_line('Error Message: ' || sqlerrm);
    dbms_output.put_line('APEX Web Service Error: ' || apex_web_service.g_status_code || ' - ' || apex_web_service.g_status_message);
END;

执行后查看输出的详细错误,能更精准定位问题(如SSL错误、连接超时、权限不足等)。

内容的提问来源于stack exchange,提问作者Mohammad Ubaid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 14:55:36