Webservices aus Autonomous Database aufrufen

Beschreibt Optionen zum Aufrufen von Webservices aus Autonomous Database.

Es gibt eine Reihe von Optionen zum Aufruf von Webservices aus Autonomous Database, darunter:

  • DBMS_CLOUD-REST-APIs verwenden: Die Funktion DBMS_CLOUD.SEND_REQUEST startet eine HTTP-Anforderung, ruft die Antwort ab und beendet die Antwort. Diese Funktion bietet einen Workflow zum Senden einer Cloud-REST-API-Anforderung mit Argumenten, und die Funktion gibt einen Antwortcode und eine Payload zurück. Weitere Informationen finden Sie unter SEND_REQUEST Funktion und Prozedur.

  • Oracle APEX verwenden: Sie können sowohl mit SOAP- als auch mit RESTful-Webservices über APEX in Ihrer Autonomous Database-Instanz interagieren. Weitere Informationen finden Sie unter Webservices mit Oracle APEX verwenden.

  • Mit UTL_HTTP eine Anforderung an eine öffentliche Site weiterleiten: Weitere Informationen finden Sie unter HTTP-Anforderung an einen öffentlichen Host weiterleiten.

  • Mit UTL_HTTP eine Anforderung an eine private Site weiterleiten: Weitere Informationen finden Sie unter HTTP-Anforderung an einen privaten Host weiterleiten.

    Wenn sich Ihre Autonomous Database-Instanz auf einem privaten Endpunkt befindet, können Sie ein vom Kunden verwaltetes Wallet mit Prozeduren in UTL_HTTP, DBMS_LDAP, UTL_SMTP oder UTL_TCP verwenden. Weitere Informationen finden Sie unter Externe Anrufe mit einem vom Kunden verwalteten Wallet tätigen.

Informationen zu Einschränkungen für UTL_HTTP finden Sie unter Hinweise zum PL/SQL-Package für Autonomous Database.

Themen

HTTP-Anforderung an einen öffentlichen Host weiterleiten

Enthält Details zur Verwendung von UTL_HTTP zum Weiterleiten einer HTTP-Anforderung an einen öffentlichen Host.

Beispiel: Um eine HTTP-Anforderung für einen öffentlichen Host www.example.com weiterzuleiten, erstellen Sie eine Access Control-Liste für den Host:

BEGIN
   DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
         host => 'www.example.com',
         ace =>  xs$ace_type( privilege_list => xs$name_list('http'),
                              principal_name => 'ADMIN',
                              principal_type => xs_acl.ptype_db));
END;

Leiten Sie dann die HTTP-Anforderung weiter:

SELECT UTL_HTTP.REQUEST(url => 'https://www.example.com/') FROM dual;
Hinweis

Wenn sich Ihre Autonomous Database-Instanz auf einem privaten Endpunkt befindet und Ihre UTL_HTTP-Aufrufe an öffentliche Hosts den Egress-Regeln Ihres privaten Endpunkt-VCN unterliegen sollen, setzen Sie die Datenbankeigenschaft ROUTE_OUTBOUND_CONNECTIONS auf PRIVATE_ENDPOINT.

Weitere Informationen finden Sie unter Erweiterte Sicherheit für ausgehende Verbindungen mit privaten Endpunkten.

Informationen zu Einschränkungen für UTL_HTTP finden Sie unter Hinweise zum PL/SQL-Package für Autonomous Database.

HTTP-Anforderung an einen privaten Host weiterleiten

Beschreibt die Schritte zum Weiterleiten einer HTTP-Anforderung mit UTL_HTTP auf einem privaten Host.

Um eine Anforderung an einen Zielhost auf einem privaten Endpunkt weiterzuleiten, muss der Zielhost über das Oracle Cloud Infrastructure-VCN der Quelldatenbank zugänglich sein. Beispiel: Sie können in:

  • Die Quelldatenbank und der Zielhost befinden sich in demselben Oracle Cloud Infrastructure-VCN.

  • Die Quelldatenbank und der Zielhost befinden sich in verschiedenen Oracle Cloud Infrastructure-VCNs, die gekoppelt sind.

  • Der Zielhost ist ein On-Premise-Netzwerk, das über FastConnect oder VPN mit dem Oracle Cloud Infrastructure-VCN der Quelldatenbank verbunden ist.

Sie können auch UTL_HTTP-Aufrufe mit einem vom Kunden verwalteten Wallet ausführen, wenn sich Autonomous Database auf einem privaten Endpunkt befindet. Weitere Informationen finden Sie unter Externe Anrufe mit einem vom Kunden verwalteten Wallet tätigen.

So erstellen Sie eine UTL_HTTP-Anforderung an ein Ziel auf einem privaten Endpunkt:

  1. Erstellen Sie eine Access Control-Liste für den Host.

    Beispiele:

    BEGIN
       DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
             host => 'www.example.com',
             ace => xs$ace_type( privilege_list => xs$name_list('http'),
                                 principal_name => 'ADMIN',
                                 principal_type => xs_acl.ptype_db),
                                 private_target => TRUE);
    END;
    /

    Wie in diesem Beispiel dargestellt, geben Sie beim Erstellen einer Access Control-Liste für den Host den Parameter private_target mit dem Wert TRUE an.

    Hinweis

    Wenn Sie ROUTE_OUTBOUND_CONNECTIONS auf PRIVATE_ENDPOINT setzen, ist es in dieser API nicht erforderlich, den Parameter private_target auf TRUE zu setzen. Weitere Informationen finden Sie unter Erweiterte Sicherheit für ausgehende Verbindungen mit privaten Endpunkten.
  2. Leiten Sie die HTTP-Anforderung weiter:

    SELECT UTL_HTTP.REQUEST(
                    url => 'https://www.example.com/',
                    https_host => 'www.example.com') 
                 FROM dual;

Informationen zu Einschränkungen für UTL_HTTP finden Sie unter Hinweise zum PL/SQL-Package für Autonomous Database.

HTTP-Anforderung mit einem Proxy an private Site weiterleiten

Wenn sich Ihre Autonomous Database-Instanz auf einem privaten Endpunkt befindet, können Sie HTTP-Anforderungen mit einem Proxy mit UTL_HTTP weiterleiten.

Wenn sich Ihre Autonomous Database-Instanz auf einem privaten Endpunkt befindet, muss der Zielproxy über das Oracle Cloud Infrastructure-VCN der Quelldatenbank zugänglich sein, um UTL_HTTP mit einem Zielproxy zu verwenden.

Sie können sich beispielsweise in folgenden Fällen mit einem Proxy anmelden:

  • Die Quelldatenbank und der Proxyserver befinden sich in demselben Oracle Cloud Infrastructure-VCN.

  • Die Quelldatenbank und der Proxyserver befinden sich in verschiedenen Oracle Cloud Infrastructure-VCNs, die gekoppelt sind.

  • Der Proxyserver ist ein On-Premise-Netzwerk, das mit FastConnect oder VPN mit dem Oracle Cloud Infrastructure-VCN der Quelldatenbank verbunden ist.

Sie können UTL_HTTP-Aufrufe auch mit einem vom Kunden verwalteten Wallet ausführen. Weitere Informationen finden Sie unter Externe Anrufe mit einem vom Kunden verwalteten Wallet tätigen.

So verwenden Sie einen Proxyserver mit UTL_HTTP:

  1. Legen Sie die ACL HTTP_PROXY auf dem Proxyserver fest.

    Beispiele:

    BEGIN
      DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
           host =>'www-proxy-example.com',
           ace  => xs$ace_type(privilege_list => xs$name_list('HTTP_PROXY'),
                               principal_name => 'APPUSER1',
                               principal_type => xs_acl.ptype_db),
                               private_target => TRUE);
    END;
    /

    Wie in diesem Beispiel dargestellt, geben Sie beim Erstellen einer Access Control-Liste für den Proxyserver den Parameter private_target mit dem Wert TRUE an.

    Hinweis

    Wenn Sie ROUTE_OUTBOUND_CONNECTIONS auf PRIVATE_ENDPOINT setzen, ist es in dieser API nicht erforderlich, den Parameter private_target auf TRUE zu setzen. Weitere Informationen finden Sie unter Erweiterte Sicherheit für ausgehende Verbindungen mit privaten Endpunkten.
  2. Legen Sie die HTTP-ACL auf dem Remote-Webserver fest.

    Beispiele:

    BEGIN
      DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
            host =>'example.com',
            ace => xs$ace_type( privilege_list => xs$name_list('HTTP'),
                                principal_name => 'APPUSER1',
                                principal_type => xs_acl.ptype_db)
    END;
    /
  3. Legen Sie das Wallet und den Proxy für UTL_HTTP fest.

    Beispiele:

    BEGIN
       UTL_HTTP.SET_WALLET('');
       UTL_HTTP.SET_PROXY('www-proxy-example:80');
    END;
    /
  4. HTTP-Anforderung weiterleiten:
    SELECT UTL_HTTP.REQUEST(    
                        url         => 'https://www.example.com/',
                        https_host  => 'www.example.com')
                 FROM dual;

Hinweise zum Festlegen eines Proxyservers mit UTL_HTTP.SET_PROXY:

  • DBMS_CLOUD-Anforderungen entsprechen nicht dem Proxyserver, den Sie mit UTL_HTTP.SET_PROXY festlegen. Dazu gehören DBMS_CLOUD.SEND_REQUEST und der gesamte Objektspeicherzugriff für externe DBMS_CLOUD-Tabellen, die Sie mit DBMS_CLOUD.CREATE_EXTERNAL_TABLE, DBMS_CLOUD.CREATE_EXTERNAL_PART_TABLE oder DBMS_CLOUD.CREATE_HYBRID_PART_TABLE definieren.

  • Bei APEX_WEB_SERVICE-Anforderungen wird der Proxyserver, den Sie mit UTL_HTTP.SET_PROXY festgelegt haben, nicht berücksichtigt.

Informationen zu Einschränkungen für UTL_HTTP finden Sie unter Hinweise zum PL/SQL-Package für Autonomous Database.

Zugangsdatenobjekte zum Festlegen der HTTP-Authentifizierung verwenden

Beschreibt, wie Zugangsdatenobjekte an die Prozedur UTL_HTTP.SET_CREDENTIAL übergeben werden.

Die Prozedur UTL_HTTP.SET_CREDENTIAL legt HTTP-Authentifizierungsinformationen im HTTP-Anforderungsheader fest. Der Webserver benötigt diese Informationen, um die Anforderung zu autorisieren.

Mit der Prozedur UTL_HTTP.SET_CREDENTIAL können Sie Zugangsdatenobjekte übergeben, um die HTTP-Authentifizierung festzulegen. Zugangsdatenobjekte sind Schemaobjekte. Daher können nur privilegierte Benutzer auf sie zugreifen, und Sie können Berechtigungen auf Schemaebene konfigurieren, um auf die Zugangsdaten zuzugreifen. Das Übergeben von Zugangsdatenobjekten ist eine geeignete und sichere Möglichkeit zum Speichern und Verwalten von Benutzername/Kennwort/Schlüssel, die für die Authentifizierung verwendet werden sollen.

Die UTL_HTTP.SET_CREDENTIAL-Prozedur ist eine sichere und praktische Alternative zur UTL_HTTP.SET_AUTHENTICATION-Prozedur.

Beispiel


...
UTL_HTTP.SET_AUTHENTICATION (l_http_request, 'web_app_user', 'xxxxxxxxxxxx');
...

Wie im obigen Beispiel gezeigt, müssen Sie beim Aufrufen der Prozedur SET_AUTHENTICATION den Benutzernamen/das Kennwort als Teil der formalen PL/SQL-Parameter in Klartext übergeben. Möglicherweise müssen Sie den Benutzernamen/das Kennwort in verschiedene PL/SQL-Automatisierungs- oder Cron-Skripte einbetten. Das Übergeben von Klartextpasswörtern ist ein Complianceproblem, das in der Prozedur UTL_HTTP.SET_CREDENTIAL behoben wird.

Weitere Informationen finden Sie unter Prozedur SET_AUTHENTICATION und Prozedur SET_AUTHENTICATION_FROM_WALLET.

UTL_HTTP.SET_CREDENTIAL-Syntax

UTL_HTTP.SET_CREDENTIAL (
    r          IN OUT NOCOPY req,
    credential IN VARCHAR2,
    scheme     IN VARCHAR2 DEFAULT 'Basic',
    for_proxy  IN BOOLEAN  DEFAULT FALSE);

Beispiel für die Übergabe eines Zugangsdatenobjekts in der Prozedur SET_CREDENTIAL:

  • Erstellen Sie ein Zugangsdatenobjekt:

    BEGIN DBMS_CLOUD.CREATE_CREDENTIAL (
        credential_name => 'HTTP_CRED',
        username        => 'web_app_user',
        password        => '<password>' );
    END;

    Dadurch wird ein Zugangsdatenobjekt erstellt, das ein gespeichertes Benutzername/Kennwort-Paar erstellt.

    Weitere Informationen finden Sie unter Prozedur CREATE_CREDENTIAL.

    Weitere Informationen finden Sie unter Zugangsdaten für Scheduler-Jobs angeben.

  • Rufen Sie die Prozedur UTL_HTTP.SET_CREDENTIAL auf:

    DECLARE
          l_http_request  UTL_HTTP.REQ;
        BEGIN 
          l_http_request := UTL_HTTP.BEGIN_REQUEST('https://www.example.com/v1/dwcsdev/NAME/dwcs_small_xt1.csv');
          UTL_HTTP.SET_CREDENTIAL (l_http_request, 'HTTP_CRED','BASIC');
          ...
    END;
    

    In diesem Beispiel wird zunächst eine Anforderung erstellt, indem die Prozedur BEGIN_REQUEST aufgerufen wird, und HTTP-Authentifizierungsinformationen werden im HTTP-Anforderungsheader durch Aufrufen der Prozedur SET_CREDENTIAL festgelegt. Der Webserver benötigt diese Informationen, um die Anforderung zu autorisieren. Der Wert l_http_request ist die HTTP-Anforderung, HTTP_CRED ist der Zugangsdatenname und BASIC ist das HTTP-Authentifizierungsschema.

Weitere Informationen finden Sie unter UTL_HTTP.

Informationen zu Einschränkungen für UTL_HTTP finden Sie unter Hinweise zum PL/SQL-Package für Autonomous Database.

Hinweise zum Weiterleiten von HTTP-Anforderungen mit Oracle APEX oder Database Actions

Wenn Sie mit Oracle APEX SQL Commands oder Database Actions SQL Worksheet mehrere sequenzielle SQL-Befehle ausführen, können die Befehle in verschiedenen Datenbanksessions ausgeführt werden, die den Status einer vorherigen Anweisung nicht speichern. Dieses Verhalten unterscheidet sich von Desktop-SQL-Clients wie SQL*Plus und SQL Developer, die eine persistente Verbindung zur Datenbank aufrechterhalten.

Die Weiterleitungen der SQL-Arbeitsblätter für Oracle APEX SQL Commands und Database Actions an eine Autonomous Database-Instanz sind zustandslos. Das bedeutet, dass die Ausführung einzelner SQL- und PL/SQL-Anweisungen den Status im Datenbankspeicher speichern kann, z.B. wenn Sie einen Befehl zur Verwendung eines Wallets übermitteln, der Status jedoch möglicherweise gelöscht wird, bevor Sie die nächste Anweisung ausführen.

In der folgenden Tabelle finden Sie die Schritte zum Beibehalten des Datenbankspeicherstatus zwischen Anweisungsausführungen für SQL-Befehle, die Sie an Autonomous Database weiterleiten.

SQL-Befehlstool Anweisungen als Block weiterleiten
Datenbankaktionen - SQL-Arbeitsblatt
  • Wählen Sie alle Anweisungen aus, und klicken Sie auf Anweisung ausführen
  • Wählen Sie nichts aus, und klicken Sie auf Als SQL-Skript ausführen
Oracle APEX SQL-Befehle

APEX SQL Commands unterstützt nur die Ausführung einzelner Anweisungen. Wenn Sie mehrere Anweisungen ausführen möchten, müssen Sie die Anweisungen in einem einzelnen anonymen PL/SQL-Block umbrechen. Um den Block mit APEX SQL-Befehlen auszuführen, klicken Sie auf Ausführen.

Beispiel: Verwenden Sie den folgenden Codeblock, um einen utl_http.request()-Befehl auszuführen, der ein vom Kunden verwaltetes Wallet verwendet:

SELECT utl_http.request(url => 'https://api.example.com/', wallet_path => 'file:path_to_wallet', wallet_password => 'password' ) FROM DUAL";

Vergleichen Sie dies mit zwei aufeinanderfolgenden Anweisungen, die möglicherweise nicht erfolgreich ausgeführt werden, wenn der Befehl utl_http.set_wallet() und die Anweisung utl_http.request() einzeln und nicht als einzelner Codeblock ausgeführt werden:

EXEC utl_http.set_wallet('file:WALLET_DIR/wallet.sso', 'password');
SELECT utl_http.request('https://api.example.com/') FROM DUAL;