Я пытаюсь вызвать веб-сервис, используя Oracle UTL_HTTP.request
API. Для вызова требуется прокси и кошелек / сертификат. Я получаю ошибку ORA-28805: Cannot retrieve information from the data source
. Я использую СУБД версии 12.1.0.2.0 и БД БД 12.1.0.2.160419.
Следующий https вызовет ошибку ORA-28805:
DECLARE
l_http_request utl_http.req;
l_http_response utl_http.resp;
l_text VARCHAR2(32767);
BEGIN
utl_http.set_proxy('myproxy.url.com');
utl_http.set_wallet('file:/my/wallet/location'
,'mypass');
-- HTTPS Request --
l_http_request := utl_http.begin_request('https://app.myurl.com/myservice/','GET','HTTP/1.1');
utl_http.set_header(l_http_request, 'Authorization', 'Token mytoken');
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-28805: Cannot retrieve information from the data source.
ORA-06512: at "SYS.UTL_HTTP", line 368
ORA-06512: at "SYS.UTL_HTTP", line 1118
ORA-06512: at line 10
Следующий http вызов работает отлично и возвращает полезную нагрузку JSON:
DECLARE
l_http_request utl_http.req;
l_http_response utl_http.resp;
l_text VARCHAR2(32767);
BEGIN
utl_http.set_proxy('myproxy.url.com');
utl_http.set_wallet('file:/my/wallet/location'
,'mypass');
-- HTTP request --
l_http_request := utl_http.begin_request('http://jsonplaceholder.typicode.com/todos/1','GET','HTTP/1.1');
utl_http.set_header(l_http_request, 'Authorization', 'Token mytoken');
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;
Ответ:
{
"userId": 1,
"id": 1,
"title": "delectus aut autem",
"completed": false
}
Я успешно запустил следующее в качестве системы, но это не решило проблему:
BEGIN
DBMS_NETWORK_ACL_ADMIN.APPEND_WALLET_ACE
(
WALLET_PATH => 'file:/my/wallet/location',
ACE => XS$ACE_TYPE(
PRIVILEGE_LIST => XS$NAME_LIST('use_client_certificates','use_passwords'),
PRINCIPAL_NAME => 'myuser',
PRINCIPAL_TYPE => XS_ACL.PTYPE_DB
)
);
EXCEPTION WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Error while configuring ACL for wallet: '|| SQLERRM);
END;
Есть идеи, что может быть причиной этой ошибки?