Appeler des services Web à partir d'une base de données d'IA autonome
Décrit les options d'appel de services Web à partir d'une base de données Autonomous AI.
Plusieurs options permettent d'appeler des services Web à partir d'une base de données Autonomous AI, notamment :
-
Utiliser les API REST
DBMS_CLOUD: la fonctionDBMS_CLOUD.SEND_REQUESTdémarre une demande HTTP, obtient la réponse et met fin à la réponse. Cette fonction fournit un workflow pour l'envoi d'une demande d'API REST cloud avec des arguments et la fonction renvoie un code de réponse et une charge utile. Pour plus d'informations, voir Fonction et procédure SEND_REQUEST. -
Utilisez Oracle APEX : vous pouvez interagir avec les services Web de type SOAP et RESTful à partir d'APEX dans votre instance de base de données Autonomous AI. Pour plus d'informations, reportez-vous à Utilisation des services Web avec Oracle APEX.
-
Utilisez
UTL_HTTPpour soumettre une demande à un site public. Pour plus d'informations, reportez-vous à Soumettre une demande HTTP à un hôte public. -
Utilisez
UTL_HTTPpour soumettre une demande à un site privé. Pour plus d'informations, reportez-vous à Soumettre une demande HTTP à un hôte privé.Lorsque votre instance de base de données Autonomous AI se trouve sur une adresse privée, vous pouvez utiliser un portefeuille géré par le client avec des procédures dans
UTL_HTTP,DBMS_LDAP,UTL_SMTPouUTL_TCP. Pour plus d'informations, reportez-vous à Création d'appels externes à l'aide d'un portefeuille géré par le client.
Pour plus d'informations sur les restrictions applicables à UTL_HTTP sur Autonomous AI Database, reportez-vous à Notes sur le package PL/SQL pour Autonomous AI Database.
Sujets
- Soumission d'une demande HTTP à un hôte public
Fournit des détails sur l'utilisation deUTL_HTTPpour soumettre une demande HTTP sur un hôte public. - Soumission d'une demande HTTP à un hôte privé
Décrit les étapes permettant d'utiliserUTL_HTTPpour soumettre une demande HTTP sur un hôte privé. - Soumission d'une demande HTTP à un site privé avec un proxy
Lorsque votre instance de base de données Autonomous AI se trouve sur une adresse privée, vous pouvez utiliser un proxy pour soumettre des demandes HTTP avecUTL_HTTP. - Utilisation d'objets d'informations d'identification pour définir l'authentification HTTP
Décrit comment transmettre des objets d'informations d'identification à la procédureUTL_HTTP.SET_CREDENTIAL. - Remarques concernant la soumission de demandes HTTP à l'aide d'Oracle APEX ou de Database Actions
Lorsque vous utilisez Oracle APEX SQL Commands ou Database Actions SQL Worksheet pour exécuter plusieurs commandes SQL séquentielles, les commandes peuvent être exécutées dans différentes sessions de base de données qui n'enregistrent pas l'état d'une instruction précédente. Ce comportement diffère des clients SQL de bureau tels que SQL*Plus et SQL Developer qui maintiennent une connexion persistante à la base de données. - Envoi d'en-têtes réseau d'identité de base de données pour les demandes HTTP sortantes
Vous pouvez configurer votre base de données Autonomous AI pour envoyer des informations d'identité de base de données en tant qu'en-têtes HTTP personnalisés lors de l'exécution de demandes HTTP sortantes.
Rubrique parent : Tâches
Soumettre une demande HTTP à un hôte public
Fournit des détails sur l'utilisation de UTL_HTTP pour soumettre une demande HTTP sur un hôte public.
Par exemple, pour soumettre une demande HTTP pour un hôte public www.example.com, créez une liste de contrôle d'accès pour l'hôte :
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;Ensuite, soumettez la demande HTTP :
SELECT UTL_HTTP.REQUEST(url => 'https://www.example.com/') FROM dual;Si votre instance de base de données Autonomous AI se trouve sur une adresse privée et que vous souhaitez que vos appels
UTL_HTTP vers des hôtes publics soient soumis aux règles sortantes du VCN de votre adresse privée, définissez la propriété de base de données ROUTE_OUTBOUND_CONNECTIONS.
Pour plus d'informations, reportez-vous à Sécurité améliorée pour les connexions sortantes avec des adresses privées.
Pour plus d'informations sur les restrictions applicables à UTL_HTTP sur Autonomous AI Database, reportez-vous à Notes sur le package PL/SQL pour Autonomous AI Database.
Rubrique parent : Appel de services Web à partir d'une base de données Autonomous AI
Soumettre une demande HTTP à un hôte privé
Décrit les étapes à suivre pour utiliser UTL_HTTP afin de soumettre une demande HTTP sur un hôte privé.
Pour soumettre une demande à un hôte cible sur une adresse privée, l'hôte cible doit être accessible à partir du VCN Oracle Cloud Infrastructure de la base de données source. Par exemple, vous pouvez vous connecter à l'hôte cible lorsque :
-
La base de données source et l'hôte cible se trouvent tous deux dans le même VCN Oracle Cloud Infrastructure.
-
La base de données source et l'hôte cible se trouvent dans différents réseaux cloud virtuels Oracle Cloud Infrastructure couplés.
-
L'hôte cible est un réseau sur site connecté au VCN Oracle Cloud Infrastructure de la base de données source à l'aide de FastConnect ou du VPN.
Vous pouvez également effectuer des appels UTL_HTTP avec un portefeuille géré par le client lorsque votre base de données Autonomous AI se trouve sur une adresse privée. Pour plus d'informations, reportez-vous à Création d'appels externes à l'aide d'un portefeuille géré par le client.
Pour envoyer une demande UTL_HTTP à une cible sur une adresse privée, procédez comme suit :
-
Créez une liste de contrôle d'accès pour l'hôte.
Par exemple :
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; /Comme indiqué dans cet exemple, lorsque vous créez une liste de contrôle d'accès pour l'hôte, indiquez le paramètre
private_targetavec la valeurTRUE.Remarque
Si vous définissez la propriété de base de donnéesROUTE_OUTBOUND_CONNECTIONS, il n'est pas nécessaire de définir le paramètreprivate_targetsurTRUEdans cette API. Pour plus d'informations, reportez-vous à Sécurité améliorée pour les connexions sortantes avec des adresses privées. -
Soumettez la demande HTTP :
SELECT UTL_HTTP.REQUEST( url => 'https://www.example.com/', https_host => 'www.example.com') FROM dual;
Pour plus d'informations sur les restrictions applicables à UTL_HTTP sur Autonomous AI Database, reportez-vous à Notes sur le package PL/SQL pour Autonomous AI Database.
Rubrique parent : Appel de services Web à partir d'une base de données Autonomous AI
Soumettre une demande HTTP à un site privé avec un proxy
Lorsque votre instance de base de données Autonomous AI se trouve sur une adresse privée, vous pouvez utiliser un proxy pour soumettre des demandes HTTP avec UTL_HTTP.
Lorsque votre instance de base de données Autonomous AI se trouve sur une adresse privée, pour utiliser UTL_HTTP avec un proxy cible, le proxy cible doit être accessible à partir du VCN Oracle Cloud Infrastructure de la base de données source.
Par exemple, vous pouvez vous connecter à l'aide d'un proxy lorsque :
-
La base de données source et le serveur proxy se trouvent tous deux dans le même VCN Oracle Cloud Infrastructure.
-
La base de données source et le serveur proxy se trouvent dans différents réseaux cloud virtuels Oracle Cloud Infrastructure couplés.
-
Le serveur proxy est un réseau sur site connecté au réseau Oracle Cloud Infrastructure VCN de la base de données source à l'aide de FastConnect ou du VPN.
Vous pouvez également effectuer des appels UTL_HTTP à l'aide d'un portefeuille géré par le client. Pour plus d'informations, reportez-vous à Création d'appels externes à l'aide d'un portefeuille géré par le client.
Pour utiliser un serveur proxy avec UTL_HTTP, procédez comme suit :
Remarques concernant la définition d'un serveur proxy avec UTL_HTTP.SET_PROXY :
-
Les demandes
DBMS_CLOUDne respectent pas le serveur proxy que vous avez défini avecUTL_HTTP.SET_PROXY. Cela inclutDBMS_CLOUD.SEND_REQUESTet tous les accès au stockage d'objets pour les tables externesDBMS_CLOUDque vous définissez avecDBMS_CLOUD.CREATE_EXTERNAL_TABLE,DBMS_CLOUD.CREATE_EXTERNAL_PART_TABLEouDBMS_CLOUD.CREATE_HYBRID_PART_TABLE. -
Les demandes
APEX_WEB_SERVICEne respectent pas le serveur proxy que vous avez défini avecUTL_HTTP.SET_PROXY.
Pour plus d'informations sur les restrictions applicables à UTL_HTTP sur Autonomous AI Database, reportez-vous à Notes sur le package PL/SQL pour Autonomous AI Database.
Rubrique parent : Appel de services Web à partir d'une base de données Autonomous AI
Utiliser des objets d'informations d'identification pour définir l'authentification HTTP
Explique comment transmettre des objets d'informations d'identification à la procédure UTL_HTTP.SET_CREDENTIAL.
La procédure UTL_HTTP.SET_CREDENTIAL définit les informations d'authentification HTTP dans l'en-tête de demande HTTP. Le serveur Web a besoin de ces informations pour autoriser la demande.
La procédure UTL_HTTP.SET_CREDENTIAL vous permet de transmettre des objets d'informations d'identification pour définir l'authentification HTTP. Les objets d'informations d'identification sont des objets de schéma. Par conséquent, seuls les utilisateurs privilégiés peuvent y accéder et vous permettent de configurer des privilèges de niveau schéma pour accéder au contrôle des informations d'identification. La transmission d'objets d'informations d'identification est un moyen approprié et sécurisé de stocker et de gérer le nom utilisateur/mot de passe/clés à utiliser pour l'authentification.
La procédure UTL_HTTP.SET_CREDENTIAL est une alternative sécurisée et pratique à la procédure UTL_HTTP.SET_AUTHENTICATION.
Exemple
...
UTL_HTTP.SET_AUTHENTICATION (l_http_request, 'web_app_user', 'xxxxxxxxxxxx');
...Comme indiqué dans l'exemple ci-dessus, lorsque vous appelez la procédure SET_AUTHENTICATION, vous devez transmettre le nom utilisateur/mot de passe en texte clair dans le cadre des paramètres formels PL/SQL. Vous devrez peut-être intégrer le nom utilisateur/mot de passe dans divers scripts cron ou d'automatisation PL/SQL. La transmission de mots de passe en texte clair est un problème de conformité traité dans la procédure UTL_HTTP.SET_CREDENTIAL.
Pour plus d'informations, reportez-vous à Procédure SET_AUTHENTICATION et à Procédure SET_AUTHENTICATION_FROM_WALLET.
Syntaxe 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);Exemple de transmission d'un objet d'informations d'identification dans la procédure SET_CREDENTIAL :
-
Créez un objet d'informations d'identification :
BEGIN DBMS_CLOUD.CREATE_CREDENTIAL ( credential_name => 'HTTP_CRED', username => 'web_app_user', password => '<password>' ); END;Cette opération crée un objet d'informations d'identification qui crée une paire nom utilisateur/mot de passe stockée.
Pour plus d'informations, reportez-vous à Procédure CREATE_CREDENTIAL.
Pour plus d'informations, reportez-vous à Spécification des informations d'identification de travail du planificateur.
-
Appelez la procédure
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;Cet exemple crée d'abord une demande en appelant la procédure
BEGIN_REQUESTet définit les informations d'authentification HTTP dans l'en-tête de demande HTTP en appelant la procédureSET_CREDENTIAL. Le serveur Web a besoin de ces informations pour autoriser la demande. La valeurl_http_requestest la demande HTTP,HTTP_CREDest le nom des informations d'identification etBASICest le modèle d'authentification HTTP.
Pour plus d'informations, reportez-vous à UTL_HTTP.
Pour plus d'informations sur les restrictions applicables à UTL_HTTP sur Autonomous AI Database, reportez-vous à Notes sur le package PL/SQL pour Autonomous AI Database.
Rubrique parent : Appel de services Web à partir d'une base de données Autonomous AI
Remarques concernant la soumission de demandes HTTP avec Oracle APEX ou Database Actions
Lorsque vous utilisez Oracle APEX SQL Commands ou Database Actions SQL Worksheet pour exécuter plusieurs commandes SQL séquentielles, les commandes peuvent être exécutées dans différentes sessions de base de données qui n'enregistrent pas l'état d'une instruction précédente. Ce comportement diffère des clients SQL de bureau tels que SQL*Plus et SQL Developer qui maintiennent une connexion persistante à la base de données.
Les commandes SQL Oracle APEX et les soumissions de feuille de calcul SQL Database Actions à une instance de base de données Autonomous AI sont sans conservation de statut. Cela signifie que l'exécution d'instructions SQL et PL/SQL individuelles peut enregistrer l'état dans la mémoire de la base de données, par exemple lorsque vous soumettez une commande pour utiliser un "wallet", mais que l'état peut être effacé avant d'exécuter l'instruction suivante.
Consultez le tableau suivant pour connaître les étapes à suivre pour conserver l'état de mémoire de la base de données entre les exécutions d'instruction pour les commandes SQL que vous soumettez à la base de données Autonomous AI.
| Outil de commande SQL | Soumettre des instructions en tant que bloc |
|---|---|
| Feuille de calcul SQL Database Actions |
|
| Commandes SQL d'Oracle APEX |
Les commandes SQL APEX prennent uniquement en charge l'exécution d'instructions individuelles. Pour exécuter plusieurs instructions, vous devez les encapsuler dans un seul bloc anonyme PL/SQL. Pour exécuter le bloc avec les commandes SQL APEX, cliquez sur Exécuter. |
Par exemple, utilisez le bloc de code suivant pour exécuter une commande utl_http.request() qui utilise un portefeuille géré par le client :
SELECT utl_http.request(url => 'https://api.example.com/', wallet_path => 'file:path_to_wallet', wallet_password => 'password' ) FROM DUAL";Comparez cela à l'exécution avec deux instructions consécutives qui pourraient échouer si la commande utl_http.set_wallet() et l'instruction utl_http.request() s'exécutaient individuellement, plutôt qu'en tant que bloc de code unique :
EXEC utl_http.set_wallet('file:WALLET_DIR/wallet.sso', 'password');
SELECT utl_http.request('https://api.example.com/') FROM DUAL;Rubrique parent : Appel de services Web à partir d'une base de données Autonomous AI
Envoyer les en-têtes réseau d'identité de base de données pour les demandes HTTP sortantes
Vous pouvez configurer votre base de données Autonomous AI pour envoyer des informations d'identité de base de données en tant qu'en-têtes HTTP personnalisés lors de l'exécution de demandes HTTP sortantes.
A propos des en-têtes de réseau d'identités de base de données
Les en-têtes de réseau d'identité de base de données vous permettent d'envoyer des informations d'identification propres à la base de données (par exemple, database name, region, tenancy OCID, database OCID, compartment OCID, cloud domain et client IP address) en tant qu'en-têtes HTTP personnalisés avec des demandes HTTP sortantes. Cela permet aux adresses distantes d'identifier la source des demandes entrantes.
L'en-tête de réseau d'identité de base de données extrait tous ses champs de Cloud Identity. La base de données Autonomous AI gère un objet d'identité cloud pour chaque base de données, qui inclut des métadonnées telles que le nom de base de données, le nom de région, l'OCID de location, l'OCID de base de données et l'OCID de compartiment. Oracle configure les champs d'identité pour chaque base de données. Vous pouvez le visualiser dans les vues de base de données V$PDBS. Toutefois, vous ne pourrez pas le modifier.
Avec l'en-tête de réseau d'identité de base de données, vous bénéficiez d'une sécurité renforcée. Les adresses distantes peuvent valider la base de données d'origine et limiter l'accès aux bases de données autorisées uniquement. Par défaut, vous devez configurer explicitement les champs d'identité à inclure et les domaines autorisés à recevoir ces en-têtes.
Configurer les en-têtes réseau d'identité de base de données
Pour chaque demande UTL_HTTP sortante, la base de données envoie automatiquement un en-tête HTTP (par exemple, X-ADB-Source-Database) dont la valeur est un document JSON avec des champs d'identité sélectionnés tels que database name, region, tenancy OCID, database OCID, compartment OCID, cloud domain et client IP address.
DATABASE_IDENTITY_NETWORK_HEADERS: indique les champs d'identité à inclure dans l'en-tête HTTP personnalisé.DATABASE_IDENTITY_NETWORK_HEADERS_DOMAINS: indique les domaines autorisés à recevoir ces en-têtes.
Conditions préalables
Vous devez configurer des listes de contrôle d'accès réseau pour autoriser l'accès HTTP sortant aux domaines cible.
Définir les champs d'identité à inclure dans les en-têtes HTTP
La propriété DATABASE_IDENTITY_NETWORK_HEADERS contrôle les champs d'identité de base de données qui sont envoyés dans le cadre de l'en-tête HTTP personnalisé X-ADB-Source-Database.
Pour configurer les champs d'identité :
DATABASE_IDENTITY_NETWORK_HEADERS sur un tableau JSON contenant un ou plusieurs des champs suivants :
DATABASE_NAME: nom de la base de données Autonomous AIREGION: région Oracle Cloud Infrastructure dans laquelle se trouve la base de donnéesTENANT_OCID: OCID (Oracle Cloud Identifier) de la locationDATABASE_OCID: OCID de la base de données Autonomous AICOMPARTMENT_OCID: OCID du compartiment contenant la base de donnéesCLOUD_DOMAIN: domaine cloud de la base de donnéesCLIENT_IP_ADDRESS: adresse IP à partir de laquelle la session utilisateur a été établie
database name, region et database OCID :ALTER DATABASE PROPERTY SET DATABASE_IDENTITY_NETWORK_HEADERS = '[
"DATABASE_NAME",
"REGION",
"DATABASE_OCID"
]';ALTER DATABASE PROPERTY SET DATABASE_IDENTITY_NETWORK_HEADERS = '[
"DATABASE_NAME",
"REGION",
"TENANT_OCID",
"DATABASE_OCID",
"COMPARTMENT_OCID",
"CLOUD_DOMAIN",
"CLIENT_IP_ADDRESS"
]';Notes d'utilisation :
- Si vous définissez cette propriété sur
null, l'API n'envoie pas les champs d'identité. Il s'agit de la valeur par défaut. - Les noms de champ sont sensibles à la casse,
- La spécification de noms ou de valeurs de champ non valides génère une erreur
ORA-60565.
Spécifier les domaines autorisés
La propriété DATABASE_IDENTITY_NETWORK_HEADERS_DOMAINS contrôle les domaines autorisés à recevoir des en-têtes d'identité de base de données.
Pour configurer les domaines autorisés :
DATABASE_IDENTITY_NETWORK_HEADERS_DOMAINS sur l'une des options suivantes :
- Un astérisque (*) pour envoyer des en-têtes à tous les domaines
- Liste de noms de domaine spécifiques séparés par des virgules
ALTER DATABASE PROPERTY SET DATABASE_IDENTITY_NETWORK_HEADERS_DOMAINS = '*';ALTER DATABASE PROPERTY SET DATABASE_IDENTITY_NETWORK_HEADERS_DOMAINS = 'objectstorage.oraclecloud.com';ALTER DATABASE PROPERTY SET DATABASE_IDENTITY_NETWORK_HEADERS_DOMAINS = 'oraclecloud.com, example.com';Notes d'utilisation :
- La correspondance de domaine est basée sur la correspondance de suffixe exacte. Par exemple, la spécification de oracle.cloud.com correspond à api.oraclecloud.com, objectstorage.oraclecloud.com et à tout autre sous-domaine de oraclecloud.com.
- Les modèles génériques (tels que *.oraclecloud.com) ne sont pas pris en charge.
- Si vous définissez cette propriété sur NULL, l'API n'envoie pas les champs d'identité. Il s'agit de la valeur par défaut.
- Les en-têtes sont envoyés uniquement lorsque
DATABASE_IDENTITY_NETWORK_HEADERSetDATABASE_IDENTITY_NETWORK_HEADERS_DOMAINSsont configurés.
Format d'en-tête HTTP
Lorsque les en-têtes réseau d'identité de base de données sont configurés, la base de données ajoute automatiquement l'en-tête personnalisé X-ADB-Source-Database aux demandes HTTP sortantes effectuées à l'aide du package UTL_HTTP.
X-ADB-Source-Database=
{"databaseName":"MYDATABASENAME",
"region":"region_identifier",
"tenantOcid":"tenant_ocid",
"databaseOcid":"database_ocid",
"compartmentOcid":"compartment_ocid",
"clientIpAddress":"client_ip_address"}L'en-tête X-ADB-Source-Database est rempli automatiquement par le noyau de base de données et ne peut pas être modifié ou défini explicitement à l'aide des API UTL_HTTP.
Vous ne pouvez pas définir cet en-tête. Si vous essayez, le système renvoie une erreur.
Vous recevrez une erreur ORA-60565: Invalid value for DATABASE_IDENTITY_NETWORK_HEADERS property si une valeur non valide est indiquée pour la propriété DATABASE_IDENTITY_NETWORK_HEADERS. La valeur doit être un tableau JSON contenant un ou plusieurs noms de champ valides et ne doit pas dépasser 4000 octets.
Rubrique parent : Appel de services Web à partir d'une base de données Autonomous AI