【发布时间】: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 工作,但它不使用标题或参数。
- 如果指定
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"} - 如果我指定
p_body,那么我会得到 ORA-06502: PL/SQL: numeric or value error。 - 如果我指定
p_body但使用了错误的密码,我会得到(我认为是)非 ascii 响应,如下所示: - 如果我在不同的地方使用 varchar2 而不是 clob,我会遇到同样的错误
- 如果我使用具有相同 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