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

如何在Oracle APEX中调用外部API并解决CORS限制问题?

解决Oracle APEX中调用RD Station Marketing API的CORS及安全问题

你遇到的CORS错误和API文档提示完全一致:前端直接调用会暴露access_token(存在隐私泄露风险),且该API本身不允许跨域的前端请求。必须通过Oracle APEX后端作为中转层发起请求,才能同时解决CORS和安全问题,具体实现方案如下:

方案一:使用APEX REST Data Source(推荐,配置化实现)

  1. 创建REST数据源

    • 进入APEX应用,导航到Shared Components > REST Data Sources
    • 点击Create,选择From Scratch
    • 填写核心配置:
      • 名称:比如RD_Station_Events
      • Base URL:https://api.rd.services
      • 认证类型:选择HTTP Header
      • 头部名称:Authorization
      • 头部值:Bearer {你的access_token}(token存储在APEX后端,不会暴露到前端)
    • 保存后测试连接,确保能正常访问API
  2. 按钮动态动作调用数据源

    • 回到按钮所在页面,给按钮创建动态动作,触发条件设为Click
    • 动作选择Execute Server-side Code,写入PL/SQL代码:
      DECLARE
        l_response CLOB;
      BEGIN
        -- 设置请求头
        apex_web_service.g_request_headers.delete;
        apex_web_service.g_request_headers(1).name := 'Content-Type';
        apex_web_service.g_request_headers(1).value := 'application/json';
        
        -- 调用API
        l_response := apex_web_service.make_rest_request(
          p_url         => 'https://api.rd.services/platform/events?event_type=sale',
          p_http_method => 'POST',
          p_body        => '{
            "event_type": "SALE",
            "event_family": "CDP",
            "payload": {
              "email": "conversao@exemplo.com",
              "funnel_name": "default",
              "value": 999
            }
          }'
        );
        
        -- 前端反馈(可选)
        apex_application.g_print_success_message := '事件已成功发送';
      EXCEPTION
        WHEN OTHERS THEN
          apex_application.g_print_error_message := '发送失败:' || SQLERRM;
      END;
      
    • 勾选Return Page Items或设置成功/错误提示,让前端获取执行结果

方案二:用APEX_WEB_SERVICE写PL/SQL过程(更灵活,适合复杂逻辑)

  1. 创建存储过程(可复用)
    CREATE OR REPLACE PROCEDURE send_rd_station_event(
      p_email        IN VARCHAR2,
      p_funnel_name  IN VARCHAR2,
      p_value        IN NUMBER
    ) AS
      -- 建议将token存在APEX应用设置中,而非硬编码
      l_access_token VARCHAR2(2000) := apex_app_setting.get_value('RD_STATION_TOKEN');
      l_response     CLOB;
      l_body         CLOB;
    BEGIN
      -- 构造JSON请求体
      l_body := apex_json.stringify(
        apex_json.t_object(
          'event_type'   => 'SALE',
          'event_family' => 'CDP',
          'payload'      => apex_json.t_object(
            'email'        => p_email,
            'funnel_name'  => p_funnel_name,
            'value'        => p_value
          )
        )
      );
      
      -- 调用外部API
      l_response := apex_web_service.make_rest_request(
        p_url         => 'https://api.rd.services/platform/events?event_type=sale',
        p_http_method => 'POST',
        p_body        => l_body,
        p_headers     => apex_web_service.t_header_list(
          apex_web_service.t_header('Authorization', 'Bearer ' || l_access_token),
          apex_web_service.t_header('Content-Type', 'application/json'),
          apex_web_service.t_header('accept', 'application/json')
        )
      );
      
      -- 可选:记录请求日志
      INSERT INTO api_request_logs (request_body, response_body, created_at)
      VALUES (l_body, l_response, SYSDATE);
    END;
    /
    
  2. 按钮动态动作调用过程
    • 动态动作选择Execute Server-side Code,写入PL/SQL代码:
      BEGIN
        send_rd_station_event(
          p_email        => :P1_EMAIL, -- 替换为你的页面项
          p_funnel_name  => 'default',
          p_value        => 999
        );
        apex_application.g_print_success_message := '事件发送成功';
      EXCEPTION
        WHEN OTHERS THEN
          apex_application.g_print_error_message := '错误:' || SQLERRM;
      END;
      

关键注意事项

  • token安全:绝对不要把access_token硬编码在代码中,建议存储在APEX Application Settings(Shared Components > Application Settings),通过apex_app_setting.get_value获取
  • 错误处理:必须添加异常捕获,避免页面崩溃,同时可通过日志记录便于排查问题
  • CORS解决原理:所有请求通过APEX后端发起,浏览器仅与APEX服务器通信,不存在跨域限制

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 11:23:21