Вы просматриваете документацию по 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 задан как переменная, которая не существует в потоке, где выполняется правило.
диагностика;
Определите название правила SOAPMessageValidation, в котором произошла ошибка, и название переменной
sourceиз строки ошибки. Например, в следующей строке ошибки название правила SOAPMessageValidation –SOAP-Message-Validation-1, а переменнаяsource–request:"faultstring": "request message is not available for MessageValidation: SOAP-Message-Validation-1"В 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>Определите, задана ли переменная, используемая в элементе
<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. Подробнее о переменных в сообщениях…
диагностика;
Определите имя переменной, которая не преобразуется в тип Message, по строке ошибки. Например, в следующей строке ошибки имя переменной –
message.content:"faultstring": "Variable message.content does not resolve to a Message"Проверьте все правила 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"
}
}
}
диагностика;
Определите название правила 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]\""Проверьте правила 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>Проверьте входные данные в строке, указанной на шаге 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.Изучите файл определения 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"
}
}
}
диагностика;
Определите название правила 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]\""Проверьте правило 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>Проверьте входные данные полезной нагрузки на строке, указанной на шаге 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>.Изучите файл определения 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"
}
}
}
диагностика;
Определите название правила 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)\""Проверьте входные данные в строке, указанной на шаге 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>
...