Solución de problemas de errores de tiempo de ejecución de Assign Message

Estás consultando la documentación de Apigee y Apigee Hybrid.
Consulta la documentación de Apigee Edge.

UnresolvedVariable

Código de error

steps.assignmessage.UnresolvedVariable

Cuerpo de respuesta de error

{
    "fault": {
        "faultstring": "AssignMessage[policy_name]: unable to resolve variable [variable_name]",
        "detail": {
            "errorcode": "steps.assignmessage.UnresolvedVariable"
        }
    }
}

Causa

Este error se produce si una variable especificada en la política Asignar mensaje es:

  • Fuera del ámbito (no disponible en el flujo específico en el que se está ejecutando la política) o
  • no se puede resolver (no está definido)

Por ejemplo, este error se produce si la política Asignar mensaje se ejecuta en el flujo de la solicitud, pero el atributo source del elemento <Copy> se asigna a la variable response o error, o a cualquier otra variable personalizada que no exista en el flujo de la solicitud.

Diagnóstico

  1. Identifica la política de asignación de mensajes en la que se ha producido el error y el nombre de la variable que no está disponible. 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 googleBook y la variable es var:

    "faultstring": "AssignMessage[googleBook]: unable to resolve variable var"
    
  2. En el XML de la política de asignación de mensajes fallida, comprueba que el nombre de la variable utilizada coincide con el nombre de la variable identificada en la cadena de error (paso 1 anterior). Por ejemplo, la siguiente política asigna al atributo de origen del elemento <Copy> una variable llamada var, que coincide con lo que hay en faultstring:

    <AssignMessage async="false" continueOnError="false" enabled="true" name="Assign-Message-1">
       <DisplayName>googleBook</DisplayName>
       <Properties />
       <Copy source="var">
          <Headers>
             <Header name="user-agent" />
          </Headers>
       </Copy>
       <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
       <AssignTo createNew="true" transport="http" type="request">googleBookReq</AssignTo>
    </AssignMessage>
    
  3. Determina si la variable está definida y disponible en el flujo en el que se está ejecutando la política Assign Message.

  4. Si la variable es:

    1. Fuera del ámbito (no disponible en el flujo específico en el que se está ejecutando la política) o
    2. no se puede resolver (no está definido)

    entonces, esa es la causa del error.

    Por ejemplo, supongamos que la política Assign Message mostrada arriba se ejecuta en el flujo de la solicitud. Comprueba si la variable var está definida en alguna de las políticas que se ejecutan antes de la política Assign Message en el flujo de la solicitud. Si la variable no se ha definido, recibirás el código de error:

    steps.assignmessage.UnresolvedVariable
    

Resolución

Asegúrate de que la variable a la que se hace referencia en la política exista y esté disponible en el flujo específico en el que se ejecuta la política Asignar mensaje.

Para corregir la política de ejemplo que se muestra arriba, puede modificar el atributo de origen del elemento <Copy> para que sea la variable de solicitud o cualquier otra variable personalizada de tipo mensaje que exista en el flujo de solicitud.

<AssignMessage async="false" continueOnError="false" enabled="true" name="Assign-Message-1">
   <DisplayName>googleBook</DisplayName>
   <Properties />
   <Copy source="request">
      <Headers>
         <Header name="user-agent" />
      </Headers>
   </Copy>
   <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
   <AssignTo createNew="true" transport="http" type="request">googleBookReq</AssignTo>
</AssignMessage>

VariableOfNonMsgType

Código de error

steps.assignmessage.VariableOfNonMsgType

Cuerpo de respuesta de error

{
    "fault": {
        "faultstring": "AssignMessage[policy_name]: value of variable [variable] is not of type Message",
        "detail": {
            "errorcode": "steps.assignmessage.VariableOfNonMsgType"
        }
    }
}

Causa

Este error se produce si el atributo source del elemento <Copy> se asigna a una variable que no es del tipo message.

Las variables de tipo de mensaje representan solicitudes y respuestas HTTP completas. Las variables de flujo integradas request, response y message son de tipo mensaje. Para obtener más información sobre las variables de mensaje, consulta la referencia de variables.

Diagnóstico

  1. Identifica la política de asignación de mensajes 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 GenerateGeocodingRequest y la variable es PostalCode:

    "faultstring": "AssignMessage[GenerateGeocodingRequest]: value of variable PostalCode is not of type Message"
    
  2. En el XML de la política de asignación de mensajes que ha fallado, comprueba que el nombre de la variable definida en el elemento <Copy> coincida con el nombre de la variable identificada en la cadena de error (paso 1 anterior). Por ejemplo, la siguiente política asigna a un atributo de origen una variable llamada PostalCode, que coincide con lo que hay en faultstring:

    <AssignMessage name="GenerateGeocodingRequest">
       <AssignTo createNew="true" type="request">GeocodingRequest</AssignTo>
       <AssignVariable>
          <Name>PostalCode</Name>
          <Ref>request.queryparam.postalcode</Ref>
       </AssignVariable>
       <AssignVariable>
          <Name>Country</Name>
          <Ref>request.queryparam.country</Ref>
       </AssignVariable>
       <Copy source="PostalCode">
          <QueryParams>
             <QueryParam name="q" />
          </QueryParams>
       </Copy>
    </AssignMessage>
    
  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. 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:
      1. Compruebe el valor del atributo type (si está presente).
      2. Si no se incluye el atributo type, se considera que la variable es una cadena.
    3. 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.

    Por ejemplo, fíjate en la variable PostalCode del XML anterior. Se le asigna el valor de la variable de flujo request.queryparam.postalcode en el elemento <AssignVariable>. Este valor es una cadena, ya que no hay ningún atributo de tipo en la asignación de variables.

    Ahora, recuerda que la variable PostalCode se usa en el elemento <Copy> de la política Assign Message:

    <Copy source="PostalCode">
       <QueryParams>
          <QueryParam name="PostalCode" />
       </QueryParams>
    </Copy>
    

    Como PostalCode no es de tipo message (en este ejemplo, es una cadena), recibes el código de error:

    steps.assignmessage.VariableOfNonMsgType
    

Resolución

Asegúrate de que el atributo source del elemento <Copy> de la política Assign Message fallida se haya definido en una variable de flujo de tipo message que exista.

Para corregir la política, puede modificar el atributo source del elemento <Copy> para especificar una variable de tipo mensaje. Por ejemplo, si la política Assign Message se debe ejecutar en el flujo de solicitudes, puede usar la variable de tipo de mensaje request o cualquier otra variable personalizada de tipo message.

<AssignMessage name="GenerateGeocodingRequest">
   <AssignTo createNew="true" type="request">GeocodingRequest</AssignTo>
   <AssignVariable>
      <Name>PostalCode</Name>
      <Ref>request.queryparam.postalcode</Ref>
   </AssignVariable>
   <AssignVariable>
      <Name>Country</Name>
      <Ref>request.queryparam.country</Ref>
   </AssignVariable>
   <Copy source="request">
      <QueryParams>
         <QueryParam name="PostalCode" />
      </QueryParams>
   </Copy>
</AssignMessage>