Sélection dynamique de back-ends de passerelle d'API sur des éléments de demande
Découvrez comment acheminer les demandes envoyées à la même passerelle d'API vers différents back-ends en fonction des éléments de la demande avec API Gateway.
Une exigence courante consiste à acheminer les demandes envoyées à la même passerelle d'API vers différents back-ends en fonction des éléments de la demande. Par exemple, pour acheminer des demandes vers différents back-ends en fonction des éléments suivants :
- Hôte et/ou domaine et/ou sous-domaine auquel une demande a été envoyée. Par exemple, pour acheminer les demandes entrantes à partir de cars.example.com et trucks.example.com qui ont été envoyées à la même passerelle d'API vers deux back-ends complètement différents.
- Plan d'utilisation auquel le client API envoyant une demande est abonné. Par exemple, pour acheminer les demandes entrantes vers un hôte standard pour les clients d'API abonnés à un plan d'utilisation
Free Tier
, ou vers un hôte hautes performances pour les clients d'API abonnés au plan d'utilisationPremium Tier
. - En-têtes et valeurs d'en-tête dans une demande. Par exemple, pour acheminer une demande qui inclut un en-tête
Accept
avec la valeurapplication/xml
vers un back-end approprié qui renvoie une réponse de ce type de contenu.
La sélection dynamique d'un back-end vous permet de présenter une façade unique aux consommateurs d'API et de les protéger de la complexité de plusieurs systèmes back-end.
Vous pouvez acheminer dynamiquement les demandes vers :
- back-ends HTTP
- back-ends de fonction sans serveur
- back-ends de réponse en stock
Lors de la définition de plusieurs back-ends pour le même déploiement d'API, vous créez des règles pour permettre à la passerelle d'API de sélectionner dynamiquement le back-end vers lequel acheminer une demande, en fonction d'un élément de la demande d'origine.
Pour permettre à la passerelle d'API de sélectionner dynamiquement le back-end approprié, utilisez les variables de contexte suivantes pour capturer les éléments de la demande :
request.auth[<key>]
où<key>
est le nom d'une réclamation renvoyée par une fonction d'autorisation ou contenue dans un jeton JWT.request.headers[<key>]
, où<key>
est le nom d'un en-tête inclus dans la demande à l'API.request.host
est le nom de l'hôte auquel la demande d'origine a été envoyée.request.path[<key>]
, où<key>
est le nom d'un paramètre de chemin défini dans la spécification de déploiement d'API.request.query[<key>]
, où<key>
est le nom d'un paramètre de requête inclus dans la demande à l'API.request.subdomain[<key>]
, où<key>
est la dernière partie du nom d'hôte à ignorer lors de la capture de la première partie du nom d'hôte auquel la demande d'origine a été envoyée.request.usage_plan[id]
, oùid
est l'OCID d'un plan d'utilisation auquel le client d'API est abonné.
Notez que si une variable de contexte comporte plusieurs valeurs, seule la première est utilisée lors de la sélection du back-end. Pour plus d'informations sur les variables de contexte, reportez-vous à Ajout de variables de contexte aux stratégies et aux définitions de back-end HTTP.
Vous définissez les critères pour sélectionner dynamiquement les back-ends dans une spécification de déploiement d'API en procédant comme suit :
- utilisant la console,
- modifiant un fichier JSON.
Remarques sur la mise en correspondance des règles back-end
Lorsque vous créez les règles pour déterminer le back-end à utiliser, vous pouvez indiquer dans quelle mesure la valeur de variable de contexte doit correspondre à une valeur donnée pour que la demande soit acheminée vers un back-end particulier. Vous pouvez exiger une correspondance exacte ou indiquer une valeur commençant par ou se terminant par un caractère générique. La passerelle d'API évalue les règles dans l'ordre indiqué (règles de correspondance exactes en premier, suivies de règles génériques) et utilise la première règle de mise en correspondance. Vous pouvez également indiquer une règle par défaut à utiliser si la valeur de la variable de contexte ne correspond à aucune règle de back-end. Si aucune règle n'est spécifiée comme règle par défaut et que la valeur de la variable de contexte dans une demande entrante ne correspond à aucune règle de back-end, la demande renvoie une erreur. L'ordre de priorité permettant de déterminer la règle de back-end (et donc le back-end) à utiliser peut être résumé comme suit :
- Si la valeur de la variable de contexte correspond exactement à la valeur d'une règle, utilisez cette règle.
- Sinon, si la valeur de la variable de contexte correspond à la valeur d'une règle qui commence ou se termine par un caractère générique, utilisez la première règle contenant un caractère générique qui correspond.
- Sinon, si une règle est définie comme règle par défaut, utilisez-la.
- Sinon, renvoyez une erreur.
Utilisation de la console pour ajouter une sélection de back-end dynamique à une spécification de déploiement d'API
Pour ajouter une sélection de back-end dynamique à une spécification de déploiement d'API à l'aide de la console, procédez comme suit :
-
Créez ou mettez à jour un déploiement d'API à l'aide de la console, sélectionnez l'option Entièrement nouveau, puis saisissez les détails sur la page Informations de base.
Pour plus d'informations, reportez-vous à Déploiement d'une API sur une passerelle d'API en créant un déploiement d'API et à Mise à jour d'une passerelle d'API.
- Sur la page Authentification, indiquez comment authentifier les demandes effectuées sur les routages dans le déploiement d'API.
Pour plus d'informations, reportez-vous à Ajout de l'authentification et de l'autorisation aux déploiements d'API.
-
Sur la page Routages, créez un routage et spécifiez les éléments suivants :
-
Chemin : chemin pour les appels d'API utilisant les méthodes répertoriées vers le service back-end. Le chemin d'accès que vous spécifiez doit remplir les conditions suivantes :
- Il doit être relatif au préfixe de chemin de déploiement (reportez-vous à Déploiement d'une API sur une passerelle d'API en créant un déploiement d'API).
- Il doit être précédé d'une barre oblique (/). Il peut également consister en une unique barre oblique.
- Il peut contenir plusieurs barres obliques (à condition qu'elles ne soient pas adjacentes), ainsi que se terminer par une barre oblique.
- Il peut inclure des caractères alphanumériques en majuscules et minuscules.
- Il peut inclure les caractères spéciaux
$ - _ . + ! * ' ( ) , % ; : @ & =
. - Il peut inclure des paramètres et des caractères génériques (reportez-vous à Ajout de paramètres de chemin et de caractères génériques aux chemins de routage).
- Méthodes : méthodes acceptées par le service back-end. Par exemple,
GET, PUT
.
-
- Sélectionnez Ajouter plusieurs back-ends pour indiquer que les demandes doivent être acheminées vers des back-ends différents, en fonction de la variable de contexte et des règles que vous entrez.
- Dans la liste Sélecteur, sélectionnez la table de contexte (contenant la variable de contexte) à utiliser pour déterminer le back-end vers lequel envoyer la demande, comme suit :
- Authentification : utilisez la valeur d'une demande renvoyée par une fonction d'autorisation ou contenue dans un jeton JWT (et enregistrée dans la table de contexte
request.auth
) pour déterminer le back-end. - En-têtes : utilisez la valeur d'un en-tête de la demande d'origine (et enregistrée dans la table de contexte
request.headers
) pour déterminer le back-end. - Hôte : utilisez le nom de l'hôte auquel la demande d'origine a été envoyée (extrait du champ hôte de l'en-tête d'hôte de la demande et enregistré dans la table de contexte
request.host
) pour déterminer le back-end. - Chemin : utilisez un paramètre de chemin de la demande d'origine (et enregistré dans la table de contexte
request.path
) pour déterminer le back-end. - Paramètres de requête : utilisez la valeur d'un paramètre de requête de la demande d'origine (et enregistrée dans la table de contexte
request.query
) pour déterminer le back-end. - Sous-domaine : utilisez la partie principale du nom d'hôte auquel la demande d'origine a été envoyée (c'est-à-dire la partie du nom d'hôte non spécifiée comme clé et enregistrée dans la table de contexte
request.subdomain
) pour déterminer le back-end. Notez que la clé est la dernière partie du nom d'hôte à ne pas utiliser. - OCID de plan d'utilisation : utilisez l'OCID d'un plan d'utilisation auquel le client d'API est abonné (identifié à partir d'un jeton client dans la demande d'origine et enregistré dans la table de contexte
request.usage_plan
) pour déterminer le back-end.
- Authentification : utilisez la valeur d'une demande renvoyée par une fonction d'autorisation ou contenue dans un jeton JWT (et enregistrée dans la table de contexte
- En fonction de la table de contexte sélectionnée, saisissez le nom de la clé à utiliser pour déterminer le back-end auquel envoyer la demande.
- Dans la liste Sélecteur, sélectionnez la table de contexte (contenant la variable de contexte) à utiliser pour déterminer le back-end vers lequel envoyer la demande, comme suit :
- Sélectionnez Définir le back-end pour entrer une règle pour la variable de contexte qui, si elle est remplie, achemine la demande vers le back-end que vous définissez.
- Entrez les détails de la règle comme suit :
- Nom : entrez le nom de la règle. Utilisez le nom que vous entrez pour identifier le back-end lorsque vous faites référence aux journaux et aux mesures.
- Type de correspondance : indiquez dans quelle mesure la valeur de variable de contexte doit correspondre à une valeur que vous entrez pour que la demande soit acheminée vers ce back-end. Sélectionnez Tout si vous voulez que la variable de contexte corresponde exactement à la valeur du champ Valeurs. Sélectionnez Caractère générique si la variable de contexte doit correspondre à une valeur du champ Expression contenant des caractères génériques. La mise en correspondance des valeurs n'est pas sensible à la casse si vous sélectionnez Une des valeurs, et la casse si vous sélectionnez Caractère générique.
- Valeurs : (affiché si vous avez sélectionné Une valeur parmi dans le champ Type de correspondance.) Indiquez une valeur (ou plusieurs valeurs dans une liste séparée par des virgules) à laquelle la variable de contexte doit correspondre exactement. Notez que la correspondance n'est pas sensible à la casse si vous avez sélectionné Un des éléments. Notez également que les valeurs doivent être uniques au sein d'une règle back-end unique et dans toutes les règles back-end définies pour le déploiement d'API.
- Expression : (affichée si vous avez sélectionné Caractère générique dans le champ Type de correspondance) Indiquez une valeur commençant par ou se terminant par un caractère générique auquel la variable de contexte doit correspondre. Utilisez le caractère générique
*
(astérisque) pour indiquer zéro ou plusieurs caractères, et/ou le caractère générique+
(signe plus) pour indiquer un ou plusieurs caractères. Notez que la correspondance est sensible à la casse si vous avez sélectionné Caractère générique. Notez que vous ne pouvez pas inclure plusieurs caractères génériques dans une valeur et que vous ne pouvez pas inclure de caractères génériques au milieu d'une valeur. Notez également qu'une configuration de caractères génériques incorrecte peut entraîner l'acheminement des demandes vers des back-ends involontaires. - Définir comme valeur par défaut : indiquez si vous souhaitez utiliser le back-end défini pour cette règle si aucune règle back-end ne correspond.
- Entrez les détails du back-end comme suit :
- Dans le champ Type de back-end, sélectionnez HTTP/HTTPS, Oracle Functions, Réponse de stockage ou Déconnexion comme back-end vers lequel acheminer la demande si la règle que vous avez entrée est respectée.
- Saisissez les détails du back-end que vous avez sélectionné. Les détails à saisir dépendent du type de back-end que vous avez sélectionné et sont décrits en détail dans :
- Utilisation de la console pour ajouter des back-ends HTTP ou HTTPS à une spécification de déploiement d'API
- Utilisation de la console pour ajouter des back-ends de fonction sans serveur à une spécification de déploiement d'API
- Utilisation de la console pour ajouter des réponses par défaut à une spécification de déploiement d'API
- Sélectionnez Définir pour créer le back-end et la règle associée.
- (Facultatif) Sélectionnez à nouveau Définir le back-end pour définir d'autres back-ends et les règles associées.
- (Facultatif) Sélectionnez Autre routage pour saisir les détails d'autres routages.
- Sélectionnez Suivant afin de vérifier les détails saisis pour le déploiement d'API.
- Sélectionnez Créer ou Enregistrer les modifications pour créer ou mettre à jour le déploiement d'API.
- (Facultatif) Vérifiez que l'API a été déployée en l'appelant (reportez-vous à Appel d'une API déployée sur une passerelle d'API).
Modification d'un fichier JSON pour ajouter une sélection de back-end dynamique à une spécification de déploiement d'API
Pour ajouter une sélection de back-end dynamique à une spécification de déploiement d'API dans un fichier JSON, procédez comme suit :
-
A l'aide de l'éditeur JSON de votre choix, créez une spécification de déploiement d'API (reportez-vous à Création d'une spécification de déploiement d'API) au format suivant :
{ "requestPolicies": {}, "routes": [ { "path": "<api-route-path>", "methods": ["<method-list>"], "backend": { "type": "DYNAMIC_ROUTING_BACKEND", "selectionSource": { "type": "SINGLE", "selector": "<context-table-key>" }, "routingBackends": [ { "key": { "type": "<ANY_OF|WILDCARD>", "values": [ "<context-variable-value>" ], "isDefault": "<true|false>", "name": "<rule-name>" }, "backend": { "type": "<backend-type>", "<backend-target>": "<identifier>" } } ] } } ] }
où :
"requestPolicies"
indique des stratégies facultatives permettant de contrôler le comportement d'un déploiement d'API. Pour appliquer des stratégies à tous les routages dans une spécification de déploiement d'API, placez les stratégies en dehors de la sectionroutes
. Pour appliquer les stratégies uniquement à un routage spécifique, placez les stratégies dans la sectionroutes
. Reportez-vous à Ajout de stratégies de demande et de réponse aux spécifications de déploiement d'API.-
<api-route-path>
spécifie un chemin pour les appels d'API utilisant les méthodes répertoriées vers le service back-end. Le chemin d'accès que vous spécifiez doit remplir les conditions suivantes :- Il doit être relatif au préfixe de chemin de déploiement (reportez-vous à Déploiement d'une API sur une passerelle d'API en créant un déploiement d'API).
- Il doit être précédé d'une barre oblique (/). Il peut également consister en une unique barre oblique.
- Il peut contenir plusieurs barres obliques (à condition qu'elles ne soient pas adjacentes), ainsi que se terminer par une barre oblique.
- Il peut inclure des caractères alphanumériques en majuscules et minuscules.
- Il peut inclure les caractères spéciaux
$ - _ . + ! * ' ( ) , % ; : @ & =
. - Il peut inclure des paramètres et des caractères génériques (reportez-vous à Ajout de paramètres de chemin et de caractères génériques aux chemins de routage).
<method-list>
indique les méthodes acceptées par le service back-end, séparées par des virgules. Par exemple,"GET, PUT"
."type": "DYNAMIC_ROUTING_BACKEND"
indique que vous voulez sélectionner dynamiquement le back-end en fonction des éléments de la demande."type": "SINGLE"
indique que vous voulez utiliser une seule variable de contexte pour sélectionner dynamiquement le back-end."selector": "<context-table-key>"
indique la table de contexte (et la clé, le cas échéant) à partir de laquelle obtenir la valeur de variable de contexte qui détermine le back-end auquel envoyer la demande, comme suit :request.auth[<key>]
Utilisez la valeur d'une réclamation renvoyée par une fonction d'autorisation ou contenue dans un jeton Web JSON (JWT) pour déterminer le back-end.<key>
est le nom de la réclamation. Par exemple,request.auth[tenant]
request.headers[<key>]
Utilisez la valeur d'un en-tête de la demande d'origine pour déterminer le back-end.<key>
est le nom de l'en-tête. Par exemple,request.headers[Accept]
request.host
Utilisez le nom de l'hôte auquel la demande d'origine a été envoyée (extrait du champ hôte de l'en-tête de l'hôte dans la demande) pour déterminer le back-end.request.path[<key>]
Utilisez un paramètre de chemin de la demande d'origine pour déterminer le back-end.<key>
est le nom du paramètre de chemin. Par exemple,request.path[region]
request.query[<key>]
Utilisez la valeur d'un paramètre de requête de la demande d'origine pour déterminer le back-end.<key>
est le nom du paramètre de requête. Par exemple,request.query[state]
.request.subdomain[<key>]
Utilisez la première partie du nom d'hôte auquel la demande d'origine a été envoyée (la seule partie du nom d'hôte non spécifiée en tant que clé) pour déterminer le back-end.<key>
est la dernière partie du nom d'hôte à ne pas utiliser. Par exemple,request.subdomain[example.com]
request.usage_plan[id]
Utilisez l'OCID d'un plan d'utilisation auquel le client d'API est abonné (identifié à partir d'un jeton client dans la demande d'origine) pour déterminer le back-end.
"key": {...}
indique la règle à respecter pour envoyer une demande au back-end indiqué par"backend": {…}
."type": "<ANY_OF|WILDCARD>"
indique dans quelle mesure la valeur de la variable de contexte identifiée par<context-table-key>
doit correspondre à la valeur saisie pour<context-variable-value>
afin que la demande soit envoyée au back-end indiqué par"backend": {…}
. IndiquezANY_OF
si la valeur de la variable de contexte identifiée par<context-table-key>
doit correspondre exactement à la valeur indiquée pour<context-variable-value>
. IndiquezWILDCARD
si la valeur de la variable de contexte identifiée par<context-table-key>
doit correspondre à une valeur contenant des caractères génériques que vous indiquez pour<context-variable-value>
. La mise en correspondance des valeurs ne fait pas la distinction entre les majuscules et les minuscules si vous indiquezANY_OF
et la casse si vous indiquezWILDCARD
.<context-variable-value>
est une valeur qui peut correspondre à la valeur de la variable de contexte identifiée par<context-table-key>
. Vous pouvez inclure plusieurs entrées"<context-variable-value>"
dans le tableauvalues:[...]
, séparées par des virgules. La demande est envoyée au back-end indiqué par"backend": {…}
si les valeurs correspondent, comme suit :- Si vous avez spécifié
"type": "ANY_OF"
, les valeurs doivent correspondre exactement. Notez que les valeurs doivent être uniques dans une règle de back-end unique et dans toutes les règles de back-end définies pour un déploiement d'API. La correspondance de valeur ne fait pas la distinction entre les majuscules et les minuscules si vous avez spécifiéANY_OF
. - Si vous avez indiqué
"type": "WILDCARD"
, vous pouvez indiquer une valeur pour<context-variable-value>
qui commence par un caractère générique ou se termine par un caractère générique. Utilisez le caractère générique*
(astérisque) pour indiquer zéro ou plusieurs caractères, et/ou le caractère générique+
(signe plus) pour indiquer un ou plusieurs caractères. Notez que vous ne pouvez pas inclure plusieurs caractères génériques dans une valeur et que vous ne pouvez pas inclure de caractères génériques au milieu d'une valeur. La correspondance de valeur est sensible à la casse si vous avez indiquéWILDCARD
. Notez également qu'une configuration de caractères génériques incorrecte peut entraîner l'acheminement des demandes vers des back-ends involontaires.
"selector": "request.headers[Accept]"
"type": "ANY_OF"
"values": ["application/xml"]
- Si vous avez spécifié
"isDefault": "<true|false>"
est une valeur booléenne facultative (true
oufalse
) indiquant si le back-end doit être utilisé pour cette règle si aucune règle de back-end ne correspond. Si rien n'est indiqué, la valeur par défaut (false
) est utilisée."name": "<rule-name>"
indique le nom de la règle. Utilisez ce nom pour identifier le back-end lors de la référence aux journaux et aux mesures.<backend-type>
indique le type de service back-end. Valeurs valides :ORACLE_FUNCTIONS_BACKEND
,HTTP_BACKEND
etSTOCK_RESPONSE_BACKEND
.<backend-target>
et<identifier>
spécifient le service back-end. Les valeurs valides pour<backend-target>
et<identifier>
dépendent de la valeur de<backend-type>
, comme suit :- Si vous définissez
<backend-type>
surORACLE_FUNCTIONS_BACKEND
, remplacez<backend-target>
parfunctionId
et<identifier>
par l'OCID de la fonction. Par exemple,"functionId": "ocid1.fnfunc.oc1.phx.aaaaaaaaab5b..."
. Reportez-vous à Ajout d'une fonction dans OCI Functions en tant que back-end de passerelle d'API. - Si vous définissez
<backend-type>
surHTTP_BACKEND
, remplacez<backend-target>
parurl
et<identifier>
par l'URL du service back-end. Par exemple,"url": "https://api.weather.gov"
. Reportez-vous à Ajout d'une URL HTTP ou HTTPS en tant que back-end de passerelle d'API. - Si vous définissez
<backend-type>
surSTOCK_RESPONSE_BACKEND
, remplacez<backend-target>
et<identifier>
par les paires clé-valeur appropriées. Reportez-vous à Ajout de réponses par défaut en tant que back-end de passerelle d'API.
- Si vous définissez
Par exemple, la spécification de déploiement d'API de base suivante inclut la sélection back-end dynamique qui achemine les demandes en fonction de la valeur du paramètre de requête
vehicle-type
transmis dans la demande. Si le paramètre de requêtevehicle-type
a la valeurcar
, la demande est acheminée verscars-api.example.com
. Si le paramètre de requêtevehicle-type
a la valeurtruck
ouminivan
, la demande est acheminée vers une fonction sans serveur dans OCI Functions à des fins de traitement. Si la valeur du paramètre de requêtevehicle-type
n'est nicar
, nitruck
, niminivan
, la demande est acheminée verscars-api.example.com
par défaut :{ "routes": [ { "path": "/users/{path1*}", "methods": [ "GET", "POST", "PUT", "DELETE" ], "backend": { "type": "DYNAMIC_ROUTING_BACKEND", "selectionSource": { "type": "SINGLE", "selector": "request.query[vehicle-type]" }, "routingBackends": [ { "key": { "type": "ANY_OF", "values": [ "cars" ], "isDefault": "true", "name": "car-rule" }, "backend": { "type": "HTTP_BACKEND", "url": "https://cars-api.example.com" } }, { "key": { "type": "ANY_OF", "values": [ "minivan", "truck" ], "name": "truck-minivan-rule" }, "backend": { "type": "ORACLE_FUNCTIONS_BACKEND", "functionId": "ocid1.fnfunc.oc1.phx.aaaaaaaaab______xmq" } } ] } } ] }
- Enregistrez le fichier JSON qui contient la spécification de déploiement d'API.
-
Utilisez la spécification de déploiement d'API lorsque vous créez ou mettez à jour un déploiement d'API en :
- spécifiant le fichier JSON dans la console lorsque vous sélectionnez l'option Télécharger une API existante,
- spécifiant le fichier JSON dans une demande adressée à l'API REST d'API Gateway.
Pour plus d'informations, reportez-vous à Déploiement d'une API sur une passerelle d'API en créant un déploiement d'API.
-
(Facultatif) Assurez-vous que l'API a été déployée en l'appelant (reportez-vous à Appel d'une API déployée sur une passerelle d'API).
Exemples de sélection dynamique de back-ends de passerelle d'API
Les exemples de cette section utilisent la définition de déploiement d'API et la spécification de déploiement d'API incomplète suivantes dans un fichier JSON :
{
"displayName": "Marketing Deployment",
"gatewayId": "ocid1.apigateway.oc1..aaaaaaaab______hga",
"compartmentId": "ocid1.compartment.oc1..aaaaaaaa7______ysq",
"pathPrefix": "/marketing",
"specification": {
"routes": [
{
"path": "/sales",
"methods": [
"GET",
"POST",
"PUT",
"DELETE"
],
"backend": {
"type": "DYNAMIC_ROUTING_BACKEND",
.
.
.
}
}
]
},
"freeformTags": {},
"definedTags": {}
}
Ces exemples s'appliquent lorsque vous définissez une spécification de déploiement d'API à l'aide des boîtes de dialogue de la console.
Exemple 1 : sélection du back-end par hôte
Vous pouvez configurer un déploiement d'API pour sélectionner dynamiquement un back-end en fonction de l'hôte auquel la demande d'origine a été envoyée (extrait du champ hôte de l'en-tête de l'hôte dans la demande). Cette conception vous permet de définir une passerelle d'API qui prend en charge différents locataires.
{
"routes": [
{
"path": "/sales",
"methods": [
"GET",
"POST",
"PUT",
"DELETE"
],
"backend": {
"type": "DYNAMIC_ROUTING_BACKEND",
"selectionSource": {
"type": "SINGLE",
"selector": "request.host"
},
"routingBackends": [
{
"key": {
"type": "ANY_OF",
"values": [
"cars.example.com"
],
"isDefault": "true",
"name": "car-rule"
},
"backend": {
"type": "HTTP_BACKEND",
"url": "http://cars-api.example.com"
}
},
{
"key": {
"type": "ANY_OF",
"values": [
"minivans.examplecloud.com",
"trucks.example.com"
],
"name": "truck-minivan-rule"
},
"backend": {
"type": "ORACLE_FUNCTIONS_BACKEND",
"functionId": "ocid1.fnfunc.oc1.phx.aaaaaaaaab______xmq"
}
}
]
}
}
]
}
Dans cet exemple, la façon dont la passerelle d'API résout une demande vers https://<gateway-hostname>/marketing/sales
dépend de l'hôte auquel la demande d'origine a été envoyée (extrait du champ hôte de l'en-tête d'hôte dans la demande), comme suit :
- Si la demande a été envoyée à
cars.example.com
, elle est acheminée vershttp://cars-api.example.com
. - Si la demande a été envoyée à
minivans.examplecloud.com
ou àtrucks.example.com
, elle est acheminée vers un back-end de fonction sans serveur dans OCI Functions. - Si la demande a été envoyée à un autre hôte, elle est acheminée vers
http://cars-api.example.com
par défaut.
Exemple 2 : sélection du back-end par sous-domaine hôte
Vous pouvez configurer un déploiement d'API pour sélectionner dynamiquement un back-end en fonction d'un sous-domaine dans la chaîne d'hôte à laquelle la demande d'origine a été envoyée. La chaîne d'hôte est extraite de l'en-tête de l'hôte dans la demande et masquée par une chaîne que vous indiquez, laissant le sous-domaine utilisé pour acheminer la demande. Cette conception vous permet de définir une passerelle d'API qui prend en charge différents locataires.
{
"routes": [
{
"path": "/sales",
"methods": [
"GET",
"POST",
"PUT",
"DELETE"
],
"backend": {
"type": "DYNAMIC_ROUTING_BACKEND",
"selectionSource": {
"type": "SINGLE",
"selector": "request.subdomain[example.com]"
},
"routingBackends": [
{
"key": {
"type": "ANY_OF",
"values": [
"cars"
],
"isDefault": "true",
"name": "car-rule"
},
"backend": {
"type": "HTTP_BACKEND",
"url": "https://cars-api.example.com"
}
},
{
"key": {
"type": "ANY_OF",
"values": [
"minivans",
"trucks"
],
"name": "truck-minivan-rule"
},
"backend": {
"type": "ORACLE_FUNCTIONS_BACKEND",
"functionId": "ocid1.fnfunc.oc1.phx.aaaaaaaaab______xmq"
}
}
]
}
}
]
}
Dans cet exemple, la façon dont la passerelle d'API résout une demande vers https://<gateway-hostname>/marketing/sales
dépend du sous-domaine hôte auquel la demande d'origine a été envoyée, comme suit :
- si la demande a été envoyée à
cars.example.com
, elle est acheminée vershttp://cars-api.example.com
- si la demande a été envoyée à
minivans.example.com
ou àtrucks.example.com
, elle est acheminée vers un back-end de fonction sans serveur dans OCI Functions - si la demande a été envoyée à un autre sous-domaine de
example.com
(tel quecar.example.com
ousedan.example.com
), elle est acheminée vershttp://cars-api.example.com
par défaut
Exemple 3a : sélectionnez back-end par sous-domaine d'hôte (modification du nom d'hôte dans l'URL back-end et utilisation du type de correspondance ANY_OF)
Vous pouvez configurer un déploiement d'API pour sélectionner de manière dynamique un back-end en fonction d'un sous-domaine dans la chaîne d'hôte à laquelle la demande d'origine a été envoyée. La chaîne d'hôte est extraite de l'en-tête Host dans la demande et masquée par une chaîne que vous indiquez, laissant le sous-domaine utilisé pour acheminer la demande. Pour une validation supplémentaire, vous pouvez inclure le masque de sous-domaine en tant que variable de contexte dans l'URL back-end afin de vous assurer que les demandes sont acheminées uniquement vers les back-ends que vous souhaitez exposer. Si vous indiquez ANY_OF
comme type de correspondance, la valeur de la variable de contexte ne peut pas inclure de caractères génériques et doit correspondre exactement à l'une des valeurs routes.routingBackends.key
pour que la demande soit envoyée au back-end.
{
"routes": [
{
"path": "/sales",
"methods": [
"GET",
"POST",
"PUT",
"DELETE"
],
"backend": {
"type": "DYNAMIC_ROUTING_BACKEND",
"selectionSource": {
"type": "SINGLE",
"selector": "request.subdomain[example.com]"
},
"routingBackends": [
{
"key": {
"type": "ANY_OF",
"values": [
"cars",
"hatchbacks"
],
"name": "car-hatchback-rule"
},
"backend": {
"type": "HTTP_BACKEND",
"url": "https://${request.subdomain[example.com]}-api.example.com"
}
}
]
}
}
]
}
Dans cet exemple, la façon dont la passerelle d'API résout une demande vers https://<gateway-hostname>/marketing/sales
dépend du sous-domaine hôte auquel la demande d'origine a été envoyée, comme suit :
- si la demande a été envoyée à
cars.example.com
ouhatchbacks.example.com
, elle est acheminée vershttp://cars-api.example.com
ouhttp://hatchbacks-api.example.com
- si la demande a été envoyée à un autre sous-domaine de
example.com
(tel quesuvs.example.com
ousedans.example.com
), la demande échoue.
Si vous envisagez de modifier le nom d'hôte dans l'URL du back-end en incluant une variable de contexte comme indiqué dans cet exemple, notez ce qui suit :
- Vous pouvez uniquement modifier l'URL de back-end à l'aide de la variable de contexte indiquée pour
selector
. - Pour appliquer la liste des back-ends autorisés, ne définissez
"isDefault: "true"
pour aucune règle.
Exemple 3b : sélectionnez back-end par sous-domaine hôte (modification du nom d'hôte dans l'URL back-end et utilisation d'un type de correspondance WILDCARD)
Vous pouvez configurer un déploiement d'API pour sélectionner de manière dynamique un back-end en fonction d'un sous-domaine dans la chaîne d'hôte à laquelle la demande d'origine a été envoyée. La chaîne d'hôte est extraite de l'en-tête Host dans la demande et masquée par une chaîne que vous indiquez, laissant le sous-domaine utilisé pour acheminer la demande. Pour une validation supplémentaire, vous pouvez inclure le masque de sous-domaine en tant que variable de contexte dans l'URL back-end afin de vous assurer que les demandes sont acheminées uniquement vers les back-ends que vous souhaitez exposer. Si vous indiquez WILDCARD
comme type de correspondance, la valeur de la variable de contexte peut inclure des caractères génériques et doit correspondre à l'une des valeurs routes.routingBackends.key
pour que la demande soit envoyée au back-end.
{
"routes": [
{
"path": "/sales",
"methods": [
"GET",
"POST",
"PUT",
"DELETE"
],
"backend": {
"type": "DYNAMIC_ROUTING_BACKEND",
"selectionSource": {
"type": "SINGLE",
"selector": "request.subdomain[example.com]"
},
"routingBackends": [
{
"key": {
"type": "WILDCARD",
"values": [
"*s"
],
"name": "domestic-rule"
},
"backend": {
"type": "HTTP_BACKEND",
"url": "https://${request.subdomain[example.com]}-api.example.com"
}
}
]
}
}
]
}
Dans cet exemple, la façon dont la passerelle d'API résout une demande vers https://<gateway-hostname>/marketing/sales
dépend de la correspondance entre le sous-domaine hôte auquel la demande d'origine a été envoyée et la valeur routes.routingBackends.key
, y compris le caractère générique. Dans ce cas, si la demande originale a été envoyée à un sous-domaine hôte qui se termine par la lettre "s", comme suit :
- Si la demande a été envoyée à un sous-domaine qui se termine par la lettre "s", la demande est acheminée de manière appropriée. Par exemple, les demandes envoyées à
cars.example.com
,hatchbacks.example.com
,suvs.example.com
ousedans.example.com
sont acheminées vershttp://cars-api.example.com
,http://hatchbacks-api.example.com
,http://suvs-api.example.com
ouhttp://sedans-api.example.com
respectivement. - Si la demande a été envoyée à un sous-domaine qui ne se termine pas par la lettre 's', la demande échoue. Par exemple, les demandes envoyées à
truck.example.com
outractor.example.com
échouent.
Si vous envisagez de modifier le nom d'hôte dans l'URL back-end en incluant une variable de contexte comme indiqué dans cet exemple, notez ce qui suit :
- Vous pouvez uniquement modifier l'URL back-end à l'aide de la variable de contexte indiquée pour
selector
. - Lorsque vous utilisez des caractères génériques, configurez-les soigneusement. Une configuration de caractères génériques incorrecte peut entraîner l'acheminement des demandes vers des back-ends involontaires. Par exemple, dans l'exemple, les demandes envoyées à
buses.example.com
sont correctement acheminées vershttp://buses-api.example.com
comme prévu. Cependant, cette configuration achemine également les demandes initialement envoyées àbus.example.com
ets.example.com
vershttp://bus-api.example.com
ethttp://s-api.example.com
respectivement, ce qui n'était pas prévu.
Exemple 4 : sélection du back-end par plan d'utilisation
Vous pouvez configurer un déploiement d'API pour sélectionner dynamiquement un back-end en fonction de l'OCID d'un plan d'utilisation auquel le client d'API est abonné (identifié à partir d'un jeton client dans la demande d'origine). L'OCID du plan d'utilisation est stocké dans la variable de contexte request.usage_plan[id]
.
{
"routes": [
{
"path": "/sales",
"methods": [
"GET",
"POST",
"PUT",
"DELETE"
],
"backend": {
"type": "DYNAMIC_ROUTING_BACKEND",
"selectionSource": {
"type": "SINGLE",
"selector": "request.usage_plan[id]"
},
"routingBackends": [
{
"key": {
"type": "ANY_OF",
"values": [
"ocid1.usageplan.oc1..aaaaaaaaab______gap"
],
"name": "free-rule",
"isDefault": true
},
"backend": {
"type": "HTTP_BACKEND",
"url": "http://dev.example.com/"
}
},
{
"key": {
"type": "ANY_OF",
"values": [
"ocid1.usageplan.oc1..aaaaaaaaay______lcf"
],
"name": "premium-rule"
},
"backend": {
"type": "HTTP_BACKEND",
"url": "http://api.example.com"
}
}
]
}
}
]
}
Dans cet exemple, la façon dont la passerelle d'API résout une demande vers https://<gateway-hostname>/marketing/sales
dépend du plan d'utilisation auquel le client d'API est abonné. Deux plans d'utilisation ont été définis, comme suit :
Free Tier
, qui a l'OCIDocid1.usageplan.oc1..aaaaaaaaab______gap
. Lorsque cet OCID est la valeur de la variable de contexterequest.usage_plan[id]
, la demande est acheminée vershttp://dev.example.com/
. Le plan d'utilisationFree Tier
est également utilisé comme plan par défaut si la demande n'incluait pas de jeton client.Premium Tier
, qui a l'OCIDocid1.usageplan.oc1..aaaaaaaaay______lcf
. Lorsque cet OCID est la valeur de la variable de contexterequest.usage_plan[id]
, la demande est acheminée vershttp://api.example.com
Exemple 5 : sélection du back-end par paramètre d'en-tête
Vous pouvez configurer un déploiement d'API pour sélectionner dynamiquement un back-end en fonction d'un paramètre transmis dans l'en-tête de la demande d'origine.
{
"routes": [
{
"path": "/sales",
"methods": [
"GET",
"POST",
"PUT",
"DELETE"
],
"backend": {
"type": "DYNAMIC_ROUTING_BACKEND",
"selectionSource": {
"type": "SINGLE",
"selector": "request.headers[Accept]"
},
"routingBackends": [
{
"key": {
"type": "ANY_OF",
"values": [
"application/json"
],
"name": "json-rule",
"isDefault": true
},
"backend": {
"type": "HTTP_BACKEND",
"url": "http://api.example.com"
}
},
{
"key": {
"type": "ANY_OF",
"values": [
"application/xml"
],
"name": "xml-rule"
},
"backend": {
"type": "HTTP_BACKEND",
"url": "http://xml.example.com"
}
}
]
}
}
]
}
Dans cet exemple, la façon dont la passerelle d'API résout une demande vers https://<gateway-hostname>/marketing/sales
dépend de la valeur de l'en-tête Accept
dans la demande d'origine, comme suit :
- si l'en-tête
Accept
demande une réponse au formatapplication/json
, la demande est acheminée vershttp://api.example.com
- si l'en-tête
Accept
demande une réponse au formatapplication/xml
, la demande est acheminée vershttp://xml.example.com
Exemple 6 : sélection du back-end par paramètre d'authentification
Vous pouvez configurer un déploiement d'API pour sélectionner dynamiquement un back-end en fonction d'un paramètre d'authentification (également appelé "réclamation") renvoyé par une fonction d'autorisation ou contenu dans un jeton Web JSON (JWT).
{
"routes": [
{
"path": "/sales",
"methods": [
"GET",
"POST",
"PUT",
"DELETE"
],
"backend": {
"type": "DYNAMIC_ROUTING_BACKEND",
"selectionSource": {
"type": "SINGLE",
"selector": "request.auth[tenant]"
},
"routingBackends": [
{
"key": {
"type": "ANY_OF",
"values": [
"tenant-cars"
],
"name": "cars-tenant-rule",
"isDefault": true
},
"backend": {
"type": "HTTP_BACKEND",
"url": "http://cars-api.example.com"
}
},
{
"key": {
"type": "ANY_OF",
"values": [
"tenant-trucks"
],
"name": "trucks-tenant-rule"
},
"backend": {
"type": "HTTP_BACKEND",
"url": "http://trucks-api.example.com"
}
}
]
}
}
]
}
Dans cet exemple, la façon dont la passerelle d'API résout une demande vers https://<gateway-hostname>/marketing/sales
dépend de la valeur de la demande tenant
renvoyée par une fonction d'autorisation, comme suit :
- si la variable de contexte
request.auth[tenant]
est définie surtenant-cars
, la demande est acheminée vershttp://cars-api.example.com
- si la variable de contexte
request.auth[tenant]
est définie surtenant-trucks
, la demande est acheminée vershttp://trucks-api.example.com
Exemple 7 : sélection du back-end par paramètre de requête
Vous pouvez configurer un déploiement d'API pour sélectionner dynamiquement un back-end en fonction d'un paramètre de requête transmis par la demande d'origine.
{
"routes": [
{
"path": "/sales",
"methods": [
"GET",
"POST",
"PUT",
"DELETE"
],
"backend": {
"type": "DYNAMIC_ROUTING_BACKEND",
"selectionSource": {
"type": "SINGLE",
"selector": "request.query[vehicle-type]"
},
"routingBackends": [
{
"key": {
"type": "ANY_OF",
"values": [
"car"
],
"isDefault": "true",
"name": "car-rule"
},
"backend": {
"type": "HTTP_BACKEND",
"url": "https://cars-api.example.com"
}
},
{
"key": {
"type": "ANY_OF",
"values": [
"minivan",
"truck"
],
"name": "truck-rule"
},
"backend": {
"type": "ORACLE_FUNCTIONS_BACKEND",
"functionId": "ocid1.fnfunc.oc1.phx.aaaaaaaaab______xmq"
}
}
]
}
}
]
}
Dans cet exemple, la façon dont la passerelle d'API résout une demande vers https://<gateway-hostname>/marketing/sales
dépend de la valeur du paramètre de requête vehicle-type
transmis par la demande d'origine, comme suit :
- Si le paramètre de requête
vehicle-type
a la valeurcar
, la demande est acheminée verscars-api.example.com
. - Si le paramètre de requête
vehicle-type
a la valeurtruck
ouminivan
, la demande est acheminée vers une fonction sans serveur dans OCI Functions à des fins de traitement. - Si la valeur du paramètre de requête
vehicle-type
n'est nicar
, nitruck
niminivan
, la demande est acheminée verscars-api.example.com
par défaut :