【发布时间】:2019-05-29 21:12:00
【问题描述】:
我正在尝试使用 Oracle UTL_HTTP.request API 调用 Web 服务。通话需要代理和钱包/证书。我相信我已经解决了证书问题,因为我不再收到 ORA-29024: Certificate validation failure 错误。现在我收到ORA-29259: end-of-input reached 错误。我使用的是 DBMS 版本 12.1.0.2.0,应该使用 TLS 1.2(不确定如何验证)。
以下调用完美运行并返回 JSON 有效负载:
SELECT utl_http.request (
'http://jsonplaceholder.typicode.com/todos/1',
'proxy.myurl.com')
FROM dual;
回复:
{
"userId": 1,
"id": 1,
"title": "delectus aut autem",
"completed": false
}
以下调用引发 ORA-29259 错误:
SELECT utl_http.request (
'https://service.baseurl.com/ping',
'proxy.myurl.com',
'file:/my/wallet/location',
'mypassword'
)
FROM DUAL;
运行时异常堆栈:
ORA-29273: HTTP request failed
ORA-29259: end-of-input reached
ORA-06512: at "SYS.UTL_HTTP", line 1491
ORA-06512: at line 1
我也尝试过使用匿名 PL/SQL 块调用 UTL_HTTP.begin_request,但得到与上述基本相同的 ORA-29259 错误。
DECLARE
l_http_request utl_http.req;
l_http_response utl_http.resp;
l_text VARCHAR2(32767);
BEGIN
utl_http.set_proxy('proxy.myurl.com');
utl_http.set_wallet('file:/my/wallet/location'
,'mypassword');
l_http_request := utl_http.begin_request('https://service.baseurl.com/ping'
,'POST', 'HTTP/1.1');
l_http_response := utl_http.get_response(l_http_request);
BEGIN
LOOP
utl_http.read_text(l_http_response, l_text, 32766);
dbms_output.put_line(l_text);
END LOOP;
EXCEPTION WHEN utl_http.end_of_body THEN
utl_http.end_response(l_http_response);
END;
END;
ORA-29273: HTTP request failed
ORA-29259: end-of-input reached
ORA-06512: at "SYS.UTL_HTTP", line 1258
ORA-06512: at line 10
关于可能导致此错误的任何想法?
【问题讨论】:
-
您是否为钱包配置了ACL?见MoS document ID 2303905
-
我尝试将
DBMS_NETWORK_ACL_ADMIN.APPEND_WALLET_ACE代码作为SYSTEM运行以获取特权'use_client_certificates', 'use_passwords'。它没有错误地完成,但在调用UTL_HTTP.request时我仍然收到相同的ORA-29259错误。
标签: oracle api https oracle12c