Estás consultando la documentación de Apigee y Apigee Hybrid.
Consulta la documentación de
Apigee Edge.
RequestVariableNotMessageType
Código de error
steps.servicecallout.RequestVariableNotMessageType
Cuerpo de respuesta de error
{ "fault": { "faultstring": "ServiceCallout[POLICY_NAME]: request variable [VARIABLE_NAME] value is not of type Message", "detail": { "errorcode": "steps.servicecallout.RequestVariableNotMessageType" } } }
Causa
Este error se produce si una variable especificada en el elemento <Request>
de la política ServiceCallout no es del tipo message
. Si la variable es una cadena u otro tipo que no sea de mensaje, verás este error.
Las variables de tipo de mensaje representan solicitudes y respuestas HTTP completas. Las variables de flujo integradas request
, response
y message
son de tipo message
.
Diagnóstico
Identifica la política ServiceCallout en la que se ha producido el error y el nombre de la variable cuyo tipo es incorrecto. Puedes encontrar ambos elementos en el elemento
faultstring
de la respuesta de error. Por ejemplo, en el siguientefaultstring
, el nombre de la política esExecuteGeocodingRequest
y la variable esPostalCode
:"faultstring": "ServiceCallout[ExecuteGeocodingRequest]: request variable PostalCode value is not of type Message"
En el XML de la política ServiceCallout fallida, comprueba que el nombre de la variable definida en el elemento
<Request>
coincida con el nombre de la variable identificada en la cadena de error (paso 1 anterior). Por ejemplo, la siguiente política especifica una variable de solicitud llamadaPostalCode
, que coincide con lo que hay enfaultstring
:<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <ServiceCallout name="ExecuteGeocodingRequest"> <Request variable="PostalCode"/> <Response>GeocodingResponse</Response> <HTTPTargetConnection> <URL>http://maps.googleapis.com/maps/api/geocode/json</URL> </HTTPTargetConnection> </ServiceCallout>
Determina si esta variable es de tipo mensaje o no:
- Busca el código en el paquete del proxy de API donde se definió la variable por primera vez.
- En la mayoría de los casos, verás que la variable de problema se crea y se rellena en otra política que se ejecuta antes de la política ServiceCallout. Por ejemplo, la política Assign Message se suele usar para crear y rellenar variables en un flujo de proxy de API.
- Una vez que sepas en qué política se define y se rellena la variable por primera vez, debes determinar el tipo de esa variable de la siguiente manera:
- Compruebe el valor del atributo
type
(si está presente). - Si el atributo
type
no está presente, se considera que la variable es una cadena.
- Compruebe el valor del atributo
- Si el tipo de la variable no es un mensaje (por ejemplo, una cadena), esa es la causa del error. Puede consultar información sobre las variables comunes y sus tipos en la referencia de variables de flujo.
Por ejemplo, supongamos que la variable PostalCode
a la que se hace referencia en la política ServiceCallout se ha creado en la siguiente política AssignMessage. Ten en cuenta que a PostalCode
se le asigna el valor de la variable de flujo request.queryparam.postalcode
. Este valor es una cadena porque no hay ningún atributo type
en la asignación de variables.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<AssignMessage name="GenerateGeocodingRequest">
<AssignTo createNew="true" type="request">GeocodingRequest</AssignTo>
<Set>
<QueryParams>
<QueryParam name="address">{request.queryparam.postalcode}</QueryParam>
<QueryParam name="region">{request.queryparam.country}</QueryParam>
<QueryParam name="sensor">false</QueryParam>
</QueryParams>
<Verb>GET</Verb>
</Set>
<AssignVariable>
<Name>PostalCode</Name>
<Ref>request.queryparam.postalcode</Ref>
</AssignVariable>
<AssignVariable>
<Name>Country</Name>
<Ref>request.queryparam.country</Ref>
</AssignVariable>
</AssignMessage>
Ahora, recuerda que la variable PostalCode
se usa en el elemento <Request>
de la política ServiceCallout:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ServiceCallout name="ExecuteGeocodingRequest">
<Request variable="PostalCode"/>
<Response>GeocodingResponse</Response>
<HTTPTargetConnection>
<URL>http://maps.googleapis.com/maps/api/geocode/json</URL>
</HTTPTargetConnection>
</ServiceCallout>
Como PostalCode
no es de tipo mensaje (es una cadena en este ejemplo), recibes el código de error steps.servicecallout.RequestVariableNotMessageType
.
Resolución
Asegúrate de que la variable definida en el elemento <Request>
de la política ServiceCallout fallida sea una variable de flujo de tipo message
que exista. También puedes crear una variable de tipo mensaje directamente en la política ServiceCallout (como se explica en Política ServiceCallout) y usarla.
Para corregir la política, debe modificar el elemento <Request>
para especificar una variable nueva o ya creada que sea de tipo mensaje. Por ejemplo, la variable GeocodingRequest
que se ha definido en la política Assign Message es de tipo message y funcionaría perfectamente en la política ServiceCallout. Por ejemplo:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ServiceCallout name="ExecuteGeocodingRequest">
<Request variable="GeocodingRequest"/>
<Response>GeocodingResponse</Response>
<HTTPTargetConnection>
<URL>http://maps.googleapis.com/maps/api/geocode/json</URL>
</HTTPTargetConnection>
</ServiceCallout>
RequestVariableNotRequestMessageType
Código de error
steps.servicecallout.RequestVariableNotRequestMessageType
Cuerpo de respuesta de error
{ "fault": { "faultstring": "ServiceCallout[policy_name]: request variable [variable_name] value is not of type Request Message", "detail": { "errorcode": "steps.servicecallout.RequestVariableNotRequestMessageType" } } }
Causa
Este error se produce si una variable especificada en el elemento <Request>
de la política ServiceCallout no es del tipo message
. Si la variable es un tipo de mensaje de respuesta, una cadena o cualquier otro tipo, verás este error.
La variable de tipo message
representa solicitudes y respuestas HTTP completas. Las variables de flujo integradas request
, response
y message
son de tipo message
.
Diagnóstico
Identifica la política ServiceCallout en la que se ha producido el error y el nombre de la variable cuyo tipo es incorrecto. Puedes encontrar ambos elementos en el elemento
faultstring
de la respuesta de error. Por ejemplo, en el siguientefaultstring
, el nombre de la política esExecuteGeocodingRequest
y la variable esvar_response
:"faultstring": "ServiceCallout[ExecuteGeocodingRequest]: request variable var_response value is not of type Message"
En el XML de la política ServiceCallout fallida, comprueba que el nombre de la variable definida en el elemento
<Request>
coincida con el nombre de la variable identificada en la cadena de error (paso 1 anterior). Por ejemplo, la siguiente política especifica una variable de solicitud llamadavar_response
, que coincide con lo que hay enfaultstring
:<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <ServiceCallout name="ExecuteGeocodingRequest"> <Request variable="var_response"/> <Response>GeocodingResponse</Response> <HTTPTargetConnection> <URL>http://maps.googleapis.com/maps/api/geocode/json</URL> </HTTPTargetConnection> </ServiceCallout>
Determina si la variable es de tipo de mensaje de solicitud o no:
- Busca el código en el paquete del proxy de API donde se definió la variable por primera vez.
- En la mayoría de los casos, verás que la variable de problema se crea y se rellena en otra política que se ejecuta antes de la política ServiceCallout. Por ejemplo, la política Assign Message se suele usar para crear y rellenar variables en un flujo de proxy de API.
- Una vez que sepas en qué política se define y se rellena la variable por primera vez, debes determinar el tipo de esa variable de la siguiente manera:
- Compruebe el valor del atributo
type
(si está presente). - Si el atributo
type
no está presente, se considera que la variable es una cadena.
- Compruebe el valor del atributo
- Si el tipo de la variable no es request message, ese es el motivo del error. Puede consultar información sobre las variables comunes y sus tipos en la referencia de variables de flujo.
Por ejemplo, supongamos que la variable var_response
a la que se hace referencia en la política ServiceCallout se ha creado en la siguiente política AssignMessage. Ten en cuenta que a var_response
se le asigna el tipo response
. Por lo tanto, el tipo de la variable var_response
es el mensaje de respuesta.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<AssignMessage name="GenerateGeocodingRequest">
<AssignTo createNew="true" type="request">GeocodingRequest</AssignTo>
<AssignTo createNew="true" type="response">var_response</AssignTo>
<Set>
<QueryParams>
<QueryParam name="address">{request.queryparam.postalcode}</QueryParam>
<QueryParam name="region">{request.queryparam.country}</QueryParam>
<QueryParam name="sensor">false</QueryParam>
</QueryParams>
<Verb>GET</Verb>
</Set>
<AssignVariable>
<Name>PostalCode</Name>
<Ref>request.queryparam.postalcode</Ref>
</AssignVariable>
<AssignVariable>
<Name>Country</Name>
<Ref>request.queryparam.country</Ref>
</AssignVariable>
</AssignMessage>
Recuerda que la variable var_response
se usa en el elemento <Request>
de la política ServiceCallout.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ServiceCallout name="ExecuteGeocodingRequest">
<Request variable="var_response"/>
<Response>GeocodingResponse</Response>
<HTTPTargetConnection>
<URL>http://maps.googleapis.com/maps/api/geocode/json</URL>
</HTTPTargetConnection>
</ServiceCallout>
Como var_response
no es de tipo mensaje de solicitud (su tipo es mensaje de respuesta), recibes el código de error steps.servicecallout.RequestVariableNotRequestMessageType
.
Resolución
Asegúrate de que la variable definida en el elemento <Request>
de la política ServiceCallout fallida sea una variable de tipo message
que exista. También puedes crear una variable de tipo de mensaje de solicitud directamente en la política ServiceCallout (como se explica en Política ServiceCallout) y usarla.
Para corregir la política, debe modificar el elemento <Request>
para especificar una variable nueva o ya creada que sea de tipo mensaje de solicitud. De esta forma, funcionará en la política ServiceCallout. Por ejemplo:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ServiceCallout name="ExecuteGeocodingRequest">
<Request variable="GeocodingRequest"/>
<Response>GeocodingResponse</Response>
<HTTPTargetConnection>
<URL>http://maps.googleapis.com/maps/api/geocode/json</URL>
</HTTPTargetConnection>
</ServiceCallout>
ExecutionFailed
Código de error
steps.servicecallout.ExecutionFailed
Cuerpo de respuesta de error
{ "fault": { "faultstring": "Execution of ServiceCallout [policy_name] failed. Reason: Host not reachable", "detail": { "errorcode": "steps.servicecallout.ExecutionFailed" } } }
o
{ "fault": { "faultstring": "Execution of ServiceCallout [policy_name] failed. Reason: ResponseCode [http_code] is treated as error", "detail": { "errorcode": "steps.servicecallout.ExecutionFailed" } } }
Posibles motivos
Estas son las posibles causas de este error:
Causa | Descripción |
URL no válida o con formato incorrecto | La URL de destino de la política ServiceCallout tiene un formato incorrecto o un nombre de host no válido o inaccesible. |
Error del servidor backend | El servidor backend devuelve una respuesta de error 4XX o 5XX. |
Causa: URL no válida o con formato incorrecto
La URL de destino de la política ServiceCallout tiene un formato incorrecto o un nombre de host no válido o inaccesible.
Diagnóstico
Identifica la política ServiceCallout que ha provocado el error. El nombre de la política aparece en el elemento
faultstring
de la respuesta de error. Por ejemplo, en el siguientefaultstring
, el nombre de la política ServiceCallout fallida esExecuteGeocodingRequest
."faultstring": "ServiceCallout[ExecuteGeocodingRequest]"
En la política ServiceCallout fallida, examine el elemento
<URL>
. Si está mal formado o tiene un nombre de host no válido o al que no se puede acceder, ese es el motivo de este error. Por ejemplo, la siguiente política ServiceCallout especifica un<URL>
no válido:<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <ServiceCallout name="ExecuteGeocodingRequest"> <Request variable="GeocodingRequest"/> <Response>GeocodingResponse</Response> <HTTPTargetConnection> <URL>http://</URL> </HTTPTargetConnection> </ServiceCallout>
El elemento
<URL>
solo tiene el protocolohttp://
, pero no tiene un nombre de host válido. Por lo tanto, la política ServiceCallout falla y muestra el errorExecution of ServiceCallout ExecuteGeocodingRequest failed. Reason: Host not reachable
.
Resolución
Asegúrate de que el elemento <URL>
de la política ServiceCallout fallida tenga una URL válida con un nombre de host accesible.
Para corregir la política ServiceCallout que se muestra arriba, puede modificar el elemento <URL>
para especificar una URL válida:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ServiceCallout name="ExecuteGeocodingRequest">
<Request variable="GeocodingRequest"/>
<Response>GeocodingResponse</Response>
<HTTPTargetConnection>
<URL>http://maps.googleapis.com/maps/api/geocode/json</URL>
</HTTPTargetConnection>
</ServiceCallout>
Causa: error del servidor backend
El servidor backend devuelve una respuesta de error 4XX o 5XX.
Diagnóstico
Identifica la política ServiceCallout que ha provocado el error. El nombre de la política aparece en el elemento
faultstring
de la respuesta de error. Por ejemplo, en el siguientefaultstring
, el nombre de la política ServiceCallout fallida esExecuteGeocodingRequest
."faultstring": "ServiceCallout[ExecuteGeocodingRequest]
Examina el
faultstring
del cuerpo de la respuesta de error y comprueba si hay algún código de respuesta 4XX o 5XX en elReason
. Por ejemplo, el siguiente faultstring indica claramente que el servidor backend ha devuelto un código de respuesta 502:"faultstring": "Execution of ServiceCallout ExecuteGeocodingRequest failed. Reason: ResponseCode 502 is treated as error"
Resolución
Una vez que hayas determinado el código de respuesta de error, podrás solucionar el problema como lo harías con cualquier error 4XX o 5XX.