Solución de errores del entorno de ejecución del texto destacado del servicio

Estás viendo 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 la respuesta del 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 de ServiceCallout no es del tipo message. Si la variable es una string o cualquier otro tipo que no sea de mensaje, verás este error.

Las variables del tipo de mensaje representan respuestas y solicitudes HTTP completas. Las variables de flujo integradas request, response y message son de tipo de message.

Diagnóstico

  1. Identifica la política de texto destacado del servicio en la que se produjo 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 valor 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 archivo XML de la política de texto destacado del servicio con error, verifica que el nombre de la variable configurada en el elemento <Request> coincida con el nombre de la variable identificado en la string con error (el paso 1 anterior). Por ejemplo, en la siguiente política, se especifica una variable de solicitud llamada PostalCode, que coincide con el contenido de 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 de mensaje o no:

    1. Localiza el código dentro del paquete del proxy de API, en el que la variable se definió primero.
    2. En la mayoría de los casos, verás que la variable problemática se crea y se propaga en otra política que se ejecuta antes que la política de texto destacado del servicio. Por ejemplo, la política de asignación de mensajes se usa por lo general para crear y propagar variables en un flujo de proxy de API.
    3. Una vez que determines la política en la que se define y propaga la variable primero, debes determinar el tipo de esa variable de la siguiente manera:
      • Comprueba el valor del atributo type (si está presente).
      • Si el atributo type no está presente, se considera que la variable es una string.
    4. Si el tipo de la variable no es de mensaje (como una string), esta es la causa del error. Puedes obtener información sobre las variables comunes y sus tipos en la referencia de variables.

A modo de ejemplo, supongamos que la variable PostalCode a la que se hace referencia en la política de texto destacado del servicio se creó en la siguiente política de asignación de mensajes. Ten en cuenta que PostalCode tiene asignado el valor de la variable de flujo request.queryparam.postalcode. Este valor es una string, porque no hay un atributo type presente en la asignación de la variable.

<?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 de texto destacado del servicio:

<?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>

Debido a que PostalCode no es de tipo de mensaje (en este ejemplo, es una string), recibes el código de error: steps.servicecallout.RequestVariableNotMessageType.

Solución

Asegúrate de que la variable establecida en el elemento <Request> de la política con errores de ServiceCallout sea una variable de flujo de tipo message que exista o, de manera alternativa, puedes crear una nueva variable de tipo de mensaje directamente en la política de ServiceCallout (como se explica en la Política de ServiceCallout) y úsala.

Si deseas corregir la política, debes modificar el elemento <Request> para especificar una variable nueva o existente que sea de tipo de mensaje. Por ejemplo, la variable GeocodingRequest que se configuró en la política de asignación de mensajes es de tipo de mensaje, y funcionará bien en la política de texto destacado del servicio. 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 la respuesta del 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 de ServiceCallout no es del tipo message. Si la variable es una string o es de tipo de mensaje de respuestao de cualquier otro tipo, verás este error.

La variable de tipo message representa respuestas y solicitudes HTTP completas. Las variables de flujo integradas request, response y message son de tipo message.

Diagnóstico

  1. Identifica la política de texto destacado del servicio en la que se produjo 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 valor 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 archivo XML de la política de texto destacado del servicio con error, verifica que el nombre de la variable configurada en el elemento <Request> coincida con el nombre de la variable identificado en la string con error (el paso 1 anterior). Por ejemplo, en la siguiente política, se especifica una variable de solicitud llamada var_response, que coincide con el contenido de 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. Localiza el código dentro del paquete del proxy de API, en el que la variable se definió primero.
    2. En la mayoría de los casos, verás que la variable problemática se crea y se propaga en otra política que se ejecuta antes que la política de texto destacado del servicio. Por ejemplo, la política de asignación de mensajes se usa por lo general para crear y propagar variables en un flujo de proxy de API.
    3. Una vez que determines la política en la que se define y propaga la variable primero, debes determinar el tipo de esa variable de la siguiente manera:
      • Comprueba el valor del atributo type (si está presente).
      • Si el atributo type no está presente, se considera que la variable es una string.
    4. Si el tipo de la variable no es de mensaje de solicitud, esta es la causa del error. Puedes obtener información sobre las variables comunes y sus tipos en la referencia de variables.

A modo de ejemplo, supongamos que la variable var_response a la que se hace referencia en la política de texto destacado del servicio se creó en la siguiente política de asignación de mensajes. Ten en cuenta que var_response recibe el tipo response. Por lo tanto, el tipo de la variable var_response es de 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 de texto destacado del servicio.

<?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>

Debido a que var_response no es de tipo de mensaje de solicitud (su tipo es de mensaje de respuesta), recibes el código de error: steps.servicecallout.RequestVariableNotRequestMessageType.

Solución

Asegúrate de que la variable establecida en el elemento <Request> de la política con errores de ServiceCallout sea una variable de tipo message que exista o, de manera alternativa, puedes crear una nueva variable de tipo de mensaje de solicitud directamente en la política de ServiceCallout (como se explica en la política de ServiceCallout ) y úsala.

Si deseas corregir la política, debes modificar el elemento <Request> para especificar una variable existente o nueva que sea del tipo de mensaje de solicitud. Esta funcionará en la política de texto destacado del servicio. 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 la 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"
        }
    }
}

Causas posibles

Las siguientes son las posibles causas de este error:

Causa Descripción
La URL no es válida o tiene errores de formato La URL de destino en la política de texto destacado del servicio tiene errores de formato o un nombre de host que es no es válido o es inaccesible.
Error del servidor de backend El servidor de backend muestra una respuesta de error de 4XX o 5XX.

Causa: La URL no es válida o tiene errores de formato

La URL de destino en la política de texto destacado del servicio tiene errores de formato o un nombre de host que es no es válido o es inaccesible.

Diagnóstico

  1. Identifica la política de texto destacado del servicio que causó el error. El nombre de la política aparece en el elemento faultstring de la respuesta de error. Por ejemplo, en el siguiente campo faultstring, el nombre de la política de texto destacado del servicio con errores es ExecuteGeocodingRequest.

    "faultstring": "ServiceCallout[ExecuteGeocodingRequest]"

  2. En la política de texto destacado del servicio con error, examina el elemento <URL>. Si tiene errores de formato o un nombre de host que no es válido o es inaccesible, esta es la causa del error. Por ejemplo, la siguiente política de texto destacado del servicio especifica una <URL> que no es válida:

    <?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 de texto destacado del servicio falla con este error: Execution of ServiceCallout ExecuteGeocodingRequest failed. Reason: Host not reachable.

Solución

Asegúrate de que el elemento <URL> de la política de texto destacado del servicio con errorestenga una URL válida con un nombre de host accesible.

Si deseas corregir la política de texto destacado del servicio que se muestra arriba, puedes 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 de backend

El servidor de backend muestra una respuesta de error de 4XX o 5XX.

Diagnóstico

  1. Identifica la política de texto destacado del servicio que causó el error. El nombre de la política aparece en el elemento faultstring de la respuesta de error. Por ejemplo, en el siguiente campo faultstring, el nombre de la política de texto destacado del servicio con errores es ExecuteGeocodingRequest.

    "faultstring": "ServiceCallout[ExecuteGeocodingRequest]

  2. Examina faultstring en el cuerpo de la respuesta de error y verifica si se enumera algún código de respuesta de 4XX o 5XX en Reason. Por ejemplo, la siguiente string con errores indica con claridad que un servidor de backend mostró un código de respuesta 502:

    "faultstring": "Execution of ServiceCallout ExecuteGeocodingRequest failed. Reason: ResponseCode 502 is treated as error"

Solución

Una vez que determines el código de respuesta de error, puedes solucionar este problema del mismo modo que lo harías con cualquier error 4XX o 5XX.