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

如何配置Oracle APEX从应用服务器(ORDS/Tomcat)调用外部REST API?

从ORDS/Tomcat应用服务器发起外部REST API调用的实现方案

针对你的环境(APEX 24.2 + ORDS 23.x + Tomcat,数据库与应用服务器分区域部署),以下是替代apex_web_service.make_rest_request、从应用服务器发起外部API调用的三种可行方案:

方案1:使用APEX Web Source Modules(推荐,零额外代码)

APEX的Web Source模块原生支持通过ORDS代理转发请求,无需修改大量现有逻辑:

  • 进入目标APEX应用,导航至「Shared Components」→「Web Source Modules」,点击「Create」
  • 选择「REST Data Source」,填入外部API的基础URL、请求方法(GET/POST等)
  • 在「Advanced」配置页,开启Use ORDS as Proxy选项——这是核心设置,确保请求从ORDS所在的应用服务器发起,而非数据库
  • 按需配置认证信息(如HTTP Basic Auth、OAuth2令牌)
  • 在PL/SQL或APEX页面组件中,使用apex_exec包调用该Web Source(例如apex_exec.open_web_source_query),替代原有的apex_web_service调用

方案2:自定义ORDS REST代理服务

通过ORDS暴露一个内部REST端点,在端点逻辑中使用ORDS原生HTTP客户端发起请求:

  • 在数据库中创建PL/SQL包,使用ords_http_client包(而非apex_web_service)编写外部API调用逻辑——ords_http_client的请求会由ORDS进程在应用服务器层面执行
  • 用ORDS注解标记包中的存储过程/函数,将其暴露为REST端点:
    CREATE OR REPLACE PACKAGE ext_api_proxy AS
      FUNCTION call_external_api(p_param VARCHAR2) RETURN CLOB;
    END ext_api_proxy;
    /
    CREATE OR REPLACE PACKAGE BODY ext_api_proxy AS
      FUNCTION call_external_api(p_param VARCHAR2) RETURN CLOB IS
        l_response CLOB;
      BEGIN
        ords_http_client.init();
        ords_http_client.set_uri('https://external-api.example.com/endpoint');
        ords_http_client.set_method('POST');
        ords_http_client.set_body('{"param": "' || p_param || '"}');
        ords_http_client.send();
        l_response := ords_http_client.get_response_body();
        ords_http_client.cleanup();
        RETURN l_response;
      END call_external_api;
    END ext_api_proxy;
    /
    -- 注册ORDS端点
    BEGIN
      ords.define_service(
        p_module_name    => 'ext_api_proxy',
        p_base_path      => '/ext-api/',
        p_pattern        => 'call',
        p_method         => 'POST',
        p_source_type    => ords.source_type_plsql,
        p_source         => 'BEGIN :response := ext_api_proxy.call_external_api(:param); END;',
        p_items_per_page => 0);
      COMMIT;
    END;
    /
    
  • 在APEX中通过apex_web_service.make_rest_request调用这个ORDS内部端点(此时请求仅在应用服务器内部流转,再由ORDS转发至外部API)

方案3:Tomcat反向代理(通用转发场景)

如果需要对多个外部API做统一转发,可配置Tomcat作为反向代理:

  • 编辑Tomcat的conf/server.xml,添加一个<Connector>或在conf/context.xml中配置<Resource>,或使用conf/Catalina/localhost/[应用名].xml配置代理规则:
    <Context path="/api-proxy">
      <Valve className="org.apache.catalina.valves.ProxyValve"
             proxyHost="external-api.example.com"
             proxyPort="443"
             scheme="https"
             secure="true"/>
    </Context>
    
  • 配置Tomcat的防火墙规则,允许访问目标外部API的地址和端口
  • 在APEX中调用https://[应用服务器地址]/api-proxy/[外部API路径],请求会通过Tomcat转发至外部API

关键注意事项

  • 确保应用服务器(Tomcat/ORDS)的网络策略允许访问目标外部API的IP、端口及协议(HTTP/HTTPS)
  • 外部API的认证信息需在对应方案中配置(如Web Source的认证、ORDS服务的请求头、Tomcat代理的请求转发参数)
  • 逐步替换原有代码中直接调用apex_web_service.make_rest_request的逻辑,改用上述方案的调用方式

内容的提问来源于stack exchange,提问作者jaw mohammed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 12:30:13