Ошибка Oracle ORA-28805: невозможно получить информацию из источника данных при вызове UTL_HTTP.request - PullRequest
0 голосов
/ 05 июня 2019

Я пытаюсь вызвать веб-сервис, используя 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;

Есть идеи, что может быть причиной этой ошибки?

...