Вы просматриваете документацию Apigee Edge .
Перейдите в документацию Apigee X.info
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"
}
}
}
Причина
Эта ошибка возникает, если переменная сообщения , указанная в элементе <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 указывает переменную с именем
requestв элементе<Source>, которая соответствует содержимому строки ошибки:<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> политики неудачной проверки SOAP-сообщений, определена и существует в потоке, где выполняется эта политика.
Чтобы исправить приведенный выше пример, вы можете изменить элемент <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 .
Переменные типа Message представляют собой полные HTTP-запросы и ответы. Встроенные переменные потока Apigee Edge request , response и message имеют тип 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. Например, в политике, вызвавшей ошибку 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>В приведенном выше примере в строке 9 используется закрывающий тег
</shipTo>.Изучите файл определения 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 содержит файл ресурсовwsdlв элементе<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>Изучите входные данные по номеру линии, указанному на шаге 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 дочерний элемент
<country>находится под элементом<shipTo>.Изучите файл определения 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>
...