Estás viendo la documentación de Apigee Edge.
Ve a la
documentación de Apigee X. info
SourceMessageNotAvailable
Código de error
steps.messagevalidation.SourceMessageNotAvailable
Cuerpo de la respuesta de error
{ "fault": { "faultstring": "source_var_name message is not available for[policy_name]", "detail": { "Errorcode": "steps.messagevalidation.SourceMessageNotAvailable" } } }
Cuerpo de la respuesta de error de ejemplo
{
"fault": {
"faultstring": "request message is not available for MessageValidation: SOAP-Message-Validation-1",
"detail": {
"errorcode": "steps.messagevalidation.SourceMessageNotAvailable"
}
}
}
Causa
Este error se produce si la variable mensaje especificada en el elemento <Source>
de la política SOAPMessageValidation es una de las siguientes opciones:
- Fuera del alcance (no disponible en el flujo específico en el que se ejecuta la política)
- no se puede resolver (no está definido)
Por ejemplo, este error ocurre si el elemento <Source>
de la política SOAPMessageValidation se configura como una variable que no existe en el flujo en el que se ejecuta la política.
Diagnóstico
Identifica el nombre de la política SOAPMessageValidation en la que produjo el error y el nombre de la variable
source
de la string con error. Por ejemplo, en la siguiente string con error, el nombre de la política SOAPMessageValidation esSOAP-Message-Validation-1
y la variablesource
esrequest
:"faultstring": "request message is not available for MessageValidation: SOAP-Message-Validation-1"
En el archivo XML de la política SOAPMessageValidation, verifica que el nombre de la variable establecida en el elemento
<Source>
coincida con el nombre de la variable identificado en la string de error (paso 1 anterior).Por ejemplo, la siguiente política SOAPMessageValidation especifica una variable llamada
request
en el elemento<Source>
, que coincide con la string con error:<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>
Determina si la variable que se usa en el elemento
<Source>
está definida y disponible en el flujo en el que se ejecuta la política SOAPMessageValidation.Verifica si la variable tiene una de las siguientes características:
- fuera de alcance (no disponible en el flujo específico en el que se ejecuta la política) o
- no se pueden resolver (no está definido)
entonces esa es la causa del error.
A modo de ejemplo, supongamos que la política SOAPMessageValidation anterior se ejecuta en el flujo de respuesta. Sin embargo, la variable
request
que se usa en el ejemplo de elemento<Source>
anterior solo está disponible en el flujo de la solicitud.Debido a que la variable
request
no existe en el flujo de respuesta, recibes el siguiente error:"faultstring": "request message is not available for MessageValidation: SOAP-Message-Validation-1"
Solución
Asegúrate de que la variable establecida en el elemento <Source>
de la política SOAPMessageValidation con errores se defina y exista en el flujo en el que se ejecuta la política.
Si quieres corregir el ejemplo anterior, puedes modificar el elemento <Source
> para usar la variable response
, que existe en el flujo de respuesta:
<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
Código de error
steps.messagevalidation.NonMessageVariable
Cuerpo de la respuesta de error
{ "fault": { "faultstring": "Variable var_name does not resolve to a Message" "detail": { "errorcode": "steps.messagevalidation.NonMessageVariable" } } }
Cuerpo de la respuesta de error de ejemplo
{
"fault": {
"faultstring": "Variable message.content does not resolve to a Message",
"detail": {
"errorcode": "steps.messagevalidation.NonMessageVariable"
}
}
}
Causa
Este error ocurre si el elemento <Source>
en la política SOAPMessageValidation está configurado en una variable que no es del tipo mensaje.
Las variables del tipo de mensaje representan respuestas y solicitudes HTTP completas. Las variables de flujo integradas de Apigee Edge request
, response
y message
son del tipo Message. Para obtener más información acerca de las variables de mensaje, consulta la Referencia de lasvariables.
Diagnóstico
Identifica el nombre de la variable que no se resuelve en un tipo de mensaje de la string con error. Por ejemplo, en la siguiente string con error, el nombre de la variable es
message.content
:"faultstring": "Variable message.content does not resolve to a Message"
Examina todas las políticas de cuotas en el proxy de API específico en el que se produjo el error. Podría haber una o más políticas SOAPMessageValidation. Identifica la política o las políticas SOAPMessageValidation específicas en las que la variable especificada en el elemento
<Source>
coincide con el nombre de variable identificado en la string con error (paso 1 anterior).Por ejemplo, con la siguiente política, se establece el elemento
<Source>
en una variable llamadamessage.content
, que coincide con lo que hay en la string con de error:<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>
Debido a que la variable
message.content
no es del tipo Message, verá el siguiente error:"faultstring": "Variable message.content does not resolve to a Message"
Solución
Asegúrate de que el elemento <Source>
de la política de SOAPMessageValidation con error esté configurado como una variable de tipo mensaje que existe en el flujo en el que se ejecuta la política.
A fin de corregir la política, puedes modificar el elemento <Source>
para especificar una variable que sea de tipo de mensaje. Por ejemplo, en la política de SOAPMessageValidation con error, puedes especificar el elemento <Source>
como 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>
Error
Código de error
steps.messagevalidation.Failed
Cuerpo de la respuesta de error
{ "fault": { "faultstring": "Variable var_name failed with reason: \"reason [Line varline_num "detail": { "errorcode": "steps.messagevalidation.Failed" } } }
Cuerpo de la respuesta de error de ejemplo
{
"fault": {
"faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expecting a child element but found none [Line 9]\"",
"detail": {
"errorcode": "steps.messagevalidation.Failed"
}
}
}
Causa
Este error se produce si la política SOAPMessageValidation no valida la carga útil del mensaje de entrada en función del esquema XSD o la definición WSDL. También ocurrirá si hay JSON o XML de formato incorrecto en el mensaje de carga útil.
Estas son algunas de las posibles causas que pueden generar este error:
Causa | Descripción |
Carga útil de XML que no coincide | La carga útil XML de entrada no cumple con el esquema XSD especificado en la política SoapMessageValidation. |
Carga útil de SOAP que no coincide | La carga útil SOAP de entrada no cumple con la definición WSDL especificada en la política de SoapMessageValidation. |
JSON o XML con formato incorrecto | La carga útil SOAP de entrada no contiene XML o JSON con el formato correcto. |
Causa: la carga útil de XML no coincide
Este error se genera si la carga útil de XML de entrada no cumple con el esquema XSD especificado en el elemento <ResourceURL>
de la política SoapMessageValidation.
Ejemplo de mensaje de error
{
"fault": {
"faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expecting a child element but found none [Line 9]\"",
"detail": {
"errorcode": "steps.messagevalidation.Failed"
}
}
}
Diagnóstico
Identifica el nombre de la política SOAPMessageValidation, el motivo del error y el número de línea en el que la carga útil XML no coincide con el esquema XSD. Toda esta información está en la string con error. Por ejemplo, en la siguiente string de error, el nombre de la política SOAPMessageValidation es
SOAP-Message-Validation-1,
, el motivo del error esExpecting a child element but found none [Line 9]
y el número de línea es9
."faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expecting a child element but found none [Line 9]\""
Examina la política SOAPMessageValidation y confirma que usa un archivo de definición de esquema XSD para validar los mensajes. Por ejemplo, la siguiente política SOAPMessageValidation tiene un archivo de recursos XSD en el elemento
<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>
Examina la carga útil de entrada del número de línea identificado en el paso 1 para comprender la causa de la falla.
Carga útil de XML de entrada de muestra
<?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>
En el ejemplo anterior, la línea 9 tiene la etiqueta de finalización
</shipTo>
.Examina el archivo de definición de esquema XML,
Script-1.xsd
, que se usa en la política SOAPMessageValidation para ver cómo debe ser el elemento<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> ...
Según el XSD de muestra que se usa para la validación, el elemento
<shipTo>
debe tener los elementos secundarios<name>
,<street>
,<address>
y<country>
. Sin embargo, la carga útil de XML de entrada solo tiene un elemento secundario,<name>
. Como resultado, verás el siguiente error:"faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expecting a child element but found none [Line 9]\""
Solución
Hay dos maneras de resolver este error de validación:
Solución 1
Si determinas que la definición del esquema XSD impone limitaciones innecesarias y solo el elemento secundario <name>
es obligatorio en el elemento <shipTo>
, puedes modificar el objeto Script-1.xsd
que se usa en la política SOAPMessageValidation. Para validar el ejemplo de carga útil anterior, puedes modificar el archivo XSD de la siguiente manera:
...
<xsd:element name="shipTo" type="shipAddress"/>
...
<xsd:complexType name="shipAddress">
<xsd:sequence>
<xsd:element name="name" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
Solución
Si el archivo de definición XSD es correcto, la carga útil de XML de entrada se puede cambiar para que coincida con xsd
. Por ejemplo, puedes modificar la carga útil para que cumpla con 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>
Causa: error de la carga útil de SOAP
Este error ocurre si la carga útil del SOAP de entrada no cumple con la definición WSDL especificada en el elemento <ResourceURL>
de la política de SoapMessageValidation.
Ejemplo de mensaje de error
{
"fault": {
"faultstring": "SOAP-Message-Validation-1 failed with reason: \"Element name mismatch. Wildcard? [Line 11]\"",
"detail": {
"errorcode": "steps.messagevalidation.Failed"
}
}
}
Diagnóstico
Identifica el nombre de la política de SOAPMessageValidation, el motivo del error y el número de línea en el que la carga útil de SOAP no coincide con la definición WSDL. Puedes encontrar toda esta información en la string de errores. Por ejemplo, en la siguiente string con error, el nombre de la política SOAPMessageValidation es
SOAP-Message-Validation-1
, el motivo de la falla es\"Element name mismatch. Wildcard? [Line 11]\""
y el número de línea es11
:"faultstring": "SOAP-Message-Validation-1 failed with reason: \"Element name mismatch. Wildcard? [Line 11]\""
Examina la política SOAPMessageValidation y confirma que usa un esquema
wsdl
para validar mensajes. Por ejemplo, la siguiente política SOAPMessageValidation tiene un archivo de recursoswsdl
en el elemento<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>
Examina la carga útil de entrada del número de línea identificado en el paso 1 para comprender la causa de la falla.
Carga útil de SOAP de muestra
<?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>
En el ejemplo anterior, la línea 11 tiene el elemento secundario
<country>
debajo del elemento<shipTo>
.Examina el archivo de definición WSDL,
SOAP-Message-Validation-1.wsdl
, que se usa en la política SOAPMessageValidation para ver qué podría ser incorrecto con el elemento secundario<country>
en el elemento<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> ...
Según la definición WSDL que se usa para la validación, el elemento
<shipTo>
no tiene un elemento secundario<country>
. Como resultado, verás el siguiente error:"faultstring": "SOAP-Message-Validation-1 failed with reason: \"Element name mismatch. Wildcard? [Line 11]\""
Solución
Hay dos maneras de resolver este error de validación:
Solución 1
Si determinas que la definición WSDL es incorrecta, puedes cambiar el SOAP-Message-Validation-1.wsdl
que se usa en la política SOAPMessageValidation. Para validar el ejemplo de carga útil anterior, puedes modificar el archivo de la siguiente manera:
...
<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>
Solución
Si la definición de WSDL es correcta, la carga útil de SOAP de entrada puede cambiarse para que coincida con la definición WSDL.
Por ejemplo, puedes modificar la carga útil de SOAP de entrada de la siguiente manera:
<?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>
Causa: JSON o XML con formato incorrecto
Este error ocurre si la carga útil del SOAP de entrada no cumple con la definición WSDL especificada en el elemento <ResourceURL>
de la política de SoapMessageValidation.
Ejemplo de mensaje de error
{
"fault": {
"faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expected <\/title> at line 15(possibly around char 420)\"",
"detail": {
"errorcode": "steps.messagevalidation.Failed"
}
}
}
Diagnóstico
Identifica el nombre de la política de SOAPMessageValidation, el motivo del error y el número de línea de la carga útil de XML que no coincide con la definición WSDL. Puedes encontrar toda esta información en la string con error. Por ejemplo, en la siguiente string con error, el nombre de la política SOAPMessageValidation es
SOAP-Message-Validation-1
, el motivo de la falla esExpected </title> at line 15(possibly around char 420):
y el número de línea es15.
."faultstring": "SOAP-Message-Validation-1 failed with reason: \"Expected </title> at line 15(possibly around char 420)\""
Examina la carga útil de entrada del número de línea identificado en el paso 1 para comprender la causa de la falla.
Carga útil de SOAP de muestra
<?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>
En el ejemplo anterior, la línea 15 del XML de entrada tiene el elemento
<title>
, pero no se cierra con una etiqueta de cierre</title>
.
Solución
Para solucionar el error, asegúrate de que la carga útil de entrada sea válida y el formato sea correcto.
Por ejemplo, puedes modificar la carga útil de XML de entrada de la siguiente manera:
...
</shipTo>
<items>
<item>
<title>I love APIs</title>
<quantity>1</quantity>
<price>2.90</price>
</item>
</items>
...