Utilizza i servizi Web con Oracle APEX

È possibile interagire con i servizi Web di stile SOAP e RESTful di Oracle APEX nell'istanza di Autonomous Database.

I servizi Web consentono alle applicazioni di interagire tra loro sul Web in un ambiente indipendente dalla lingua e indipendente dalla piattaforma. In uno scenario tipico dei servizi Web, un'applicazione business invia una richiesta a un servizio in un determinato URL utilizzando il protocollo HTTP. Il servizio riceve la richiesta, la elabora e restituisce una risposta. I servizi Web si basano in genere su architetture SOAP (Simple Object Access Protocol) o Representational State Transfer (REST).

Utilizzando le origini dati REST, gli sviluppatori APEX possono accedere in modo dichiarativo ai servizi di dati da una vasta gamma di endpoint REST, consentendo operazioni di lettura e scrittura. Oltre a supportare le regole di inserimento nella cache intelligente per i dati REST remoti, Oracle APEX offre anche la possibilità esclusiva di manipolare direttamente i risultati delle origini dati REST utilizzando SQL standard del settore.

Il package APEX_WEB_SERVICE consente di integrare altri sistemi con APEX consentendo di interagire con i servizi Web ovunque sia possibile utilizzare PL/SQL nell'applicazione. Il pacchetto contiene procedure e funzioni per chiamare i servizi Web in stile SOAP e RESTful e per semplificare l'implementazione dei flussi OAuth 2.0.

Invia una richiesta HTTP a un host privato con Oracle APEX

Esistono diversi requisiti per sottomettere una richiesta HTTP a un host privato da Oracle APEX nell'istanza di Autonomous Database.

Per sottomettere una richiesta a un host di destinazione su un endpoint privato o dietro firewall on premise, l'host di destinazione deve essere accessibile dalla VCN Oracle Cloud Infrastructure del database di origine:

  1. Assicurarsi che l'endpoint soddisfi i prerequisiti per sottomettere una richiesta HTTP, come descritto qui: Sottomettere una richiesta HTTP a un host privato con UTL_HTTP.

  2. Aggiungere la seguente lista di controllo dell'accesso per l'host desiderato come ADMIN (notare il parametro private_target):

    BEGIN
      DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
        host => 'www.example.com',
        ace => XS$ACE_TYPE(
          privilege_list => XS$NAME_LIST('http'),
          principal_name => APEX_APPLICATION.g_flow_schema_owner,
          principal_type => XS_ACL.ptype_db),
        private_target => true);
    END;
    /
Nota

Se si imposta la proprietà del database ROUTE_OUTBOUND_CONNECTIONS su PRIVATE_ENDPOINT, non è necessario definire liste di controllo dell'accesso per i singoli host per accedervi da APEX. Per ulteriori informazioni, vedere Sicurezza avanzata per le connessioni in uscita con endpoint privati.

Effettua chiamate esterne utilizzando un wallet gestito dal cliente con Oracle APEX

Oracle APEX su Autonomous Database è preconfigurato con un Oracle Wallet che funzionerà con la maggior parte degli endpoint HTTPS. Se si desidera utilizzare le API REST dai server che utilizzano certificati SSL meno comuni o autofirmati, è possibile configurare un wallet gestito dal cliente.

Oracle APEX su Autonomous Database è preconfigurato con un Oracle Wallet che contiene più di 90 dei certificati SSL root e intermedi più comuni. Il pacchetto APEX_WEB_SERVICE sfrutta automaticamente questo Oracle Wallet senza ulteriori configurazioni da parte degli sviluppatori di applicazioni.

Se si desidera utilizzare le API REST dai server che utilizzano certificati SSL meno comuni o autofirmati, è possibile configurare un wallet gestito dal cliente. In primo luogo, seguire le istruzioni di configurazione e distribuzione in Prerequisiti per l'uso di un wallet gestito dal cliente con chiamate esterne. Dopo la distribuzione del wallet ad Autonomous Database, concedere READ sull'oggetto directory contenente il wallet allo schema della piattaforma APEX come ADMIN:

BEGIN
  execute immediate 'grant READ on directory WALLET_DIR to ' ||
    APEX_APPLICATION.g_flow_schema_owner;
END;

Successivamente, quando si fa riferimento al wallet nelle chiamate API APEX_WEB_SERVICE, assicurarsi di utilizzare il prefisso DIR: anziché il solito prefisso FILE:. Ad esempio:

l_resp := APEX_WEB_SERVICE.MAKE_REST_REQUEST(
  p_url         => 'https://www.example.com/',
  p_http_method => 'GET',
  p_wallet_path => 'DIR:WALLET_DIR'
);

È inoltre possibile configurare questo wallet come predefinito per l'intera istanza di Oracle APEX in APEX Administration Services selezionando Gestisci istanza → Impostazioni istanza → Wallet → Percorso wallet oppure impostando il parametro di istanza WALLET_PATH.

Per tornare al wallet preconfigurato, impostare WALLET_PATH su un valore vuoto.

Per ulteriori informazioni, vedere Accedere a Oracle APEX Administration Services.

Effettua chiamate esterne utilizzando un proxy Web con Oracle APEX

L'istanza di Oracle APEX non richiede un proxy Web in uscita per effettuare chiamate alle API REST esterne. Se lo si desidera, gli Autonomous Database configurati con un endpoint privato possono utilizzare un proxy Web distribuito nella VCN.

Per utilizzare un proxy Web, definire la seguente lista di controllo dell'accesso come ADMIN:

BEGIN
  DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
    host           => 'www-proxy.example.com',
    lower_port     => 80,
    ace => XS$ACE_TYPE( 
      privilege_list => XS$NAME_LIST('HTTP_PROXY'),
      principal_name => APEX_APPLICATION.g_flow_schema_owner,
      principal_type => XS_ACL.ptype_db),
    private_target => true);
END;
/

Quindi, è possibile utilizzare il proxy Web nelle chiamate API APEX_WEB_SERVICE:

l_resp := APEX_WEB_SERVICE.MAKE_REST_REQUEST(
  p_url            => 'https://www.example.com/',
  p_http_method    => 'GET',
  p_proxy_override => 'www-proxy.example.com:80'
);

È inoltre possibile configurare un proxy Web a livello di applicazione impostando la proprietà Server proxy nella pagina Componenti condivisi → Definizione applicazione → Proprietà o a livello di istanza in APEX Administration Services da Gestisci istanza → Sicurezza → Proxy istanza.

Se si tenta di utilizzare un proxy Web quando Autonomous Database è configurato con un endpoint pubblico, viene restituito un errore:

ORA-01031: insufficient privileges

Per ulteriori informazioni sui proxy quando si utilizza l'API UTL_HTTP, vedere Invia una richiesta HTTP a un host privato con UTL_HTTP.

Per ulteriori informazioni, vedere Accedere a Oracle APEX Administration Services.

Note per l'utilizzo dei servizi Web con Oracle APEX

Fornisce note per l'utilizzo dei servizi Web in Oracle APEX da un'istanza di Autonomous Database.

Tenere presente quanto riportato di seguito quando si utilizzano i servizi Web in Oracle APEX.

  • Tutti i servizi Web devono essere protetti. Sulla porta predefinita (443) sono supportati solo i servizi HTTPS. Le connessioni tramite indirizzi IP non sono consentite.

  • Ogni istanza di Autonomous Database è preconfigurata con una lista di controllo dell'accesso di rete (ACL, Network Access Control List) per consentire le chiamate dei servizi Web in uscita da Oracle APEX agli endpoint pubblici.

  • Le richieste APEX_WEB_SERVICE non rispettano il wallet personalizzato impostato con le chiamate API UTL_HTTP.SET_WALLET.

  • È previsto un limite predefinito di 1.000 richieste di servizio Web in uscita per ogni area di lavoro APEX in un periodo di 24 ore in sequenza (ciò vale per i nuovi database, alcuni database meno recenti potrebbero avere un limite maggiore). Se viene raggiunto il limite di chiamate del servizio Web in uscita, nella richiesta successiva viene generata la seguente eccezione SQL e la richiesta viene bloccata:

    ORA-20001: You have exceeded the maximum number of web service requests per workspace. Please contact your administrator.

    È possibile aumentare o rimuovere il limite predefinito delle richieste di servizio Web in uscita impostando un valore per il parametro di istanza MAX_WEBSERVICE_REQUESTS o aggiornando l'attributo Numero massimo di richieste di servizio Web in APEX Administration Services. Ad esempio, per modificare il limite a 250.000, connettersi al database come ADMIN utilizzando un client SQL ed eseguire quanto segue:

    BEGIN
      APEX_INSTANCE_ADMIN.SET_PARAMETER('MAX_WEBSERVICE_REQUESTS', '250000');
      COMMIT;
    END;
    /

Per ulteriori informazioni, vedere: