Chiama Web Service da Autonomous Database

Descrive le opzioni per chiamare i servizi Web da Autonomous Database.

Sono disponibili diverse opzioni per chiamare i servizi Web da Autonomous Database, tra cui:

  • Utilizzare le API REST DBMS_CLOUD: la funzione DBMS_CLOUD.SEND_REQUEST avvia una richiesta HTTP, ottiene la risposta e termina la risposta. Questa funzione fornisce un workflow per l'invio di una richiesta API REST cloud con argomenti e la funzione restituisce un codice di risposta e un payload. Per ulteriori informazioni, vedere SEND_REQUEST Funzione e procedura.

  • Utilizzare Oracle APEX: è possibile interagire con i servizi Web sia in stile SOAP che in stile RESTful da APEX nell'istanza di Autonomous Database. Per ulteriori informazioni, vedere Utilizzare i servizi Web con Oracle APEX.

  • Utilizzare UTL_HTTP per inviare una richiesta a un sito pubblico. Per ulteriori informazioni, vedere Sottomettere una richiesta HTTP a un host pubblico.

  • Utilizzare UTL_HTTP per inviare una richiesta a un sito privato. Per ulteriori informazioni, vedere Sottomettere una richiesta HTTP a un host privato.

    Quando l'istanza di Autonomous Database si trova in un endpoint privato, è possibile utilizzare un wallet gestito dai clienti con le procedure disponibili in UTL_HTTP, DBMS_LDAP, UTL_SMTP o UTL_TCP. Per ulteriori informazioni, vedere Effettua chiamate esterne utilizzando un wallet gestito dal cliente.

Per informazioni sulle limitazioni per UTL_HTTP su Autonomous Database, vedere PL/SQL Package Notes for Autonomous Database.

Temi

Invia una richiesta HTTP a un host pubblico

Fornisce i dettagli per l'utilizzo di UTL_HTTP per sottomettere una richiesta HTTP su un host pubblico.

Ad esempio, per sottomettere una richiesta HTTP per un host pubblico www.example.com, creare una lista di controllo dell'accesso per l'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;

Quindi invia la richiesta HTTP:

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

Se l'istanza di Autonomous Database si trova in un endpoint privato e si desidera che le chiamate UTL_HTTP agli host pubblici siano soggette alle regole di uscita della VCN dell'endpoint privato, impostare la proprietà del database ROUTE_OUTBOUND_CONNECTIONS su PRIVATE_ENDPOINT.

Per ulteriori informazioni, vedere Maggiore sicurezza per le connessioni in uscita con endpoint privati.

Per informazioni sulle limitazioni per UTL_HTTP su Autonomous Database, vedere PL/SQL Package Notes for Autonomous Database.

Invia una richiesta HTTP a un host privato

Descrive i passi per utilizzare UTL_HTTP per inviare una richiesta HTTP su un host privato.

Per sottomettere una richiesta a un host di destinazione in un endpoint privato, l'host di destinazione deve essere accessibile dalla VCN Oracle Cloud Infrastructure del database di origine. Ad esempio, è possibile connettersi all'host di destinazione quando:

  • Sia il database di origine che l'host di destinazione si trovano nella stessa VCN di Oracle Cloud Infrastructure.

  • Il database di origine e l'host di destinazione si trovano in diverse VCN di Oracle Cloud Infrastructure abbinate.

  • L'host di destinazione è una rete in locale connessa alla VCN di Oracle Cloud Infrastructure del database di origine utilizzando FastConnect o VPN.

Puoi anche effettuare chiamate UTL_HTTP con un wallet gestito dal cliente quando Autonomous Database si trova in un endpoint privato. Per ulteriori informazioni, vedere Effettua chiamate esterne utilizzando un wallet gestito dal cliente.

Per effettuare una richiesta UTL_HTTP a una destinazione in un endpoint privato, effettuare le operazioni riportate di seguito.

  1. Creare una lista di controllo dell'accesso per l'host.

    Ad esempio:

    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;
    /

    Come illustrato in questo esempio, quando si crea una lista di controllo dell'accesso per l'host, specificare il parametro private_target con il valore TRUE.

    Nota

    Se si imposta ROUTE_OUTBOUND_CONNECTIONS su PRIVATE_ENDPOINT, l'impostazione del parametro private_target su TRUE non è richiesta in questa API. Per ulteriori informazioni, vedere Maggiore sicurezza per le connessioni in uscita con endpoint privati.
  2. Sottomettere la richiesta HTTP:

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

Per informazioni sulle limitazioni per UTL_HTTP su Autonomous Database, vedere PL/SQL Package Notes for Autonomous Database.

Invia una richiesta HTTP a un sito privato con un proxy

Quando l'istanza di Autonomous Database si trova in un endpoint privato, è possibile utilizzare un proxy per inviare le richieste HTTP con UTL_HTTP.

Quando l'istanza di Autonomous Database si trova in un endpoint privato, per utilizzare UTL_HTTP con un proxy di destinazione, il proxy di destinazione deve essere accessibile dalla VCN Oracle Cloud Infrastructure del database di origine.

Ad esempio, è possibile connettersi utilizzando un proxy nei seguenti casi:

  • Sia il database di origine che il server proxy si trovano nella stessa VCN di Oracle Cloud Infrastructure.

  • Il database di origine e il server proxy si trovano in diverse VCN di Oracle Cloud Infrastructure abbinate.

  • Il server proxy è una rete in locale connessa alla VCN di Oracle Cloud Infrastructure del database di origine utilizzando FastConnect o VPN.

È inoltre possibile effettuare chiamate UTL_HTTP utilizzando un wallet gestito dal cliente. Per ulteriori informazioni, vedere Effettua chiamate esterne utilizzando un wallet gestito dal cliente.

Per utilizzare un server proxy con UTL_HTTP:

  1. Impostare l'ACL HTTP_PROXY sul server proxy.

    Ad esempio:

    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;
    /

    Come illustrato in questo esempio, quando si crea una lista di controllo dell'accesso per il server proxy, specificare il parametro private_target con il valore TRUE.

    Nota

    Se si imposta ROUTE_OUTBOUND_CONNECTIONS su PRIVATE_ENDPOINT, l'impostazione del parametro private_target su TRUE non è richiesta in questa API. Per ulteriori informazioni, vedere Maggiore sicurezza per le connessioni in uscita con endpoint privati.
  2. Impostare l'ACL HTTP sul server Web remoto.

    Ad esempio:

    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. Impostare il wallet e il proxy per UTL_HTTP.

    Ad esempio:

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

Note per l'impostazione di un server proxy con UTL_HTTP.SET_PROXY:

  • Le richieste DBMS_CLOUD non soddisfano il server proxy impostato con UTL_HTTP.SET_PROXY. Sono inclusi DBMS_CLOUD.SEND_REQUEST e tutti gli accessi allo storage degli oggetti per le tabelle esterne DBMS_CLOUD definite con DBMS_CLOUD.CREATE_EXTERNAL_TABLE, DBMS_CLOUD.CREATE_EXTERNAL_PART_TABLE o DBMS_CLOUD.CREATE_HYBRID_PART_TABLE.

  • Le richieste APEX_WEB_SERVICE non soddisfano il server proxy impostato con UTL_HTTP.SET_PROXY.

Per informazioni sulle limitazioni per UTL_HTTP su Autonomous Database, vedere PL/SQL Package Notes for Autonomous Database.

Usa oggetti credenziali per impostare l'autenticazione HTTP

Descrive come passare oggetti credenziali alla procedura UTL_HTTP.SET_CREDENTIAL.

La procedura UTL_HTTP.SET_CREDENTIAL imposta le informazioni di autenticazione HTTP nell'intestazione della richiesta HTTP. Il server Web richiede queste informazioni per autorizzare la richiesta.

La procedura UTL_HTTP.SET_CREDENTIAL consente di passare gli oggetti delle credenziali per impostare l'autenticazione HTTP. Gli oggetti delle credenziali sono oggetti dello schema, pertanto possono essere accessibili solo dagli utenti con privilegi e consentono di configurare i privilegi a livello di schema per controllare le credenziali. Il passaggio degli oggetti delle credenziali è un modo appropriato e sicuro per memorizzare e gestire nome utente/password/chiavi da utilizzare per l'autenticazione.

La procedura UTL_HTTP.SET_CREDENTIAL è un'alternativa sicura e conveniente alla procedura UTL_HTTP.SET_AUTHENTICATION.

Esempio


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

Come illustrato nell'esempio precedente, quando si richiama la procedura SET_AUTHENTICATION, è necessario passare il nome utente/password in testo non codificato come parte dei parametri formali PL/SQL. Potrebbe essere necessario incorporare il nome utente/password in vari script di automazione o cron PL/SQL. Il passaggio di password in chiaro è un problema di conformità che viene risolto nella procedura UTL_HTTP.SET_CREDENTIAL.

Per ulteriori informazioni, vedere SET_AUTHENTICATION Procedura e Procedura SET_AUTHENTICATION_FROM_WALLET.

Sintassi UTL_HTTP.SET_CREDENTIAL

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

Esempio di passaggio di un oggetto credenziale nella procedura SET_CREDENTIAL:

  • Crea un oggetto credenziali:

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

    Questo crea un oggetto credenziali che crea una coppia nome utente/password memorizzata.

    Per ulteriori informazioni, vedere CREATE_CREDENTIAL Procedura.

    Per ulteriori informazioni, vedere Specifica delle credenziali del job dello scheduler.

  • Richiama la procedura UTL_HTTP.SET_CREDENTIAL:

    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 primo luogo, questo esempio crea una richiesta richiamando la procedura BEGIN_REQUEST e imposta le informazioni di autenticazione HTTP nell'intestazione della richiesta HTTP richiamando la procedura SET_CREDENTIAL. Il server Web richiede queste informazioni per autorizzare la richiesta. Il valore l_http_request è la richiesta HTTP, HTTP_CRED è il nome delle credenziali e BASIC è lo schema di autenticazione HTTP.

Vedere UTL_HTTP.

Per informazioni sulle limitazioni per UTL_HTTP su Autonomous Database, vedere PL/SQL Package Notes for Autonomous Database.

Note per l'invio di richieste HTTP con Oracle APEX o Database Actions

Quando si utilizzano i comandi SQL di Oracle APEX o il foglio di lavoro SQL di Database Actions per eseguire più comandi SQL sequenziali, i comandi possono essere eseguiti in diverse sessioni di database che non salvano lo stato di un'istruzione precedente. Questo comportamento è diverso dai client SQL desktop, ad esempio SQL*Plus e SQL Developer, che gestiscono una connessione persistente al database.

I comandi SQL di Oracle APEX e le sottomissioni del foglio di lavoro SQL di Database Actions a un'istanza di Autonomous Database sono senza conservazione di stato. Ciò significa che l'esecuzione di singole istruzioni SQL e PL/SQL può salvare lo stato nella memoria del database, ad esempio quando si sottomette un comando per utilizzare un wallet, ma lo stato potrebbe essere cancellato prima di eseguire l'istruzione successiva.

Visualizzare la tabella riportata di seguito relativa ai passi per mantenere lo stato della memoria del database tra le esecuzioni delle istruzioni per i comandi SQL sottomessi ad Autonomous Database.

Strumento di comando SQL Sottometti istruzioni come blocco
Foglio di lavoro SQL Database Actions
  • Selezionare tutte le istruzioni e fare clic su Esegui istruzione
  • Non selezionare nulla e fare clic su Esegui come script SQL
Comandi SQL di Oracle APEX

I comandi SQL APEX supportano solo l'esecuzione di singole istruzioni. Quando si desidera eseguire più istruzioni, è necessario eseguire il wrapping delle istruzioni in un singolo blocco anonimo PL/SQL. Per eseguire il blocco con i comandi SQL APEX, fare clic su Esegui.

Ad esempio, utilizzare il seguente blocco di codice per eseguire un comando utl_http.request() che utilizza un wallet gestito dal cliente:

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

Confrontare l'esecuzione con due istruzioni consecutive che potrebbero non riuscire se il comando utl_http.set_wallet() e l'istruzione utl_http.request() vengono eseguiti singolarmente, anziché come blocco di codice singolo:

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