【问题标题】:apex_web_service.make_rest_request POST has bad json or returns ORA-06502 numeric or value errorapex_web_service.make_rest_request POST 有错误的 json 或返回 ORA-06502 数字或值错误
【发布时间】:2019-12-27 21:51:07
【问题描述】:

我无法使用apex_web_service.make_rest_request() 使用 PLSQL 通过 E-verify/DHS 成功 POST /authentication/login。我首先在 Apex 中尝试过,但出现数值/值错误并切换到 PLSQL 进行调试。它使用 json。 Apex 版本是 4.2。我可以让 GET 工作,但它不使用标题或参数。

  1. 如果指定p_parm_name 使用string_to_table() 或使用p_parm_name 通过分别指定每个数组值,然后我得到{"status":400,"error":"There was a problem in the JSON you submitted: ActionDispatch::Http::Parameters::ParseError"}
  2. 如果我指定 p_body,那么我会得到 ORA-06502: PL/SQL: numeric or value error。
  3. 如果我指定 p_body 但使用了错误的密码,我会得到(我认为是)非 ascii 响应,如下所示:
  4. 如果我在不同的地方使用 varchar2 而不是 clob,我会遇到同样的错误
  5. 如果我使用具有相同 p_body 的邮递员,那么它可以工作!!

所以我当然希望这段代码能够正常工作,但取而代之的是,我如何看到来自 Oracle/Apex 的请求,以便我可以确认 json 的样子(对于上面的 #1)?谢谢!

这是代码。

      l_parm_names  apex_application_global.vc_arr2;  
      l_parm_values apex_application_global.vc_arr2;   
      l_resp_clob        clob;
      l_resp_length      integer;
      l_body_varchar2    varchar2(4000);
      l_body_clob        clob;
    begin  
      l_parm_names(1) := 'username';  
      l_parm_values(1) := 'user1234';  
      l_parm_names(2) := 'password';  
      l_parm_values(2) := 'pass1234';
      l_body_varchar2  := '{"username":"user1234","password":"pass1234"}';
      l_body_clob      := to_clob(l_body_varchar2);
      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';
      l_resp_clob := apex_web_service.make_rest_request(
         p_url => 'https://stage-everify*******login',  
         p_http_method => 'POST',
--         p_parm_name => apex_util.string_to_table('username:password'),
--         p_parm_value => apex_util.string_to_table('user1234:pass1234')
--         p_parm_name => l_parm_names,
--         p_parm_value => l_parm_values
         p_body => l_body_clob
         );   
       INSERT INTO ev_clob (body, resp, dte, note)
        VALUES (l_body_clob, l_resp_clob, SYSDATE, 'Stack Script 1');  commit;
    end;

【问题讨论】:

  • 您可以调用 Apex DEBUG api 来记录包含您的请求的消息。见docs.oracle.com/database/apex-18.1/AEAPI/…
  • 你好 Mark,我将代码移到 apex 中的页面进程中,以使用 apex_debug.message() 包装 make_rest_request。它记录响应,但不记录请求。如果您认为它会以这种方式工作,请告知如何记录请求。感谢您的想法。
  • 你是什么意思,“我可以让 GET 工作,但它不使用标题或参数。” GET 可以使用标头和参数,但通常不用于发送正文。你有没有让它与像 cURL 这样的命令行工具一起工作?如果是这样,请向我们展示该命令(在混淆任何敏感内容之后),以便我们可以从中恢复。
  • 您好 Dan:对于 GET,我只是想证明防火墙/ACL 有效,并且我不确定我是否在 POST 上正确设置了 headers/parms。我没有使用 curl ,但尝试过,两个 POST/GET 都返回了相同的错误。我们使用 Oracle Wallet 并且有证书,所以猜测 curl 不知道那个东西在哪里并且是错误的原因。这是我对 GET 的 curl 和响应...curl https://stage-everify.uscis.gov/api/v30/health curl: (35) Unknown SSL protocol error in connection to stage-everify.uscis.gov:443
  • 这里是来自工作邮递员示例的 curl `curl -X POST \ stage-everify.uscis.gov/api/v30/authentication/login \ -H 'Accept: /' \ -H 'Accept-Encoding: gzip, deflate ' \ -H '缓存控制:无缓存' \ -H '连接:保持活动' \ -H '内容长度:289' \ -H '内容类型:应用程序/json' \ -H 'Cookie : case-ui-access-token=' \ -H 'Host: stage-everify.uscis.gov' \ -H 'Postman-Token: *' \ -H 'User-Agent: PostmanRuntime/7.20.1' \ - H '缓存控制:无缓存' `

标签: json oracle rest web-services oracle-apex


【解决方案1】:

需要这样生成json

SET SERVEROUTPUT ON
DECLARE
  l_cursor SYS_REFCURSOR;
BEGIN

  OPEN l_cursor FOR
    SELECT e.empno AS "employee_number",
           e.ename AS "employee_name",
           e.deptno AS "department_number"
    FROM   emp e
    WHERE  rownum <= 2;

  APEX_JSON.initialize_clob_output;

  APEX_JSON.open_object;
  APEX_JSON.write('employees', l_cursor);
  APEX_JSON.close_object;

  DBMS_OUTPUT.put_line(APEX_JSON.get_clob_output);
  APEX_JSON.free_output;
END;
/

在这里您可以找到更多信息 https://docs.oracle.com/cd/E59726_01/doc.50/e39149/apex_json.htm#AEAPI29737

BEGIN
  apex_json.open_object; -- {
  apex_json.open_object('obj'); -- "obj": {
  apex_json.write('obj-attr', 'value'); -- "obj-attr": "value"
  apex_json.close_all; -- }}
END;

【讨论】:

  • 您好恩里克:感谢您的回复。很遗憾,apex_json 在 Apex 4.2 中似乎不可用。您链接的文档是 5.0 版。无论如何,谢谢。
猜你喜欢
  • 1970-01-01
  • 2014-04-25
  • 1970-01-01
  • 1970-01-01
  • 2016-12-18
  • 2021-12-26
  • 2014-12-30
  • 1970-01-01
相关资源
最近更新 更多