如何配置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
相关产品推荐
相关产品推荐

