Sélection dynamique des éléments dorsaux de la passerelle d'API en fonction des éléments de demande

Découvrez comment acheminer les demandes envoyées à la même passerelle d'API vers différents éléments dorsaux en fonction des éléments de la demande avec la passerelle d'API.

Une exigence commune consiste à acheminer les demandes envoyées à la même passerelle d'API vers différents éléments dorsaux en fonction des éléments de la demande. Par exemple, pour acheminer des demandes vers différents éléments dorsaux en fonction de :

  • Hôte et/ou domaine et/ou sous-domaine auquel une demande a été envoyée. Par exemple, pour acheminer les demandes entrantes de cars.example.com et de trucks.example.com qui ont été envoyées à la même passerelle d'API vers deux serveurs dorsaux complètement différents.
  • Plan d'utilisation auquel le client d'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 haute performance pour les clients d'API abonnés au plan d'utilisation Premium 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 valeur application/xml vers un élément dorsal approprié qui retourne une réponse de ce type de contenu.

La sélection dynamique d'un élément dorsal vous permet de présenter une seule façade aux consommateurs d'API et de les protéger de la complexité de plusieurs systèmes dorsaux.

Vous pouvez acheminer dynamiquement les demandes vers :

  • Éléments dorsaux HTTP
  • extrémités dorsales de fonction sans serveur
  • éléments dorsaux de réponse de stock

Lorsque vous définissez plusieurs éléments dorsaux pour le même déploiement d'API, vous créez des règles pour permettre à la passerelle d'API de sélectionner dynamiquement l'élément dorsal vers lequel acheminer une demande, en fonction d'un élément de la demande initiale.

Pour permettre à la passerelle d'API de sélectionner de manière dynamique l'élément dorsal approprié, vous utilisez les variables de contexte suivantes pour saisir les éléments de la demande :

  • request.auth[<key>]<key> est le nom d'une revendication retournée par une fonction d'autorisation ou contenue dans un jeton JWT.
  • request.headers[<key>]<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 initiale a été envoyée.
  • request.path[<key>]<key> est le nom d'un paramètre de chemin défini dans la spécification de déploiement d'API.
  • request.query[<key>]<key> est le nom d'un paramètre d'interrogation inclus dans la demande à l'API.
  • request.subdomain[<key>]<key> est la partie de fin du nom d'hôte à ignorer lors de la saisie de la partie principale du nom d'hôte à laquelle la demande initiale a été envoyée.
  • request.usage_plan[id]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 valeur est utilisée lors de la sélection de l'élément dorsal. Pour plus d'informations sur les variables de contexte, voir Ajout de variables de contexte aux politiques et aux définitions d'élément dorsal HTTP.

Vous définissez les critères pour sélectionner dynamiquement les éléments dorsaux dans une spécification de déploiement d'API en procédant comme suit :

  • En utilisant la console.
  • En modifiant un fichier JSON.

Notes sur la mise en correspondance de règle dorsale

Lors de la création des règles pour déterminer quel élément dorsal utiliser, vous pouvez spécifier dans quelle mesure la valeur de la variable de contexte doit correspondre à une valeur donnée pour que la demande soit acheminée vers un élément dorsal particulier. Vous pouvez exiger une correspondance exacte, ou vous pouvez spécifier une valeur commençant par un caractère générique ou se terminant par. La passerelle d'API évalue les règles dans l'ordre que vous spécifiez (règles de correspondance exactes en premier, suivies de règles génériques) et utilise la première règle de correspondance. Vous pouvez également spécifier une règle par défaut à utiliser si la valeur de la variable de contexte ne correspond à aucune règle dorsale. Si aucune règle n'est spécifiée comme valeur par défaut et que la valeur de la variable de contexte dans une demande entrante ne correspond à aucune règle dorsale, la demande retourne une erreur. L'ordre de priorité pour déterminer la règle dorsale (et donc l'élément dorsal) à 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 spécifiée comme règle par défaut, utilisez cette règle.
  • Sinon, renvoyez une erreur.

Utilisation de la console pour ajouter une sélection dorsale dynamique à une spécification de déploiement d'API

Pour ajouter une sélection d'élément dorsal dynamique à une spécification de déploiement d'API à l'aide de la console :

  1. Créez ou mettez à jour un déploiement d'API à l'aide de la console, sélectionnez l'option À partir de zéro et entrez les détails dans la page Informations de base.

    Pour plus d'informations, voir 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.

  2. Dans la page Authentification, spécifiez comment authentifier les demandes effectuées sur les routes du déploiement d'API.

    Pour plus d'informations, voir Ajout de l'authentification et de l'autorisation aux déploiements d'API.

  3. Dans la page Routes, créez une route et spécifiez les données suivantes :

    • Chemin : Chemin des appels d'API utilisant les méthodes indiquées au service dorsal. Notez que le chemin de routage que vous spécifiez :

    • Méthodes : Une ou plusieurs méthodes acceptées par le service dorsal. Par exemple, GET, PUT.
  4. Sélectionnez Ajouter plusieurs serveurs dorsaux pour spécifier que vous voulez que les demandes soient acheminées vers différents serveurs dorsaux, en fonction de la variable de contexte et des règles que vous entrez.
    1. Dans la liste Sélecteur, sélectionnez la table de contexte (contenant la variable de contexte) à utiliser pour déterminer l'élément dorsal auquel envoyer la demande, comme suit :
      • Authentification : Utilisez la valeur d'une réclamation retournée par une fonction d'autorisation ou contenue dans un JWT (et enregistrée dans la table de contexte request.auth) pour déterminer l'élément dorsal.
      • En-têtes : Utilisez la valeur d'un en-tête de la demande initiale (et enregistrée dans la table de contexte request.headers) pour déterminer l'élément dorsal.
      • Hôte : Utilisez le nom de l'hôte auquel la demande initiale a été envoyée (extrait du champ hôte de l'en-tête d'hôte dans la demande et enregistré dans la table de contexte request.host) pour déterminer l'élément dorsal.
      • Chemin : Utilisez un paramètre de chemin de la demande initiale (et enregistré dans la table de contexte request.path) pour déterminer l'élément dorsal.
      • Paramètres d'interrogation : Utilisez la valeur d'un paramètre d'interrogation de la demande initiale (et enregistrée dans la table de contexte request.query) pour déterminer l'élément dorsal.
      • Sous-domaine : Utilisez la partie principale du nom d'hôte auquel la demande initiale a été envoyée (juste la partie du nom d'hôte non spécifiée en tant que clé, et enregistrée dans la table de contexte request.subdomain) pour déterminer l'élément dorsal. Notez que la clé est la partie de fin du nom d'hôte à ne pas utiliser.
      • OCID du 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 initiale et enregistré dans la table de contexte request.usage_plan) pour déterminer l'élément dorsal.
    2. Selon la table de contexte que vous sélectionnez, entrez le nom de la clé à utiliser pour déterminer l'élément dorsal auquel envoyer la demande.
  5. Sélectionnez Définir un serveur dorsal pour entrer une règle pour la variable de contexte qui, si elle est satisfaite, achemine la demande vers le serveur dorsal que vous définissez.
  6. Entrez les détails de la règle comme suit :
    • Nom : Entrez un nom pour la règle. Utilisez le nom que vous entrez pour identifier l'élément dorsal lors de la référence aux journaux et aux mesures.
    • Type de correspondance : Spécifiez à quel point la valeur de la variable de contexte doit correspondre à une valeur que vous entrez pour que la demande soit acheminée vers ce serveur dorsal. Sélectionnez Au choix 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 qui contient des caractères génériques. La correspondance de valeurs n'est pas sensible à la casse si vous sélectionnez Au choix et sensible à la casse si vous sélectionnez Caractère générique.
    • Valeurs : (Affiché si vous avez sélectionné N'importe lequel dans le champ Type de correspondance.) Spécifiez une valeur (ou plusieurs valeurs dans une liste séparée par des virgules) que la variable de contexte doit correspondre exactement. Notez que la correspondance n'est pas sensible à la casse si vous avez sélectionné Au choix. Notez également que les valeurs doivent être uniques au sein d'une seule règle dorsale et dans toutes les règles dorsales 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) Spécifiez une valeur commençant par, ou se terminant par, un caractère générique que la variable de contexte doit correspondre. Utilisez le caractère générique * (astérisque) pour indiquer zéro caractère ou plus, 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 plus d'un caractère générique dans une valeur et que vous ne pouvez pas inclure un caractère générique au milieu d'une valeur. Notez également que la configuration incorrecte de caractères génériques peut entraîner l'acheminement des demandes vers des éléments dorsaux non voulus.
    • Définir la valeur par défaut : Spécifiez si vous devez utiliser l'élément dorsal défini pour cette règle si aucune règle dorsale ne correspond.
  7. Entrez les détails de l'élément dorsal comme suit :
    1. Dans le champ Type dorsal, sélectionnez HTTP/HTTPS, Oracle Functions, Réponse de stock ou Déconnexion comme élément dorsal vers lequel acheminer la demande si la règle que vous avez entrée est respectée.
    2. Entrez les détails de l'élément dorsal sélectionné. Les détails à entrer dépendent du type d'élément dorsal que vous avez sélectionné et sont décrits en détail dans :
    3. Sélectionnez Définir pour créer l'élément dorsal et la règle associée.
  8. (Facultatif) Sélectionnez à nouveau Définir un serveur dorsal pour définir des serveurs dorsaux supplémentaires et les règles associées.
  9. (Facultatif) Sélectionnez Autre route pour entrer les détails des routes supplémentaires.
  10. Sélectionnez Suivant pour vérifier les détails que vous avez entrés pour le déploiement d'API.
  11. Sélectionnez Créer ou enregistrer les modifications pour créer ou mettre à jour le déploiement d'API.
  12. (Facultatif) Vérifiez que l'API a été déployée avec succès en l'appelant (voir Appel d'une API déployée sur une passerelle d'API).

Modification d'un fichier JSON pour ajouter une sélection dorsale dynamique à une spécification de déploiement d'API

Pour ajouter une sélection dorsale dynamique à une spécification de déploiement d'API dans un fichier JSON :

  1. Dans votre éditeur JSON préféré, créez une spécification de déploiement d'API (voir 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" spécifie des politiques facultatives pour contrôler le comportement d'un déploiement d'API. Si vous voulez appliquer des politiques à toutes les routes d'une spécification de déploiement d'API, placez les politiques en dehors de la section routes. Si vous voulez appliquer les politiques uniquement à une route particulière, placez les politiques dans la section routes. Voir Ajout de politiques 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 indiquées au service dorsal. Notez que le chemin de routage que vous spécifiez :

    • <method-list> spécifie une ou plusieurs méthodes acceptées par le service dorsal, séparées par des virgules. Par exemple, "GET, PUT".
    • "type": "DYNAMIC_ROUTING_BACKEND" indique que vous voulez sélectionner l'élément dorsal de manière dynamique en fonction des éléments de la demande.
    • "type": "SINGLE" indique que vous voulez utiliser une seule variable de contexte pour sélectionner dynamiquement l'élément dorsal.
    • "selector": "<context-table-key>" spécifie la table de contexte (et la clé, le cas échéant) à partir de laquelle obtenir la valeur de variable de contexte qui détermine l'élément dorsal vers lequel envoyer la demande, comme suit :
      • request.auth[<key>] Utilisez la valeur d'une revendication retournée par une fonction d'autorisation ou contenue dans un jeton Web JSON (JWT) pour déterminer l'élément dorsal. <key> est le nom de la revendication. Par exemple, request.auth[tenant]
      • request.headers[<key>] Utilisez la valeur d'un en-tête de la demande initiale pour déterminer l'élément dorsal. <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 initiale a été envoyée (extrait du champ hôte de l'en-tête d'hôte dans la demande) pour déterminer l'élément dorsal.
      • request.path[<key>] Utilisez un paramètre de chemin de la demande initiale pour déterminer l'élément dorsal. <key> est le nom du paramètre de chemin. Par exemple, request.path[region]
      • request.query[<key>] Utilisez la valeur d'un paramètre d'interrogation de la demande initiale pour déterminer l'élément dorsal. <key> est le nom du paramètre d'interrogation. Par exemple, request.query[state]
      • request.subdomain[<key>] Utilisez la partie principale du nom d'hôte à laquelle la demande initiale a été envoyée (juste la partie du nom d'hôte non spécifiée en tant que clé) pour déterminer l'élément dorsal. Notez que <key> est la partie de fin 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 de client dans la demande initiale) pour déterminer l'élément dorsal.
    • "key": {...} spécifie la règle à respecter pour envoyer une demande au serveur dorsal spécifié par "backend": {…}.
    • "type": "<ANY_OF|WILDCARD>" indique à quel point la valeur de la variable de contexte identifiée par <context-table-key> doit correspondre à la valeur entrée pour <context-variable-value> pour que la demande soit envoyée au serveur dorsal spécifié par "backend": {…}. Spécifiez ANY_OF si la valeur de la variable de contexte identifiée par <context-table-key> doit correspondre exactement à la valeur que vous spécifiez pour <context-variable-value>. Spécifiez WILDCARD 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 spécifiez pour <context-variable-value>. La correspondance de valeurs n'est pas sensible à la casse si vous spécifiez ANY_OF et la casse si vous spécifiez WILDCARD.
    • <context-variable-value> est une valeur qui correspond éventuellement à la valeur de la variable de contexte identifiée par <context-table-key>. Vous pouvez inclure plusieurs entrées "<context-variable-value>" dans le tableau values:[...], séparées par des virgules. La demande est envoyée au serveur dorsal spécifié 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 seule règle dorsale et dans toutes les règles dorsales définies pour un déploiement d'API. La correspondance de valeurs n'est pas sensible à la casse si vous avez spécifié ANY_OF.
      • Si vous avez spécifié "type": "WILDCARD", vous pouvez spécifier une valeur pour <context-variable-value> qui commence par un caractère générique ou qui se termine par. Utilisez le caractère générique * (astérisque) pour indiquer zéro caractère ou plus, et/ou le caractère générique + (signe plus) pour indiquer un ou plusieurs caractères. Notez que vous ne pouvez pas inclure plus d'un caractère générique dans une valeur et que vous ne pouvez pas inclure un caractère générique au milieu d'une valeur. La correspondance de valeurs est sensible à la casse si vous avez spécifié WILDCARD. Notez également que la configuration incorrecte de caractères génériques peut entraîner l'acheminement des demandes vers des éléments dorsaux non voulus.
      Par exemple, si vous voulez qu'une demande d'un client d'API qui peut accepter une réponse xml (comme indiqué dans l'en-tête Accepter de la demande) soit acheminée vers un élément dorsal qui retourne xml, vous pouvez spécifier :
      • "selector": "request.headers[Accept]"
      • "type": "ANY_OF"
      • "values": ["application/xml"]
    • "isDefault": "<true|false>" est une valeur booléenne facultative (true ou false) indiquant si l'élément dorsal doit être utilisé pour cette règle si aucune règle dorsale ne correspond. Si la valeur n'est pas indiquée, la valeur par défaut est false.
    • "name": "<rule-name>" indique un nom pour la règle. Utilisez ce nom pour identifier l'élément dorsal lors de la référence aux journaux et aux mesures.
    • <backend-type> spécifie le type du service dorsal. Les valeurs valides sont ORACLE_FUNCTIONS_BACKEND, HTTP_BACKEND et STOCK_RESPONSE_BACKEND.
    • <backend-target> et <identifier> spécifient le service dorsal. Les valeurs valides pour <backend-target> et <identifier> dépendent de la valeur de <backend-type>, comme suit :

    Par exemple, la spécification de déploiement d'API de base suivante inclut une sélection dorsale dynamique qui achemine les demandes en fonction de la valeur du paramètre d'interrogation vehicle-type transmis dans la demande. Si le paramètre d'interrogation vehicle-type a la valeur car, la demande est acheminée vers cars-api.example.com. Si le paramètre d'interrogation vehicle-type a la valeur truck ou minivan, la demande est acheminée vers une fonction sans serveur dans le service des fonctions pour OCI pour traitement. Si la valeur du paramètre d'interrogation vehicle-type n'est ni car, ni truck, ni minivan, la demande est acheminée vers cars-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"
                }
              }
            ]
          }
        }
      ]
    }
  2. Enregistrez le fichier JSON contenant la spécification de déploiement d'API.
  3. Utilisez comme suit 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 Charger une API existante.
    • En spécifiant le fichier JSON dans une demande à l'API REST du service Passerelle d'API.

    Pour plus d'informations,voir Déploiement d'une API sur une passerelle d'API en créant un déploiement d'API.

  4. (Facultatif) Vérifiez que l'API a été déployée en l'appelant (voir Appel d'une API déployée sur une passerelle d'API).

Exemples de sélection dynamique des éléments dorsaux du service de passerelle d'API

Les exemples de cette section supposent la définition de déploiement d'API suivante et une spécification de déploiement d'API incomplète 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": {}
}

Notez que ces exemples s'appliquent également 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électionner un élément dorsal par hôte

Vous pouvez configurer un déploiement d'API pour sélectionner dynamiquement un élément dorsal en fonction de l'hôte auquel la demande initiale a été envoyée (extrait du champ hôte de l'en-tête d'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 à https://<gateway-hostname>/marketing/sales dépend de l'hôte auquel la demande initiale 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 vers http://cars-api.example.com.
  • Si la demande a été envoyée à minivans.examplecloud.com ou à trucks.example.com, elle est acheminée vers un élément dorsal de fonction sans serveur dans le service des fonctions pour OCI.
  • 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électionner un élément dorsal par sous-domaine d'hôte

Vous pouvez configurer un déploiement d'API pour sélectionner dynamiquement un élément dorsal en fonction d'un sous-domaine dans la chaîne d'hôte à laquelle la demande initiale a été envoyée. La chaîne hôte est extraite de l'en-tête Host de la demande et masquée par une chaîne que vous spécifiez, 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 à https://<gateway-hostname>/marketing/sales dépend du sous-domaine d'hôte auquel la demande initiale a été envoyée, comme suit :

  • si la demande a été envoyée à cars.example.com, la demande est acheminée vers http://cars-api.example.com
  • si la demande a été envoyée à minivans.example.com ou à trucks.example.com, elle est acheminée vers un élément dorsal de fonction sans serveur dans le service des fonctions pour OCI
  • si la demande a été envoyée à un autre sous-domaine de example.com (par exemple, car.example.com ou sedan.example.com), la demande est acheminée vers http://cars-api.example.com par défaut

Exemple 3a : Sélectionner un élément dorsal par sous-domaine d'hôte (modification du nom d'hôte dans l'URL dorsale et utilisation du type de correspondance ANY_OF)

Vous pouvez configurer un déploiement d'API pour sélectionner dynamiquement un élément dorsal en fonction d'un sous-domaine dans la chaîne d'hôte à laquelle la demande initiale a été envoyée. La chaîne hôte est extraite de l'en-tête Host de la demande et masquée par une chaîne que vous spécifiez, 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 dorsale afin de vous assurer que les demandes ne sont acheminées qu'aux éléments dorsaux que vous souhaitez exposer. Si vous spécifiez 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 serveur dorsal.

{
  "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 à https://<gateway-hostname>/marketing/sales dépend du sous-domaine d'hôte auquel la demande initiale a été envoyée, comme suit :

  • si la demande a été envoyée à cars.example.com ou à hatchbacks.example.com, la demande est acheminée vers http://cars-api.example.com ou http://hatchbacks-api.example.com
  • si la demande a été envoyée à un autre sous-domaine de example.com (par exemple, suvs.example.com ou sedans.example.com), la demande échoue.

Si vous envisagez de modifier le nom d'hôte dans l'URL dorsale en incluant une variable de contexte comme illustré dans cet exemple, notez les points suivants :

  • Vous pouvez uniquement modifier l'URL dorsale à l'aide de la variable de contexte spécifiée pour selector.
  • Pour appliquer la liste des éléments dorsaux autorisés, ne définissez "isDefault: "true" pour aucune règle.

Exemple 3b : Sélectionner un élément dorsal par sous-domaine d'hôte (modification du nom d'hôte dans l'URL d'élément dorsal et utilisation d'un type de correspondance WILDCARD)

Vous pouvez configurer un déploiement d'API pour sélectionner dynamiquement un élément dorsal en fonction d'un sous-domaine dans la chaîne d'hôte à laquelle la demande initiale a été envoyée. La chaîne hôte est extraite de l'en-tête Host de la demande et masquée par une chaîne que vous spécifiez, 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 dorsale afin de vous assurer que les demandes ne sont acheminées qu'aux éléments dorsaux que vous souhaitez exposer. Si vous spécifiez 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 serveur dorsal.

{
  "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 à https://<gateway-hostname>/marketing/sales dépend du fait que le sous-domaine d'hôte auquel la demande initiale a été envoyée correspond à la valeur routes.routingBackends.key, y compris le caractère générique. Dans ce cas, si la demande initiale 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 ou sedans.example.com sont acheminées vers http://cars-api.example.com, http://hatchbacks-api.example.com, http://suvs-api.example.com ou http://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 ou tractor.example.com échouent.

Si vous envisagez de modifier le nom d'hôte dans l'URL dorsale en incluant une variable de contexte comme illustré dans cet exemple, notez les points suivants :

  • Vous pouvez uniquement modifier l'URL dorsale à l'aide de la variable de contexte spécifiée pour selector.
  • Lors de l'utilisation de caractères génériques, configurez le caractère générique avec soin. Une configuration de caractère générique incorrecte peut entraîner l'acheminement des demandes vers des éléments dorsaux non voulus. Par exemple, dans l'exemple, les demandes envoyées à buses.example.com sont correctement acheminées vers http://buses-api.example.com, comme prévu. Toutefois, cette configuration achemine également les demandes initialement envoyées à bus.example.com et s.example.com à http://bus-api.example.com et http://s-api.example.com respectivement, dont aucune n'était prévue.

Exemple 4 : Sélectionner un élément dorsal par plan d'utilisation

Vous pouvez configurer un déploiement d'API pour sélectionner de manière dynamique un élément dorsal en fonction de l'OCID d'un plan d'utilisation auquel le client d'API est abonné (identifié à partir d'un jeton de client dans la demande initiale). 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 à 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'OCID ocid1.usageplan.oc1..aaaaaaaaab______gap. Lorsque cet OCID est la valeur de la variable de contexte request.usage_plan[id], la demande est acheminée vers http://dev.example.com/. Le plan d'utilisation Free Tier est également utilisé par défaut si la demande n'incluait pas de jeton client.
  • Premium Tier, qui a l'OCID ocid1.usageplan.oc1..aaaaaaaaay______lcf. Lorsque cet OCID est la valeur de la variable de contexte request.usage_plan[id], la demande est acheminée vers http://api.example.com

Exemple 5 : Sélectionner un élément dorsal par paramètre d'en-tête

Vous pouvez configurer un déploiement d'API pour sélectionner dynamiquement un élément dorsal en fonction d'un paramètre transmis dans l'en-tête de la demande initiale.

{
  "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 à https://<gateway-hostname>/marketing/sales dépend de la valeur de l'en-tête Accept dans la demande initiale, comme suit :

  • si l'en-tête Accept demande une réponse au format application/json, la demande est acheminée vers http://api.example.com
  • si l'en-tête Accept demande une réponse au format application/xml, la demande est acheminée vers http://xml.example.com

Exemple 6 : Sélectionner un élément dorsal par paramètre d'authentification

Vous pouvez configurer un déploiement d'API pour sélectionner dynamiquement un élément dorsal en fonction d'un paramètre d'authentification (également appelé 'claim') retourné 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 à https://<gateway-hostname>/marketing/sales dépend de la valeur de la revendication tenant retournée par une fonction d'autorisation, comme suit :

  • si la variable de contexte request.auth[tenant] est réglée à tenant-cars, la demande est acheminée vers http://cars-api.example.com
  • si la variable de contexte request.auth[tenant] est réglée à tenant-trucks, la demande est acheminée vers http://trucks-api.example.com

Exemple 7 : Sélectionner un élément dorsal par paramètre d'interrogation

Vous pouvez configurer un déploiement d'API pour sélectionner dynamiquement un élément dorsal en fonction d'un paramètre d'interrogation transmis par la demande initiale.

{
  "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 à https://<gateway-hostname>/marketing/sales dépend de la valeur du paramètre d'interrogation vehicle-type transmis par la demande initiale, comme suit :

  • Si le paramètre d'interrogation vehicle-type a la valeur car, la demande est acheminée vers cars-api.example.com.
  • Si le paramètre d'interrogation vehicle-type a la valeur truck ou minivan, la demande est acheminée vers une fonction sans serveur dans le service des fonctions pour OCI pour traitement.
  • Si la valeur du paramètre d'interrogation vehicle-type n'est ni car, ni truck, ni minivan, la demande est acheminée vers cars-api.example.com par défaut :