Dépannage des erreurs d'exécution de la règle de validation de message SOAP

Vous consultez la documentation d'Apigee Edge.
Consultez la documentation Apigee X.
en savoir plus

SourceMessageNotAvailable

Code d'erreur

steps.messagevalidation.SourceMessageNotAvailable

Corps de la réponse d'erreur

{
  "fault": {
    "faultstring": "source_var_name message is not
     available for[policy_name]",
    "detail": {
      "Errorcode":
       "steps.messagevalidation.SourceMessageNotAvailable"
     }
  }
}

Exemple de corps de réponse d'erreur

{
  "fault": {
    "faultstring": "request message is not available for MessageValidation: SOAP-Message-Validation-1",
    "detail": {
      "errorcode": "steps.messagevalidation.SourceMessageNotAvailable"
    }
  }
}

Cause

Cette erreur se produit si la variable message spécifiée dans l'élément <Source> de la règle SOAPMessageValidation est l'une des suivantes :

  • 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 l'élément <Source> de la règle SOAPMessageValidation est défini sur une variable qui n'existe pas dans le flux où la règle est exécutée.

Diagnostic

  1. Identifiez le nom de la règle SOAPMessageValidation dans laquelle l'erreur se produit et le nom de la variable source à partir de la chaîne d'erreur. Par exemple, dans la chaîne d'erreur suivante, le nom de la règle SOAPMessageValidation est SOAP-Message-Validation-1 et la variable source est request :

    "faultstring": "request message is not available for MessageValidation: SOAP-Message-Validation-1"
    
  2. Dans le XML de la règle SOAPMessageValidation ayant échoué, vérifiez que le nom de la variable définie dans l'élément <Source> correspond au nom de la variable identifiée dans la chaîne d'erreur (étape 1 ci-dessus).

    Par exemple, la règle SOAPMessageValidation suivante spécifie une variable nommée request dans l'élément <Source>, qui correspond au contenu de la chaîne d'erreur :

    <MessageValidation async="false" continueOnError="false" enabled="true" name="SOAP-Message-Validation-1">
        <DisplayName>SOAP Message Validation-1</DisplayName>
        <Properties/>
        <Element namespace="http://schemas.xmlsoap.org/soap/prices">GetPriceResponse</Element>
        <SOAPMessage/>
        <Source>request</Source>
        <ResourceURL>xsd://Script-1.xsd</ResourceURL>
    </MessageValidation>
    
  3. Déterminez si la variable utilisée dans l'élément <Source> est définie et disponible dans le flux dans lequel la règle SOAPMessageValidation s'exécute.

    Si la variable 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),

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

    Par exemple, supposons que la règle SOAPMessageValidation présentée ci-dessus s'exécute dans le flux de réponse. Cependant, la variable request utilisée dans l'exemple de l'élément <Source> ci-dessus n'est disponible que dans le flux de requête.

    Comme la variable request n'existe pas dans le flux de réponse, vous obtenez l'erreur suivante :

    "faultstring": "request message is not available for MessageValidation: SOAP-Message-Validation-1"
    

Résolution

Vérifiez que la variable définie dans l'élément <Source> de la règle SOAPMessageValidation ayant échoué est définie et qu'elle existe dans le flux où la règle s'exécute.

Pour corriger l'exemple ci-dessus, vous pouvez modifier l'élément <Source> afin d'utiliser la variable response, qui existe dans le flux de réponse :

<MessageValidation async="false" continueOnError="false" enabled="true" name="SOAP-Message-Validation-1">
    <DisplayName>SOAP Message Validation-1</DisplayName>
    <Properties/>
    <Element namespace="http://schemas.xmlsoap.org/soap/prices">GetPriceResponse</Element>
    <SOAPMessage/>
    <Source>response</Source>
    <ResourceURL>xsd://Script-1.xsd</ResourceURL>
</MessageValidation>

NonMessageVariable

Code d'erreur

steps.messagevalidation.NonMessageVariable

Corps de la réponse d'erreur

{
  "fault": {
    "faultstring": "Variable var_name does not resolve to a Message"
    "detail": {
      "errorcode": "steps.messagevalidation.NonMessageVariable"
    }
  }
}

Exemple de corps de réponse d'erreur

{
  "fault": {
    "faultstring": "Variable message.content does not resolve to a Message",
    "detail": {
      "errorcode": "steps.messagevalidation.NonMessageVariable"
    }
  }
}

Cause

Cette erreur se produit si l'élément <Source> de la règle SOAPMessageValidation est défini sur une variable qui n'est pas du type Message.

Les variables de type Message représentent des requêtes et des réponses HTTP entières. Les variables de flux Apigee 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 le nom de la variable ne pointant pas vers un type Message dans la chaîne d'erreur. Par exemple, dans la chaîne d'erreur suivante, le nom de la variable est message.content :

    "faultstring": "Variable message.content does not resolve to a Message"
    
  2. Examinez toutes les règles SOAPMessageValidation dans le proxy d'API spécifique où l'erreur s'est produite. Il peut y avoir une ou plusieurs règles SOAPMessageValidation. Identifiez la ou les règles SOAPMessageValidation spécifiques dans lesquelles la variable spécifiée dans l'élément <Source> correspond au nom de variable identifié dans la chaîne d'erreur (étape 1 ci-dessus).

    Par exemple, la règle suivante définit l'élément <Source> sur une variable nommée message.content, qui correspond au contenu de la chaîne d'erreur :

    <MessageValidation async="false" continueOnError="false" enabled="true" name="SOAP-Message-Validation-1">
        <DisplayName>SOAP Message Validation-1</DisplayName>
        <Properties/>
        <Element namespace="http://schemas.xmlsoap.org/soap/prices">GetPriceResponse</Element>
        <SOAPMessage/>
        <Source>message.content</Source>
        <ResourceURL>xsd://Script-1.xsd</ResourceURL>
    </MessageValidation>
    

    Comme la variable message.content n'est pas de type Message, vous obtenez l'erreur suivante :

    "faultstring": "Variable message.content does not resolve to a Message"
    

Résolution

Assurez-vous que l'élément <Source> de la règle SOAPMessageValidation ayant échoué est défini sur une variable de type Message qui existe dans le flux où s'exécute la règle.

Pour corriger la règle, vous pouvez modifier l'élément <Source> afin de spécifier une variable de type Message. Par exemple, dans la règle SOAP ayant échoué, vous pouvez spécifier l'élément <Source> en tant que request :

<MessageValidation async="false" continueOnError="false" enabled="true" name="SOAP-Message-Validation-1">
    <DisplayName>SOAP Message Validation-1</DisplayName>
    <Properties/>
    <Element namespace="http://sample.com"> sampleObject</Element>
    <SOAPMessage/>
    <Source>request</Source>
    <ResourceURL>xsd://Script-1.xsd</ResourceURL>
</MessageValidation>

Échec

Code d'erreur

steps.messagevalidation.Failed

Corps de la réponse d'erreur

{
  "fault": {
    "faultstring": "Variable var_name failed with reason: \"reason [Line varline_num
    "detail": {
      "errorcode": "steps.messagevalidation.Failed"
    }
  }
}

Exemple de corps de réponse d'erreur

{
  "fault": {
    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expecting a child element but found none [Line 9]\"",
    "detail": {
      "errorcode": "steps.messagevalidation.Failed"
    }
  }
}

Cause

Cette erreur se produit si la règle SOAPMessageValidation ne parvient pas à valider la charge utile du message d'entrée par rapport au schéma XSD ou à la définition WSDL. Elle se produira également si le message de charge utile contient des syntaxes JSON ou XML incorrectes.

Voici quelques-unes des causes pouvant entraîner cette erreur :

Cause Description
Charge utile XML incohérente La charge utile XML d'entrée ne respecte pas le schéma XSD spécifié dans la stratégie SoapMessageValidation.
Incohérence de la charge utile SOAP La charge utileSOAP d'entrée ne respecte pas la définition WSDL spécifiée dans la stratégie SoapMessageValidation.
Format JSON ou XML incorrect La charge utile SOAP d'entrée ne contient pas de code XML ou JSON correctement formaté.

Cause : charge utile XML incompatible

Cette erreur se produit si la charge utile XML d'entrée ne respecte pas le schéma XSD spécifié dans l'élément <ResourceURL> de la règle SoapMessageValidation.

Exemple de message d'erreur

{
  "fault": {
    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expecting a child element but found none [Line 9]\"",
    "detail": {
      "errorcode": "steps.messagevalidation.Failed"
    }
  }
}

Diagnostic

  1. Identifiez le nom de la règle SOAPMessageValidation, le motif de l'échec et le numéro de ligne auquel la charge utile XML ne correspond pas au schéma XSD. Toutes ces informations se trouvent dans la chaîne d'erreur. Par exemple, dans la chaîne d'erreur suivante, le nom de la règle SOAPMessageValidation est SOAP-Message-Validation-1, le motif de l'échec est Expecting a child element but found none [Line 9] et le numéro de ligne est 9.

    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expecting a child element but found none [Line 9]\""
    
  2. Examinez la règle SOAPMessageValidation et vérifiez qu'elle utilise un fichier de définition de schéma XSD pour valider les messages. Par exemple, la règle SOAP suivante possède un fichier de ressources XSD dans l'élément <ResourceURL> :

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <MessageValidation async="false" continueOnError="false" enabled="true" name="SOAP-Message-Validation-1">
        <DisplayName>SOAP Message Validation-1</DisplayName>
        <Properties/>
        <SOAPMessage/>
        <Source>request</Source>
        <ResourceURL>xsd://Script-1.xsd</ResourceURL>
    </MessageValidation>
    
  3. Examinez la charge utile d'entrée sur le numéro de ligne identifié à l'étape 1 ci-dessus pour comprendre la cause de l'échec.

    Exemple de charge utile du fichier XML d'entrée

    <?xml version="1.0"?>
    <soap:Envelope
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
    <soap:Body>
        <shipOrder
        xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance">
        <shipTo>
            <name>Karl Kalckstein</name>
        </shipTo>
        <items>
            <item>
                <title>I love APIs</title>
                <quantity>1</quantity>
                <price>2.90</price>
            </item>
        </items>
    </shipOrder>
    </soap:Body>
    </soap:Envelope>
    

    Dans l'exemple ci-dessus, la ligne 9 comporte la balise de fin </shipTo>.

  4. Examinez le fichier de définition de schéma XML, Script-1.xsd, utilisé dans la règle SOAPMessageValidation pour voir à quoi devrait ressembler l'élément <shipTo> :

    ...
    <xsd:element name="shipTo" type="shipAddress"/>
    ...
    <xsd:complexType name="shipAddress">
    <xsd:sequence>
    <xsd:element name="name" type="xsd:string"/>
    <xsd:element name="street" type="xsd:string"/>
    <xsd:element name="address" type="xsd:string"/>
    <xsd:element name="country" type="xsd:string"/>
    </xsd:sequence>
    </xsd:complexType>
    ...
    

    Selon l'exemple XSD utilisé pour la validation, l'élément <shipTo> doit avoir les éléments enfants <name>, <street>, <address> et <country>. Cependant, la charge utile du fichier XML d'entrée ne comporte qu'un seul élément enfant, <name>. Par conséquent, vous obtenez l'erreur suivante :

    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expecting a child element but found none [Line 9]\""
    

Résolution

Deux options s'offrent à vous pour résoudre cette erreur de validation :

Solution n° 1

Si vous constatez que la définition de schéma XSD impose des limitations inutiles et que seul l'élément enfant <name> est requis sous l'élément <shipTo>, vous pouvez modifier le paramètre Script-1.xsd utilisé dans la règle SOAPMessageValidation. Pour valider l'exemple de charge utile ci-dessus, vous pouvez modifier le fichier XSD comme suit :

...
<xsd:element name="shipTo" type="shipAddress"/>
...
<xsd:complexType name="shipAddress">
<xsd:sequence>
<xsd:element name="name" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>

Solution n° 2

Si le fichier de définition XSD est correct, la charge utile du fichier XML d'entrée peut être modifiée pour correspondre à xsd. Par exemple, vous pouvez modifier la charge utile pour être conforme à xsd comme suit :

<?xml version="1.0">
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Body>
    <shipOrder xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance">
    <shipTo>
        <name>Karl Kalckstein</name>
        <street>1020 Parkway</street>
        <address>Mountain View, CA 94043</address>
        <country>USA</country>
    </shipTo>
    <items>
        <item>
            <title>I love APIs</title>
            <quantity>1</quantity>
            <price>2.90</price>
        </item>
    </items>
</shipOrder>
</soap:Body>
</soap:Envelope>

Cause : charge utile SOAP incompatible

Cette erreur se produit si la charge utile SOAP d'entrée ne respecte pas la définition WSDL spécifiée dans l'élément <ResourceURL> de la règle SoapMessageValidation.

Exemple de message d'erreur

{
  "fault": {
    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Element name mismatch. Wildcard? [Line 11]\"",
    "detail": {
      "errorcode": "steps.messagevalidation.Failed"
    }
  }
}

Diagnostic

  1. Identifiez le nom de la règle SOAPMessageValidation, le motif de l'échec et le numéro de ligne auquel la charge utile SOAP ne correspond pas à la définition WSDL. Vous trouverez toutes ces informations dans la chaîne d'erreur. Par exemple, dans la chaîne d'erreur suivante, le nom de la règle SOAPMessageValidation est SOAP-Message-Validation-1, le motif de l'échec est \"Element name mismatch. Wildcard? [Line 11]\"" et le numéro de ligne est 11 :

    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Element name mismatch. Wildcard? [Line 11]\""
    
  2. Examinez la règle SOAPMessageValidation et vérifiez qu'elle utilise un schéma wsdl pour valider les messages. Par exemple, la règle SOAPMessageValidation suivante comporte un fichier de ressource wsdl dans l'élément <ResourceURL> :

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <MessageValidation async="false" continueOnError="false" enabled="true" name="SOAP-Message-Validation-1">
        <DisplayName>SOAP Message Validation-1</DisplayName>
        <Properties/>
        <SOAPMessage/>
        <Source>request</Source>
     <ResourceURL>wsdl://SOAP-Message-Validation-1.wsdl</ResourceURL>
    </MessageValidation>
    
  3. Examinez la charge utile d'entrée sur le numéro de ligne identifié à l'étape 1 pour comprendre la cause de l'échec.

    Exemple de charge utile SOAP d'entrée

    <?xml version="1.0"?>
    <soap:Envelope
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
    soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
    <soap:Body>
    <shipOrder
    xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance">
      <shipTo>
        <name>Karl Kalckstein</name>
        <street>1020 Parkway</street>
        <address>Mountain View, CA 94043</address>
        <country>USA</country>
      </shipTo>
      <items>
        <item>
          <title>I love APIs</title>
          <quantity>1</quantity>
          <price>2.90</price>
        </item>
      </items>
    

    Dans l'exemple ci-dessus, la ligne 11 possède l'élément enfant <country> sous l'élément <shipTo>.

  4. Examinez le fichier de définition WSDL, SOAP-Message-Validation-1.wsdl, utilisé dans la règle SOAPMessageValidation pour déterminer les problèmes potentiels que pourrait rencontrer l'élément enfant <country> sous l'élément <shipTo> :

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
        <wsdl:types>
          <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="shipOrder" type="order"/>
    <xsd:complexType name="order">
    <xsd:sequence>
    <xsd:element name="shipTo" type="shipAddress"/>
    <xsd:element name="items" type="cdItems"/>
    </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="shipAddress">
    <xsd:sequence>
    <xsd:element name="name" type="xsd:string"/>
    <xsd:element name="street" type="xsd:string"/>
    <xsd:element name="address" type="xsd:string"/>
    </xsd:sequence>
    ...
    

    Selon la définition WSDL utilisée pour la validation, l'élément <shipTo> n'a pas d'élément enfant <country>. Par conséquent, vous obtenez l'erreur suivante :

    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Element name mismatch. Wildcard? [Line 11]\""
    

Résolution

Deux options s'offrent à vous pour résoudre cette erreur de validation :

Solution n° 1

Si vous constatez que la définition WSDL utilisée est incorrecte, vous pouvez modifier l'élément SOAP-Message-Validation-1.wsdl utilisé dans la règle SOAPMessageValidation. Pour valider l'exemple de charge utile ci-dessus, vous pouvez modifier le fichier comme suit :

...
<xsd:complexType name="shipAddress">`
...
<sequence>
    <element name="name" type="xsd:string"/>
    <element name="street" type="xsd:string"/>
    <element name="address" type="xsd:string"/>
    <element name="country" type="xsd:string"/>
</sequence>

Solution n° 2

Si la définition WSDL est correcte, la charge utile SOAP d'entrée peut être modifiée pour correspondre à la définition WSDL.

Par exemple, vous pouvez modifier la charge utile SOAP d'entrée comme suit :

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Body>
<shipOrder xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance">
    <shipTo>
        <name>Karl Kalckstein</name>
        <street>1020 Parkway</street>
        <address>Mountain View, CA 94043</address>
    </shipTo>
    <items>
        <item>
            <title>I love APIs</title>
            <quantity>1</quantity>
            <price>2.90</price>
        </item>
    </items>

Cause : format JSON ou XML incorrect

Cette erreur se produit si la charge utile SOAP d'entrée ne respecte pas la définition WSDL spécifiée dans l'élément <ResourceURL> de la règle SoapMessageValidation.

Exemple de message d'erreur

{
  "fault": {
    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expected <\/title> at line 15(possibly  around char 420)\"",
    "detail": {
      "errorcode": "steps.messagevalidation.Failed"
    }
  }
}

Diagnostic

  1. Identifiez le nom de la règle SOAPMessageValidation, le motif de l'échec et le numéro de ligne de la charge utile XML qui ne correspond pas à la définition WSDL. Vous trouverez toutes ces informations dans la chaîne d'erreur. Par exemple, dans la chaîne d'erreur suivante, le nom de la règle SOAPMessageValidation est SOAP-Message-Validation-1, le motif de l'échec est Expected </title> at line 15(possibly around char 420): et le numéro de ligne est 15. :

    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expected </title> at line 15(possibly  around char 420)\""
    
  2. Examinez la charge utile d'entrée sur le numéro de ligne identifié à l'étape 1 ci-dessus pour comprendre la cause de l'échec.

    Exemple de charge utile SOAP d'entrée

    <?xml version="1.0"?>
    <soap:Envelope
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
    soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
    <soap:Body>
    <shipOrder xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance">
      <shipTo>
        <name>Karl Kalckstein</name>
        <street>1020 Parkway</street>
        <address>Mountain View, CA 94043</address>
        <country>USA</country>
      </shipTo>
      <items>
        <item>
          <title>I love APIs</titles>
          <quantity>1</quantity>
          <price>2.90</price>
        </item>
      </items>
    </shipOrder>
    </soap:Body>
    </soap:Envelope>
    

    Dans l'exemple ci-dessus, la ligne 15 du fichier XML d'entrée comporte l'élément <title>, mais n'est pas close avec une balise de fin </title>.

Solution

Pour résoudre l'erreur, assurez-vous que la charge utile d'entrée est valide et formée correctement.

Par exemple, vous pouvez modifier la charge utile du fichier XML d'entrée comme suit :

...
</shipTo>
<items>
  <item>
    <title>I love APIs</title>
    <quantity>1</quantity>
    <price>2.90</price>
  </item>
</items>
...