Erreur inconnue dans le panneau "Essayer ce API"

Vous consultez la documentation Apigee Edge.
Accédez à la documentation**Apigee X**.
info

Problème constaté

L'appel d'API depuis le portail des développeurs intégré échoue avec Unknown Error ou une réponse vide dans le panneau "Essayer cette API".

Messages d'erreur

Il est possible qu'une réponse vide ou le message d'erreur suivant s'affiche pour les requêtes d'API dans le portail intégré :

Unknown Error

Dans l'onglet Outils de développement > Console, l'erreur suivante s'affiche :

Access to XMLHTTPRequest at 'API_URL' from origin 'URL_of_Integrated_DevPortal'
has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is
present on the requested resource.

Un message d'erreur générique, tel qu'il apparaît dans l' onglet Outils de développement > Console, se présente comme suit :

Message d'erreur générique, cliquez pour agrandir message d'erreur générique

Causes possibles

Cause Description Instructions de dépannage applicables
Erreur de règle non gérée La réponse d'erreur par défaut est envoyée sans en-têtes CORS lorsque n'importe quelle règle échoue dans le flux d'exécution de la requête d'API. Utilisateurs du cloud public Edge
Plusieurs valeurs pour Access-Control-Allow-Origin Utilisation de "Add" au lieu de "Set" dans la règle AssignMessage. Utilisateurs du cloud public Edge

Cause : Erreur de règle non gérée

Diagnostic

  1. Vérifiez que le problème ne se produit que si une réponse non 2XX est attendue.
  2. Pour les requêtes ayant échoué, vérifiez qu'il existe des règles dans le flux de proxy.
  3. Tracez la requête et vérifiez si une règle avec continueOnError="false" échoue et génère une erreur.
    1. Si c'est le cas, vérifiez si la règle AssignMessage CORS a été exécutée ou non dans le flux de réponse d'erreur.
    2. Si ce n'est pas le cas, c'est la cause du problème.
      En effet, lorsqu'une règle avec l'élément continueOnError="false" échoue, la requête entre dans le flux de réponse d'erreur. S'il n'y a pas de gestion explicite des erreurs dans le flux de réponse d'erreur, la réponse d'erreur par défaut correspondant à la règle est renvoyée. Cette réponse d'erreur ne comporte aucun en-tête CORS. Par conséquent, l'appel d'API depuis le portail des développeurs intégré échoue avec Unknown error.

Les captures d'écran suivantes présentent un exemple de message d'erreur et un exemple message de réussite.

Exemple de message d'erreur dans le panneau Essayer cette API du portail intégré et dans la fenêtre Trace du proxy :

Exemple de message d'erreur, cliquez pour agrandir Exemple de message d'erreur

Exemple de message de réussite dans le panneau Essayer cette API du portail intégré et dans la fenêtre Trace du proxy :

Exemple de message de confirmation, cliquez pour agrandir Exemple de message de réussite

Solution

  1. Au lieu de vous appuyer sur le message d'erreur par défaut, vous devez implémenter une règle d'erreur pour gérer la réponse d'erreur. Incluez une règle AssignMessage CORS avec les en-têtes appropriés et appelez-la dans la règle d'erreur FaultRule.
  2. Il peut parfois être impossible de définir une règle d'erreur pour chaque erreur. Par conséquent, vous pouvez implémenter une règle d'erreur par défaut pour exécuter la règle AssignMessage CORS :
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ProxyEndpoint name="proxy-endpoint-name">
    <Description/>
    <!-- Add a default fault rule to add CORS -->
    <DefaultFaultRule name="fault-rule">
        <Step>
            <Name>add-cors</Name>
        </Step>
    </DefaultFaultRule>
    <FaultRules/>
    <!--
    <Flows />
    Rest of the proxy definition
    -->
</ProxyEndpoint>

Cause : Plusieurs valeurs pour Access-Control-Allow-Origin

Diagnostic

  1. Vérifiez la valeur de l'en-tête Access-Control-Allow-Origin dans une session de trace.
  2. L'en-tête Access-Control-Allow-Origin n'autorise la définition que d'une seule valeur à définir. Si vous définissez plusieurs valeurs, cela peut entraîner un problème CORS et le portail des développeurs ne pourra pas afficher de réponses.
  3. Si la valeur de l'en-tête Access-Control-Allow-Origin dans la trace ressemble à :
    *,*
    cela signifie que le serveur cible et la règle AssignMessage CORS définissent sa valeur.
  4. Cela peut se produire lorsqu'un utilisateur a utilisé les <Add> element pour Access-Control-Allow-Origin dans une règle, ou lorsque le backend lui-même définit plusieurs valeurs.

Exemple de Access-Control-Allow-Origin égal à *,* :

Exemple de plusieurs valeurs utilisées, cliquez pour agrandir Exemple de plusieurs valeurs utilisées

Exemple de Access-Control-Allow-Origin égal à * :

Exemple de valeur unique utilisée, cliquez pour agrandir Exemple de valeur unique utilisée

Exemple d'utilisation de <Add> :

Exemple d'utilisation de &quot;Ajouter&quot;, cliquez pour agrandir Exemple d'utilisation de la fonction Add

Exemple d'utilisation de <Set> :

Exemple d'utilisation de Set, cliquez pour agrandir Exemple d'utilisation de Set

Solution

  1. L'approche recommandée consiste à utiliser le <Set> element (au lieu du <Add> element) pour Access-Control-Allow-Origin car une seule valeur est autorisée.
  2. Vous pouvez également définir l'en-tête Access-Control-Allow-Origin à un seul endroit : soit la règle AssignMessage CORS soit le serveur cible.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<AssignMessage async="false" continueOnError="false" enabled="true" name="set-cors">
    <DisplayName>Set CORS</DisplayName>
    <FaultRules/>
    <Properties/>
    <Set>
        <Headers>
            <Header name="Access-Control-Allow-Origin">*</Header>
        </Headers>
    </Set>
    <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
    <AssignTo createNew="false" transport="http" type="response"/>
</AssignMessage>

Si vous avez encore besoin de l'aide de l'assistance Apigee, consultez Vous devez collecter des informations de diagnostic.

Vous devez collecter des informations de diagnostic

Rassemblez les informations de diagnostic suivantes, puis contactez l'assistance Apigee Edge :

  • Nom de l'organisation
  • Nom de l'environnement
  • Nom de proxy d'API
  • Commande curl complète utilisée pour reproduire l'erreur
  • Fichier de trace pour les requêtes d'API
  • Sortie complète de la réponse du serveur cible/backend, ainsi que la taille de la charge utile