Dépannage des erreurs d'exécution de la règle d'attribution des messages

Vous consultez la documentation d'Apigee Edge.
Accédez à la documentation sur Apigee X.
info

UnresolvedVariable

Code d'erreur

steps.assignmessage.UnresolvedVariable

Corps de la réponse d'erreur

{
    "fault": {
        "faultstring": "AssignMessage[policy_name]: unable to resolve variable [variable_name]",
        "detail": {
            "errorcode": "steps.assignmessage.UnresolvedVariable"
        }
    }
}

Cause

Cette erreur se produit si une variable spécifiée dans la règle AssignMessage est :

  • hors du champ d'application (non disponible dans le flux spécifique où la règle est exécutée) ou
  • impossible à résoudre (non définie),

Par exemple, cette erreur se produit si la règle d'attribution des messages s'exécute dans le flux de requête, mais que l'attribut source de l'élément <Copy> est défini sur la variable response ou error ou toute autre variable personnalisée qui n'existe pas dans le flux de demande.

Diagnostic

  1. Identifiez la stratégie d'attribution des messages où l'erreur s'est produite et le nom de la variable non disponible. Vous pouvez trouver ces deux éléments dans l'élément faultstring de la réponse d'erreur.

    Par exemple, dans l'élément faultstring suivant, le nom de la règle est googleBook et la variable est var :

    "faultstring": "AssignMessage[googleBook]: unable to resolve variable var"
    
  2. Dans le fichier XML de la règle d'attribution de messages ayant échoué, vérifiez que le nom de la variable utilisée correspond au nom de la variable identifié dans la chaîne d'erreur (étape 1 ci-dessus). Par exemple, la stratégie suivante définit l'attribut source de l'élément <Copy> sur une variable nommée var, qui correspond à ce que contient le faultstring :

    <AssignMessage async="false" continueOnError="false" enabled="true" name="Assign-Message-1">
       <DisplayName>googleBook</DisplayName>
       <Properties />
       <Copy source="var">
          <Headers>
             <Header name="user-agent" />
          </Headers>
       </Copy>
       <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
       <AssignTo createNew="true" transport="http" type="request">googleBookReq</AssignTo>
    </AssignMessage>
    
  3. Déterminez si la variable est définie et disponible dans le flux dans lequel la règle Assign Message est en cours d'exécution.

  4. Si la variable est :

    1. hors du champ d'application (non disponible dans le flux spécifique où la règle est exécutée), ou
    2. impossible à résoudre (non définie),

    alors il s'agit de la cause de l'erreur.

    Supposons, par exemple, que la règle d'attribution de messages affichée ci-dessus s'exécute dans le flux de requête. Vérifiez si la variable var est définie dans l'une des stratégies exécutées avant la règle "Assign Message" dans le flux de requêtes. Si la variable n'a pas été définie, vous recevez le code d'erreur :

    steps.assignmessage.UnresolvedVariable
    

Solution

Vérifiez que la variable référencée dans la stratégie existe et qu'elle est disponible dans le flux spécifique où la règle d'attribution de message est en cours d'exécution.

Pour corriger l'exemple de règle présenté ci-dessus, vous pouvez modifier l'attribut source dans l'élément <Copy> afin qu'il soit la variable de requête, ou toute autre variable personnalisée de type message qui existe dans le flux de la requête.

<AssignMessage async="false" continueOnError="false" enabled="true" name="Assign-Message-1">
   <DisplayName>googleBook</DisplayName>
   <Properties />
   <Copy source="request">
      <Headers>
         <Header name="user-agent" />
      </Headers>
   </Copy>
   <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
   <AssignTo createNew="true" transport="http" type="request">googleBookReq</AssignTo>
</AssignMessage>

VariableOfNonMsgType

Code d'erreur

steps.assignmessage.VariableOfNonMsgType

Corps de la réponse d'erreur

{
    "fault": {
        "faultstring": "AssignMessage[policy_name]: value of variable [variable] is not of type Message",
        "detail": {
            "errorcode": "steps.assignmessage.VariableOfNonMsgType"
        }
    }
}

Cause

Cette erreur se produit si l'attribut source de l'élément <Copy> est défini sur une variable qui n'est pas de type Message.

Les variables de type Message représentent des requêtes et des réponses HTTP entières. Les variables de flux Edge intégrées request, response et message sont de type message. Pour en savoir plus sur les variables de message, consultez la documentation de référence sur les variables.

Diagnostic

  1. Identifiez la règle d'attribution des messages où l'erreur s'est produite, ainsi que le nom de la variable dont le type est incorrect. Vous pouvez trouver ces deux éléments dans l'élément faultstring de la réponse d'erreur. Par exemple, dans le fichier faultstring suivant, le nom de la règle est GenerateGeocodingRequest et celui de la variable est PostalCode :

    "faultstring": "AssignMessage[GenerateGeocodingRequest]: value of variable PostalCode is not of type Message"
    
  2. Dans le fichier XML de la règle d'attribution de messages échoué, vérifiez que le nom de la variable définie dans l'élément <Copy> correspond au nom de la variable identifiée dans la chaîne d'erreur (étape 1 ci-dessus). Par exemple, la règle suivante définit un attribut source sur une variable nommée PostalCode qui correspond au contenu de faultstring :

    <AssignMessage name="GenerateGeocodingRequest">
       <AssignTo createNew="true" type="request">GeocodingRequest</AssignTo>
       <AssignVariable>
          <Name>PostalCode</Name>
          <Ref>request.queryparam.postalcode</Ref>
       </AssignVariable>
       <AssignVariable>
          <Name>Country</Name>
          <Ref>request.queryparam.country</Ref>
       </AssignVariable>
       <Copy source="PostalCode">
          <QueryParams>
             <QueryParam name="q" />
          </QueryParams>
       </Copy>
    </AssignMessage>
    
  3. Déterminez si cette variable est de type message ou non :

    1. Recherchez le code dans le groupe de proxys d'API, où la variable a été définie en premier.
    2. Une fois que vous avez identifié la règle où la variable est définie et renseignée en premier, vous devez déterminer le type de cette variable comme suit :
      1. Vérifiez la valeur de l'attribut "type" (le cas échéant).
      2. En l'absence d'attribut "type", la variable est considérée comme une chaîne.
    3. Si la variable n'est pas de type message (par exemple, une chaîne), il s'agit de la cause de l'erreur. Pour en savoir plus sur les variables courantes et leurs types, consultez la documentation de référence sur les variables.

    Par exemple, examinez la variable PostalCode dans le fichier XML ci-dessus. Elle reçoit la valeur de la variable de flux request.queryparam.postalcode dans l'élément <AssignVariable>. Cette valeur est une chaîne, car il n'y a pas de type d'attribut dans l'attribution de variable.

    Rappelez-vous que la variable PostalCode est utilisée dans l'élément <Copy> de la règle Assignment message :

    <Copy source="PostalCode">
       <QueryParams>
          <QueryParam name="PostalCode" />
       </QueryParams>
    </Copy>
    

    Comme PostalCode n'est pas de type message (il s'agit d'une chaîne dans cet exemple), vous obtenez le code d'erreur suivant :

    steps.assignmessage.VariableOfNonMsgType
    

Solution

Assurez-vous que l'attribut source de l'élément <Copy> de la règle ayant échoué l'attribution de message est défini sur une variable de flux de type message qui existe.

Pour corriger la règle, vous pouvez modifier l'attribut source dans l'élément <Copy> afin de spécifier une variable de type "message". Par exemple, si la règle d'attribution de message est censé s'exécuter dans le flux de requête, vous pouvez utiliser la variable de type de message request ou toute autre variable personnalisée de type "message".

<AssignMessage name="GenerateGeocodingRequest">
   <AssignTo createNew="true" type="request">GeocodingRequest</AssignTo>
   <AssignVariable>
      <Name>PostalCode</Name>
      <Ref>request.queryparam.postalcode</Ref>
   </AssignVariable>
   <AssignVariable>
      <Name>Country</Name>
      <Ref>request.queryparam.country</Ref>
   </AssignVariable>
   <Copy source="request">
      <QueryParams>
         <QueryParam name="PostalCode" />
      </QueryParams>
   </Copy>
</AssignMessage>