Usa Web Services con Oracle APEX

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

I servizi Web consentono alle applicazioni di interagire tra loro tramite il Web in un ambiente indipendente dalla lingua e neutrale 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 sono in genere basati su architetture SOAP (Simple Object Access Protocol) o REST (Representational State Transfer).

Utilizzando le origini dati REST, gli sviluppatori APEX possono accedere in modo dichiarativo ai servizi dati da una vasta gamma di endpoint REST, consentendo operazioni sia di lettura che di scrittura. Oltre a supportare 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 pacchetto 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 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 in locale, 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 le liste di controllo dell'accesso per singoli host per accedervi da APEX. Per ulteriori informazioni, vedere Maggiore sicurezza 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 da server che utilizzano certificati SSL meno comuni o con firma automatica, è 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 radice e intermedi sicuri 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 da server che utilizzano certificati SSL meno comuni o con firma automatica, è possibile configurare un wallet gestito dal cliente. In primo luogo, seguire le istruzioni di configurazione e distribuzione in Prerequisiti per l'utilizzo di un wallet gestito dal cliente con chiamate esterne. Dopo aver distribuito il wallet in Autonomous Database, concedere READ nell'oggetto directory che contiene 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.

Effettuare 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. Gli Autonomous Database configurati con un endpoint privato possono utilizzare un proxy Web distribuito nella VCN, se lo si desidera.

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à oppure 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 Sottomettere 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.

Quando si utilizzano i servizi Web in Oracle APEX, tenere presente quanto riportato di seguito.

  • Tutti i servizi Web devono essere protetti. Solo i servizi HTTPS sono supportati sulla porta predefinita (443). 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 chiamate ai servizi Web in uscita da Oracle APEX agli endpoint pubblici.

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

  • È previsto un limite predefinito di 50.000 richieste di servizio Web in uscita per area di lavoro APEX in un periodo di 24 ore continuative. Se viene raggiunto il limite delle chiamate al servizio Web in uscita, viene generata la seguente eccezione SQL nella richiesta successiva 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 impostandolo su 250.000, connettersi al database come ADMIN utilizzando un client SQL ed eseguire le operazioni riportate di seguito.

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

Per ulteriori informazioni, vedere: