Устранение ошибок выполнения правил проверки сообщений SOAP

Вы просматриваете документацию по Apigee Edge.
Перейдите к документации по Apigee X.
Информация

SourceMessageNotAvailable

Код ошибки

steps.messagevalidation.SourceMessageNotAvailable

Тело ответа с ошибкой

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

Пример тела ответа с ошибкой

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

Причина

Эта ошибка возникает, если переменная message, указанная в элементе <Source> правила SOAPMessageValidation, является:

  • Не в области действия (недоступно в определенном процессе, в котором выполняется правило) или
  • не может быть разрешен (не определен);

Например, эта ошибка возникает, если элемент <Source> в правиле SOAPMessageValidation задан как переменная, которая не существует в потоке, где выполняется правило.

диагностика;

  1. Определите название правила SOAPMessageValidation, в котором произошла ошибка, и название переменной source из строки ошибки. Например, в следующей строке ошибки название правила SOAPMessageValidation – SOAP-Message-Validation-1, а переменная source – request:

    "faultstring": "request message is not available for MessageValidation: SOAP-Message-Validation-1"
    
  2. В XML-файле правил SOAPMessageValidation, которые не удалось применить, убедитесь, что название переменной, заданной в элементе <Source>, совпадает с названием переменной, указанным в строке ошибки (шаг 1 выше).

    Например, в следующем правиле SOAPMessageValidation в элементе <Source> указана переменная request, которая соответствует строке ошибки:

    <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. Определите, задана ли переменная, используемая в элементе <Source>, и доступна ли она в потоке, в котором выполняется правило SOAPMessageValidation.

    Если переменная:

    • недоступно (не поддерживается в определенном процессе, в котором выполняется правило);
    • не может быть разрешен (не определен);

    то это и есть причина ошибки.

    Предположим, что правило SOAPMessageValidation, показанное выше, выполняется в потоке ответов. Однако переменная request, используемая в примере элемента <Source> выше, доступна только в потоке запроса.

    Поскольку переменная request не существует в потоке ответов, вы получите следующую ошибку:

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

Разрешение

Убедитесь, что переменная, заданная в элементе <Source> правила SOAPMessageValidation, определена и существует в потоке, в котором выполняется правило.

Чтобы исправить приведенный выше пример, можно изменить элемент <Source>, чтобы использовать переменную response, которая существует в потоке ответов:

<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

Код ошибки

steps.messagevalidation.NonMessageVariable

Тело ответа с ошибкой

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

Пример тела ответа с ошибкой

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

Причина

Эта ошибка возникает, если для элемента <Source> в правиле SOAPMessageValidation задана переменная, тип которой не Message.

Переменные типа сообщения представляют собой полные HTTP-запросы и ответы. Встроенные переменные потока Apigee Edge request, response и message имеют тип Message. Подробнее о переменных в сообщениях…

диагностика;

  1. Определите имя переменной, которая не преобразуется в тип Message, по строке ошибки. Например, в следующей строке ошибки имя переменной – message.content:

    "faultstring": "Variable message.content does not resolve to a Message"
    
  2. Проверьте все правила SOAPMessageValidation в определенном прокси API, в котором произошел сбой. Может быть одно или несколько правил SOAPMessageValidation. Определите, в каких правилах SOAPMessageValidation переменная, указанная в элементе <Source>, соответствует названию переменной, указанному в строке ошибки (шаг 1 выше).

    Например, следующая политика присваивает элементу <Source> переменную message.content, которая соответствует строке ошибки:

    <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>
    

    Поскольку переменная message.content не относится к типу Message, вы получите ошибку:

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

Разрешение

Убедитесь, что элемент <Source> в правиле SOAPMessageValidation, которое не удалось выполнить, задан как переменная типа Message, существующая в потоке, где выполняется правило.

Чтобы исправить правила, измените элемент <Source> и укажите переменную типа Message. Например, в политике failed SOAPMessageValidation элемент <Source> можно указать как 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>

Сбой

Код ошибки

steps.messagevalidation.Failed

Тело ответа с ошибкой

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

Пример тела ответа с ошибкой

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

Причина

Эта ошибка возникает, если правилу SOAPMessageValidation не удается проверить полезную нагрузку входного сообщения на соответствие схеме XSD или определению WSDL. Она также возникает, если в сообщении полезной нагрузки неправильно отформатирован код JSON или XML.

Вот некоторые возможные причины этой ошибки:

Причина Описание
Несоответствие полезной нагрузки XML Входные данные XML не соответствуют схеме XSD, указанной в правиле SoapMessageValidation.
Несоответствие полезной нагрузки SOAP Входные данные полезной нагрузки SOAP не соответствуют определению WSDL, указанному в правиле SoapMessageValidation.
Неправильный формат JSON или XML Входная полезная нагрузка SOAP не содержит корректно отформатированный XML или JSON.

Причина: несоответствие полезной нагрузки XML

Эта ошибка возникает, если входные данные XML не соответствуют схеме XSD, указанной в элементе <ResourceURL> правила SoapMessageValidation.

Пример сообщения об ошибке

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

диагностика;

  1. Определите название правила SOAPMessageValidation, причину ошибки и номер строки, в которой полезная нагрузка XML не соответствует схеме XSD. Вся эта информация содержится в строке ошибки. Например, в следующей строке ошибки название правила SOAPMessageValidation – SOAP-Message-Validation-1,, причина ошибки – Expecting a child element but found none [Line 9], а номер строки – 9.

    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expecting a child element but found none [Line 9]\""
    
  2. Проверьте правила SOAPMessageValidation и убедитесь, что для проверки сообщений используется файл определения схемы XSD. Например, в следующем правиле SOAPMessageValidation есть файл ресурса XSD в элементе<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. Проверьте входные данные в строке, указанной на шаге 1, чтобы понять, что вызвало сбой.

    Пример полезной нагрузки XML

    <?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>
    

    В примере выше закрывающий тег </shipTo> находится в строке 9.

  4. Изучите файл определения XML-схемы Script-1.xsd, используемый в правиле SOAPMessageValidation, чтобы узнать, как должен выглядеть элемент <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>
    ...
    

    Согласно образцу XSD, используемому для проверки, элемент <shipTo> должен содержать дочерние элементы <name>, <street>, <address> и <country>. Однако во входных данных XML есть только один дочерний элемент – <name>. В результате появляется ошибка:

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

Разрешение

Эту ошибку можно устранить двумя способами:

Решение 1

Если вы считаете, что определение схемы XSD накладывает ненужные ограничения и под элементом <shipTo> требуется только дочерний элемент <name>, вы можете изменить Script-1.xsd, используемый в правиле SOAPMessageValidation. Чтобы проверить приведенный выше пример полезной нагрузки, измените файл XSD следующим образом:

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

Решение 2

Если файл определения XSD правильный, то входную полезную нагрузку XML можно изменить в соответствии с xsd. Например, вы можете изменить полезную нагрузку, чтобы она соответствовала xsd, следующим образом:

<?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>

Причина: несоответствие полезной нагрузки SOAP

Эта ошибка возникает, если входная полезная нагрузка SOAP не соответствует определению WSDL, указанному в элементе <ResourceURL> правила SoapMessageValidation.

Пример сообщения об ошибке

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

диагностика;

  1. Определите название правила SOAPMessageValidation, причину ошибки и номер строки, в которой полезная нагрузка SOAP не соответствует определению WSDL. Вся эта информация содержится в строке ошибки. Например, в следующей строке ошибки название правила SOAPMessageValidation – SOAP-Message-Validation-1, причина ошибки – \"Element name mismatch. Wildcard? [Line 11]\"", а номер строки – 11:

    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Element name mismatch. Wildcard? [Line 11]\""
    
  2. Проверьте правило SOAPMessageValidation и убедитесь, что оно использует схему wsdl для проверки сообщений. Например, в следующем правиле SOAPMessageValidation в элементе <ResourceURL> указан файл ресурса wsdl:

    <?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. Проверьте входные данные полезной нагрузки на строке, указанной на шаге 1, чтобы понять, что вызвало сбой.

    Пример входной полезной нагрузки SOAP

    <?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>
    

    В примере выше в строке 11 под элементом <shipTo> находится дочерний элемент <country>.

  4. Изучите файл определения WSDL, SOAP-Message-Validation-1.wsdl, который используется в правиле SOAPMessageValidation, чтобы понять, что может быть не так с дочерним элементом <country> в элементе <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>
    ...
    

    Согласно определению WSDL, используемому для проверки, у элемента <shipTo> нет дочернего элемента <country>. В результате появляется ошибка:

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

Разрешение

Эту ошибку можно устранить двумя способами:

Решение 1

Если вы обнаружите, что определение WSDL используется неправильно, вы можете изменить SOAP-Message-Validation-1.wsdl, используемый в правиле SOAPMessageValidation. Чтобы проверить приведенный выше пример полезной нагрузки, измените файл следующим образом:

...
<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>

Решение 2

Если определение WSDL правильное, то входную полезную нагрузку SOAP можно изменить в соответствии с определением WSDL.

Например, вы можете изменить входную полезную нагрузку SOAP следующим образом:

<?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>

Причина: неправильный формат JSON или XML

Эта ошибка возникает, если входная полезная нагрузка SOAP не соответствует определению WSDL, указанному в элементе <ResourceURL> правила SoapMessageValidation.

Пример сообщения об ошибке

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

диагностика;

  1. Определите название правила SOAPMessageValidation, причину ошибки и номер строки полезной нагрузки XML, которая не соответствует определению WSDL. Вся эта информация содержится в строке ошибки. Например, в следующей строке ошибки название правила SOAPMessageValidation – SOAP-Message-Validation-1, причина ошибки – Expected </title> at line 15(possibly around char 420):, а номер строки – 15..

    "faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expected </title> at line 15(possibly  around char 420)\""
    
  2. Проверьте входные данные в строке, указанной на шаге 1, чтобы понять, что вызвало сбой.

    Пример входной полезной нагрузки SOAP

    <?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>
    

    В примере выше в строке 15 входного XML-файла есть элемент <title>, но нет закрывающего тега </title>.

Разрешение

Чтобы устранить ошибку, убедитесь, что входные данные действительны и сформированы правильно.

Например, вы можете изменить входную полезную нагрузку XML следующим образом:

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