Web Services apex_web_service.make_rest_request POST具有错误的json或返回ORA-06502数字或值错误

t5fffqht  于 2022-11-15  发布在  其他
关注(0)|答案(1)|浏览(158)

我无法通过使用apex_web_service.make_rest_request()的PLSQL使用E-verify/DHS成功进行POST /身份验证/登录。我首先在Apex中尝试,但出现数字/值错误,并切换到PLSQL进行调试。它使用json。Apex版本是4.2。我可以使用GET,但它不使用标头或参数。
1.如果使用string_to_table()指定p_parm_name,或者使用p_parm_name分别指定每个数组值,则得到{"status":400,"error":"There was a problem in the JSON you submitted: ActionDispatch::Http::Parameters::ParseError"}
1.如果指定p_body,则会得到ORA-06502:PL/SQL:数字或值错误。
1.如果我指定了p_body但使用了错误的密码,我会得到(我认为是)如下的非ascii响应:
1.如果我在不同的地方使用varchar 2而不是clob,我会得到相同的错误
1.如果我用同样的p_body来使用postman,那么它就能工作!!
所以我当然希望这段代码能正常工作,但是作为替代,我如何看到来自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;
goucqfw6

goucqfw61#

您需要以这种方式生成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;

相关问题