Solución de problemas de errores del tiempo de ejecución de ServiceCallout

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

  1. 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 siguiente faultstring, el nombre de la política es ExecuteGeocodingRequest y la variable es PostalCode:

    "faultstring": "ServiceCallout[ExecuteGeocodingRequest]: request variable PostalCode value is not of type Message"

  2. 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 llamada PostalCode, que coincide con lo que hay en faultstring:

    <?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>
    
  3. Determina si esta variable es de tipo mensaje o no:

    1. Busca el código en el paquete del proxy de API donde se definió la variable por primera vez.
    2. 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.
    3. 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.
    4. 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

  1. 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 siguiente faultstring, el nombre de la política es ExecuteGeocodingRequest y la variable es var_response:

    "faultstring": "ServiceCallout[ExecuteGeocodingRequest]: request variable var_response value is not of type Message"

  2. 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 llamada var_response, que coincide con lo que hay en faultstring:

    <?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>
    
  3. Determina si la variable es de tipo de mensaje de solicitud o no:

    1. Busca el código en el paquete del proxy de API donde se definió la variable por primera vez.
    2. 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.
    3. 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.
    4. 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

  1. 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 siguiente faultstring, el nombre de la política ServiceCallout fallida es ExecuteGeocodingRequest.

    "faultstring": "ServiceCallout[ExecuteGeocodingRequest]"

  2. 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 protocolo http://, pero no tiene un nombre de host válido. Por lo tanto, la política ServiceCallout falla y muestra el error Execution 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

  1. 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 siguiente faultstring, el nombre de la política ServiceCallout fallida es ExecuteGeocodingRequest.

    "faultstring": "ServiceCallout[ExecuteGeocodingRequest]

  2. Examina el faultstring del cuerpo de la respuesta de error y comprueba si hay algún código de respuesta 4XX o 5XX en el Reason. 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.