Política AssignMessage

Esta página se aplica a Apigee y Apigee Hybrid.

Consulta la documentación de Apigee Edge.

ícono de política

Qué

La política AssignMessage puede cambiar un mensaje de solicitud o respuesta existente, o crear un mensaje de solicitud o respuesta nuevo durante el flujo del proxy de API. La política te permite realizar las siguientes acciones en esos mensajes:

  • Agregar nuevos parámetros de formulario, encabezados o parámetros de búsqueda a un mensaje
  • Copiar las propiedades existentes de un mensaje a otro
  • Quita encabezados, parámetros de búsquedas, parámetros de formulario o cargas útiles de mensaje desde un mensaje
  • Establecer el valor de las propiedades existentes en un mensaje

AssignMessage también le permite establecer variables de contexto arbitrarias, independientemente de cualquiera de las operaciones anteriores que se podrían aplicar a un mensaje.

Con AssignMessage, puedes agregar, cambiar o quitar propiedades de la solicitud o la respuesta. De forma alternativa, puedes usar AssignMessage para crear una solicitud personalizada o un mensaje de respuesta y pasarlo a un destino alternativo, como se describe en Crea mensajes de solicitud personalizados.

Esta política es una política extensible, y el uso de esta política puede tener implicaciones de costo o uso, según tu licencia de Apigee. Para obtener información sobre los tipos de políticas y sus implicaciones de uso, consulta Tipos de políticas.

La política AssignMessage puede crear o cambiar variables de flujo con los siguientes elementos secundarios:

El orden en el que organizas los elementos de las instancias <Add>, <Copy>, <Set> y <Remove> es importante. La política ejecuta esas acciones en el orden en que aparecen en la configuración de la política. Si necesitas quitar todos los encabezados y, luego, establecer un encabezado específico, debes incluir el elemento <Remove> antes del elemento <Set>.

Elemento <AssignMessage>

Define una política de AssignMessage.

Valor predeterminado Consulta la pestaña Política predeterminada, a continuación
¿Es obligatorio? Obligatorio
Tipo Objeto complejo
Elemento principal N/A
Elementos secundarios <Add>
<AssignTo>
<AssignVariable>
<Copy>
<DisplayName>
<IgnoreUnresolvedVariables>
<Remove>
<Set>

El elemento <AssignMessage> usa la siguiente sintaxis:

Sintaxis

El elemento <AssignMessage> usa la siguiente sintaxis:

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <!-- All AssignMessage child elements are optional -->
  <Add>
    <FormParams>
      <FormParam name="FORMPARAM_NAME">FORMPARAM_VALUE</FormParam>
      ...
    </FormParams>
    <Headers>
      <Header name="HEADER_NAME">HEADER_VALUE</Header>
      ...
    </Headers>
    <QueryParams>
      <QueryParam name="QUERYPARAM_NAME">QUERYPARAM_VALUE</QueryParam>
      ...
    </QueryParams>
  </Add>

  <AssignTo createNew="[true|false]" transport="http"
    type="[request|response]">DESTINATION_VARIABLE_NAME</AssignTo>

  <AssignVariable>
    <Name>VARIABLE_NAME</Name>
    <PropertySetRef>SOURCE_VARIABLE</PropertySetRef>
    <Ref>SOURCE_VARIABLE</Ref>
    <ResourceURL>RESOURCE_URL_OR_TEMPLATE</ResourceURL>
    <Template>MESSAGE_TEMPLATE</Template>
    or
    <Template ref='TEMPLATE_VARIABLE'></Template>
    <Value>VARIABLE_VALUE</Value>
  </AssignVariable>

  <Copy source="VARIABLE_NAME">
    <!-- Can also be an empty array (<FormParams/>) -->
    <FormParams>
      <FormParam name="FORMPARAM_NAME">FORMPARAM_VALUE</FormParam>
      ...
    </FormParams>
    <!-- Copy all headers -->
    <Headers/>
    <!-- or, copy specific headers by name -->
    <Headers>
      <Header name="HEADER_NAME"/>
      <!-- or -->
      <Header name="HEADER_NAME">[false|true]</Header>
      ...
    </Headers>
    <Path>[false|true]</Path>
    <Payload>[false|true]</Payload>
    <!-- Can also be an empty array (<QueryParams/>) -->
    <QueryParams>
      <QueryParam name="QUERYPARAM_NAME">QUERYPARAM_VALUE</QueryParam>
      ...
    </QueryParams>
    <StatusCode>[false|true]</StatusCode>
    <Verb>[false|true]</Verb>
    <Version>[false|true]</Version>
  </Copy>

  <DisplayName>POLICY_DISPLAY_NAME</DisplayName>

  <IgnoreUnresolvedVariables>[true|false]</IgnoreUnresolvedVariables>

  <!-- Can also be empty to remove everything from the message (<Remove/>) -->
  <Remove>
    <!-- Remove all form parameters -->
    <FormParams/>
    <!-- or, remove specific form parameters by name -->
    <FormParams>
      <FormParam name="FORMPARAM_NAME"/>
      <!-- or -->
      <FormParam name="FORMPARAM_NAME">[false|true]</FormParam>
      ...
    </FormParams>
    <!-- Remove all headers -->
    <Headers/>
    <!-- or, remove specific headers by name -->
    <Headers>
      <Header name="HEADER_NAME"/>
      <!-- or -->
      <Header name="HEADER_NAME">[false|true]</Header>
      ...
    </Headers>
    <Payload>[false|true]</Payload>
    <!-- Remove all query parameters -->
    <QueryParams/>
    <!-- or, remove specific query parameters by name -->
    <QueryParams>
      <QueryParam name="QUERYPARAM_NAME"/>
      <!-- or -->
      <QueryParam name="QUERYPARAM_NAME">[false|true]</QueryParam>
      ...
    </QueryParams>
  </Remove>

  <Set>
    <FormParams>
      <FormParam name="FORMPARAM_NAME">FORMPARAM_VALUE</FormParam>
      ...
    </FormParams>
    <Headers>
      <Header name="HEADER_NAME">HEADER_VALUE</Header>
      ...
    </Headers>
    <Path>PATH</Path>
    <Payload contentType="CONTENT_TYPE" variablePrefix="PREFIX"
        variableSuffix="SUFFIX">NEW_PAYLOAD</Payload>
    <QueryParams>
      <QueryParam name="QUERYPARAM_NAME">QUERYPARAM_VALUE</QueryParam>
      ...
    </QueryParams>
    <StatusCode>HTTP_STATUS_CODE or {variable}</StatusCode>
    <Verb>[GET|POST|PUT|PATCH|DELETE|{variable}]</Verb>
    <Version>[1.0|1.1|{variable}]</Verb>
  </Set>

</AssignMessage>

Política predeterminada

En el siguiente ejemplo, se muestra la configuración predeterminada cuando agregas una política AssignMessage a tu flujo en la IU de Apigee:

<AssignMessage continueOnError="false" enabled="true" name="assign-message-default">
  <DisplayName>Assign Message-1</DisplayName>
  <Properties/>
  <Copy source="request">
    <Headers/>
    <QueryParams/>
    <FormParams/>
    <Payload/>
    <Verb/>
    <StatusCode/>
    <Path/>
  </Copy>
  <Remove>
    <Headers>
      <Header name="h1"/>
    </Headers>
    <QueryParams>
      <QueryParam name="q1"/>
    </QueryParams>
    <FormParams>
      <FormParam name="f1"/>
    </FormParams>
    <Payload/>
  </Remove>
  <Add>
    <Headers/>
    <QueryParams/>
    <FormParams/>
  </Add>
  <Set>
    <Headers/>
    <QueryParams/>
    <FormParams/>
    <!-- <Verb>GET</Verb> -->
    <Path/>
  </Set>
  <AssignVariable>
    <Name>name</Name>
    <Value/>
    <Ref/>
  </AssignVariable>
  <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
  <AssignTo createNew="false" transport="http" type="request"/>
</AssignMessage>

Cuando insertas una nueva política AssignMessage en la IU de Apigee, la plantilla contiene stubs para todas las operaciones posibles. Por lo general, debes seleccionar qué operaciones quieres realizar con esta política y quitas el resto de los elementos secundarios. Por ejemplo, si deseas realizar una operación de copia, usa el elemento <Copy> y quita <Add>, <Remove> y otros elementos secundarios de la política para que sea más legible.

Este elemento tiene los siguientes atributos que son comunes a todas las políticas:

Atributo Predeterminada (obligatorio) Descripción
name N/A Obligatorio

El nombre interno de la política. El valor del atributo name puede contener letras, números, espacios, guiones, guiones bajos y puntos. Este valor no puede superar los 255 caracteres.

De forma opcional, usa el elemento <DisplayName> para etiquetar la política en el editor de proxy de la IU de administración con un nombre de lenguaje natural diferente.

continueOnError falso Opcional Configúralo como false para mostrar un error cuando una política falla. Este es el comportamiento previsto para la mayoría de las políticas. Configúralo como true para continuar con la ejecución del flujo incluso después de que una política falle. También consulta:
enabled true Opcional Configúralo como true para aplicar la política. Configúralo como false para desactivar la política. La política no se aplicará, incluso si permanece conectada a un flujo.
async   falso Obsoleta Este atributo dejó de estar disponible.

En la siguiente tabla, se proporciona una descripción de alto nivel de los elementos secundarios de <AssignMessage>.

Elemento secundario ¿Es obligatorio? Descripción
Operaciones comunes
<Add> Opcional Agrega información al el objeto de mensaje que especifica el elemento <AssignTo>.

<Add> agrega encabezados o parámetros al mensaje que no existe en el mensaje original. Ten en cuenta que <Set> también proporciona esta funcionalidad.

Para reemplazar encabezados o parámetros existentes, usa el elemento <Set>.

<Copy> Opcional Copia información del mensaje especificado por el atributo source al objeto de mensaje especificado por el elemento <AssignTo>.
<Remove> Opcional Borra los elementos especificados de la variable de mensaje especificada en el elemento <AssignTo>.
<Set> Opcional Reemplaza los valores de las propiedades existentes en la solicitud o respuesta, que se especifica con el elemento <AssignTo>.

<Set> reemplaza los encabezados o parámetros que ya existen en el mensaje original o agrega nuevos si no lo hacen.

Otros elementos secundarios
<AssignTo> Opcional Especifica en qué mensaje opera la política AssignMessage. Puede ser la solicitud o la respuesta estándar, o puede ser un mensaje personalizado nuevo.
<AssignVariable> Opcional Asigna un valor a una variable de flujo. Si la variable no existe, <AssignVariable> la crea.
<IgnoreUnresolvedVariables> Opcional Determina si el procesamiento se detiene cuando se encuentra una variable sin resolver.

Cada uno de estos elementos secundarios se describe en las siguientes secciones.

Ejemplos

En los siguientes ejemplos, se muestran algunas de las formas en las que puedes usar la política de AssignMessage:

1: Agrega encabezados

En el siguiente ejemplo, se agrega un encabezado a la solicitud con el elemento <Add>:

<AssignMessage name="AM-add-headers-1">
  <Add>
    <Headers>
      <Header name="partner-id">{verifyapikey.VAK-1.developer.app.partner-id}</Header>
    </Headers>
  </Add>
  <AssignTo>request</AssignTo>
</AssignMessage>

2: Quita la carga útil

En el siguiente ejemplo, se borra la carga útil de la respuesta con el elemento <Remove>:

<AssignMessage name="AM-remove-1">
  <DisplayName>remove-1</DisplayName>
  <Remove>
    <Payload>true</Payload>
  </Remove>
  <AssignTo>response</AssignTo>
</AssignMessage>

3: Modifica la respuesta

En el siguiente ejemplo, se modifica un objeto de respuesta existente cuando se le agrega un encabezado:

<AssignMessage name="AM-modify-response">
  <Set>
    <Headers>
      <Header name="Cache-Hit">{lookupcache.LookupCache-1.cachehit}</Header>
    </Headers>
  </Set>
  <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
  <AssignTo>response</AssignTo>
</AssignMessage>

En este ejemplo, no se crea un mensaje nuevo. En su lugar, puedes modificar un mensaje de respuesta existente si agregas un encabezado HTTP.

Debido a que este ejemplo especifica response como el nombre de la variable en el elemento <AssignTo>, esta política modifica el objeto de respuesta que se configuró en un principio con los datos que muestra el servidor de destino.

El encabezado HTTP que se agrega al mensaje de respuesta que proporciona esta política se deriva de una variable propagada por la política LookupCache. Por lo tanto, el mensaje de respuesta modificado por esta política de mensaje asignado contiene un encabezado HTTP que indica si los resultados se extrajeron de la caché o no. Configurar encabezados en la respuesta puede ser útil para la depuración y la solución de problemas.

4: Configura el contenido dinámico

Puedes usar AssignMessage para incorporar contenido dinámico en la carga útil de los mensajes de respuesta y solicitud.

Para incorporar variables de flujo en una carga útil XML, encierra la variable designada entre llaves, como en este ejemplo: {prefix.name}.

En el siguiente ejemplo, se incorpora el valor de la variable de flujo del encabezado HTTP user-agent en un elemento XML llamado User-agent:

<AssignMessage name="AM-set-dynamic-content">
  <AssignTo>response</AssignTo>
  <Set>
    <Payload contentType="text/xml">
      <User-agent>{request.header.user-agent}</User-agent>
    </Payload>
  </Set>
  <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
</AssignMessage>

Para las cargas útiles JSON, puedes insertar variables mediante los atributos variablePrefix y variableSuffix con caracteres delimitadores, como se muestra en el siguiente ejemplo:

<AssignMessage name="set-payload">
  <Payload contentType="application/json" variablePrefix="@" variableSuffix="#">
  {
     "user-agent": "@request.header.user-agent#"
  }
  </Payload>
</AssignMessage>

Para obtener una lista completa de las variables de flujo, consulta Referencia de las variables de flujo.

También puedes usar llaves para insertar variables.

5: Quita parámetros de búsqueda

En el siguiente ejemplo, se quita el parámetro de búsqueda apikey de la solicitud:

<AssignMessage name="AM-remove-query-param">
  <Remove>
    <QueryParams>
      <QueryParam name="apikey"/>
    </QueryParams>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

Se recomienda quitar el parámetro de búsqueda apikey del mensaje de la solicitud cuando uses la política VerifyAPIKey para la autenticación de usuarios. Debes hacer esto para impedir que la información de clave sensible se pase al destino del backend.

6: Obtén o configura variables

En el siguiente ejemplo, se usan tres políticas AssignMessage:

  1. Crea tres variables de flujo en la solicitud, con valores estáticos.
  2. Obtiene las variables de flujo de forma dinámica en una segunda política en el flujo de solicitudes.
  3. Los establece en la carga útil de la respuesta.
<!-- Policy #1: Set variables in the request -->
<AssignMessage name="AM-set-variables">
    <!-- Create a variable named myAppSecret -->
    <AssignVariable>
        <Name>myAppSecret</Name>
        <Value>42</Value>
    </AssignVariable>
    <!-- Create a variable named config.environment -->
    <AssignVariable>
        <Name>config.environment</Name>
        <Value>test</Value>
    </AssignVariable>
    <!-- Create a variable named config.protocol -->
    <AssignVariable>
        <Name>config.protocol</Name>
        <Value>gopher</Value>
    </AssignVariable>
</AssignMessage>

En la primera política, el elemento <AssignVariable> crea y establece tres variables en la solicitud. Cada elemento <Name> especifica un nombre de variable, y <Value> especifica el valor.

La segunda política usa el elemento <AssignVariable> para leer los valores y crea tres variables nuevas:

<!-- Policy #2: Get variables from the request -->
<AssignMessage continueOnError="false" enabled="true" name="get-variables">
  <AssignTo createNew="false" transport="http" type="request"/>
  <!-- Get the value of myAppSecret and create a new variable, secret -->
  <AssignVariable>
    <Name>secret</Name>
    <Ref>myAppSecret</Ref>
    <Value>0</Value>
  </AssignVariable>
  <!-- Get the value of config.environment and create a new variable, environment -->
  <AssignVariable>
    <Name>environment</Name>
    <Ref>config.environment</Ref>
    <Value>default</Value>
  </AssignVariable>
  <!-- Get the value of config.protocol and create a new variable, protocol -->
  <AssignVariable>
    <Name>protocol</Name>
    <Ref>config.protocol</Ref>
    <Value>default</Value>
  </AssignVariable>
  <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
</AssignMessage>

En la segunda política, el elemento <Ref> hace referencia a la variable de origen y los elementos <Name> especifican los nombres de las variables nuevas. Si la variable a la que hace referencia el elemento <Ref> no es accesible, puedes usar el valor especificado por el elemento <Value>.

Para probar este conjunto de políticas, haga lo siguiente:

  1. Agrega las políticas número 1 y 2 al flujo de solicitud. Asegúrate de poner la política número 1 antes de la política número 2.
  2. Agrega la tercera política en el flujo de respuesta.
  3. La tercera política usa el elemento <Set> para agregar las variables a la respuesta. En el siguiente ejemplo, se construye una carga útil XML en la respuesta que el perímetro muestra al cliente:
    <!-- Policy #3: Add variables to the response -->
    <AssignMessage continueOnError="false" enabled="true" name="put-em-in-the-payload">
      <DisplayName>put-em-in-the-payload</DisplayName>
      <Set>
        <Payload contentType="application/xml">
          <wrapper>
            <secret>{secret}</secret>
            <config>
              <environment>{environment}</environment>
              <protocol>{protocol}</protocol>
            </config>
          </wrapper>
        </Payload>
      </Set>
      <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
      <AssignTo createNew="false" transport="http" type="response"/>
    </AssignMessage>
    

    Ten en cuenta que la sintaxis para acceder a las variables de flujo en <Set> es colocarlas entre llaves.

    Asegúrate de configurar el atributo contentType del elemento <Payload> en application/xml.

  4. Envía una solicitud a tu proxy de API. Por ejemplo:
    curl -vL https://ahamilton-eval-test.apigee.net/myproxy

    De forma opcional, puedes canalizar los resultados a través de una utilidad como xmllint, de modo que el XML se muestre en una estructura con formato adecuado:

    curl -vL https://ahamilton-eval-test.apigee.net/myproxy | xmllint --format -

    El cuerpo de la respuesta debe verse de la siguiente manera:

    <wrapper>
      <secret>42</secret>
      <config>
        <environment>test</environment>
        <protocol>gopher</protocol>
      </config>
    </wrapper>

7: Obtén encabezados de respuesta de texto destacado de servicios

En el siguiente ejemplo, supongamos que una política ServiceCallout está en la solicitud del proxy de API y la respuesta de texto destacado contiene varios encabezados con el mismo nombre (Set-Cookie). En el caso de que la variable de respuesta del texto destacado del servicio es la calloutResponse predeterminada, la siguiente política obtiene el segundo valor de encabezado Set-Cookie.

<AssignMessage name="AM-Payload-from-SC-header">
  <Set>
    <Payload contentType="application/json">
      {"Cookies from Service Callout":" {calloutResponse.header.Set-Cookie.2}"}
    </Payload>
  </Set>
  <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
  <AssignTo>response</AssignTo>
</AssignMessage>

Para enumerar todos los valores de encabezado, usa la siguiente variable en su lugar:

{calloutResponse.header.Set-Cookie.values}

8: Almacena y quita parámetros de formulario, encabezados y parámetros de búsqueda

Si deseas usar <Remove> para borrar tus encabezados, parámetros de búsqueda o parámetros de formulario, pero conservar el acceso a sus valores más adelante en el flujo de la política, puedes almacenar sus valores con <AssignVariable>.

<AssignMessage async="false" continueOnError="false" enabled="true" name="AM-StoreAndRemove">
  <DisplayName>AM-StoreAndRemove</DisplayName>
  <AssignVariable>
    <Name>var_grant_type</Name>
    <Ref>request.formparam.grant_type</Ref>
  </AssignVariable>
  <Remove>
    <Headers/>
    <FormParams/>
    <Payload/>
  </Remove>
  <Set>
    <Headers>
      <Header name="Content-Type">application/x-www-form-urlencoded</Header>
      <Header name="Accept">application/json</Header>
      <Header name="Grant-Type">{var_grant_type}</Header>
    </Headers>
  </Set>
  <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
  <AssignTo createNew="false" transport="http" type="request"/>
</AssignMessage>

Cada elemento secundario en esta referencia tiene ejemplos adicionales. Para obtener aún más ejemplos, consulta el ejemplo de AssignMessage en GitHub.

Referencia del elemento secundario

En esta sección, se describen los elementos secundarios de <AssignMessage>.

<Add>

Agrega información a la solicitud o respuesta, que se especifica mediante el elemento <AssignTo>.

El elemento <Add> agrega propiedades nuevas en el mensaje que no existe en el mensaje original. Ten en cuenta que <Set> también proporciona esta funcionalidad. Para cambiar los valores de las propiedades existentes, usa el elemento <Set>.

Valor predeterminado N/A
¿Es obligatorio? Opcional
Tipo Tipo complejo
Elemento principal <AssignMessage>
Elementos secundarios <FormParams>
<Headers>
<QueryParams>

El elemento <Add> usa la siguiente sintaxis:

Sintaxis

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <Add>
    <FormParams>
      <FormParam name="FORMPARAM_NAME">FORMPARAM_VALUE</FormParam>
      ...
    </FormParams>
    <Headers>
      <Header name="HEADER_NAME">HEADER_VALUE</Header>
      ...
    </Headers>
    <QueryParams>
      <QueryParam name="QUERYPARAM_NAME">QUERYPARAM_VALUE</QueryParam>
      ...
    </QueryParams>
  </Add>
</AssignMessage>

Ejemplo 1

En el ejemplo siguiente, se usa el elemento <FormParams> para obtener los valores de tres parámetros de string de consulta de la solicitud inicial y configurarlos como parámetros de forma en la solicitud de extremo de destino:

<AssignMessage name="AM-add-formparams-3">
  <Add>
    <FormParams>
      <FormParam name="username">{request.queryparam.name}</FormParam>
      <FormParam name="zip_code">{request.queryparam.zipCode}</FormParam>
      <FormParam name="default_language">{request.queryparam.lang}</FormParam>
    </FormParams>
  </Add>
  <Remove>
    <QueryParams/>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

Ejemplo 2

En el siguiente ejemplo, se usa el elemento <Headers> para agregar un encabezado partner-id a la solicitud que se enviará al extremo de destino:

<AssignMessage name="AM-add-headers-1">
  <Add>
    <Headers>
      <Header name="partner-id">{verifyapikey.VAK-1.developer.app.partner-id}</Header>
    </Headers>
  </Add>
  <AssignTo>request</AssignTo>
</AssignMessage>

Ejemplo 3

En el siguiente ejemplo, se usa el elemento <QueryParams> para agregar un solo parámetro de búsqueda con un valor estático a la solicitud:

<AssignMessage name="AM-add-queryparams-1">
  <Add>
    <QueryParams>
      <QueryParam name="myParam">42</QueryParam>
    </QueryParams>
  </Add>
  <AssignTo>request</AssignTo>
</AssignMessage>

En este ejemplo, se usa <Add> en el flujo previo de la solicitud. Si examinas los resultados en una herramienta como Descripción general de depuración, la solicitud a https://example-target.com/get se convierte en https://example-target.com/get?myParam=42.

Los elementos secundarios de <Add> admiten la reemplazo de strings dinámicas, conocida como plantilla de mensajes.

<FormParams> (secundario de <Add>)

Agrega parámetros nuevos del formulario al mensaje de la solicitud. Este elemento no tiene efecto en un mensaje de respuesta.

Valor predeterminado N/A
¿Es obligatorio? Opcional
Tipo Arreglo de elementos <FormParam>
Elemento principal <Add>
Elementos secundarios <FormParam>

El elemento <FormParams> usa la siguiente sintaxis:

Sintaxis

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <Add>
    <FormParams>
      <FormParam name="FORMPARAM_NAME">FORMPARAM_VALUE</FormParam>
      ...
    </FormParams>
  <AssignTo createNew="[true|false]" transport="http"
    type="[request|response]">DESTINATION_VARIABLE_NAME</AssignTo>
  </Add>
</AssignMessage>

Ejemplo 1

En el siguiente ejemplo, se agrega un solo parámetro de formulario (answer) y un valor estático (42) a la solicitud:

<AssignMessage name="AM-add-formparams-1">
  <Add>
    <FormParams>
      <FormParam name="answer">42</FormParam>
    </FormParams>
  </Add>
  <AssignTo>request</AssignTo>
</AssignMessage>

Ejemplo 2

En el siguiente ejemplo, se obtiene el valor del parámetro de consulta name y se lo agrega a la solicitud como un parámetro de formulario y, luego, se quita el parámetro de consulta:

<AssignMessage name="AM-Swap-QueryParam-to-FormParams">
  <Add>
    <FormParam name="name">{request.queryparam.name}</FormParam>
  </Add>
  <Remove>
    <QueryParam name="name"/>
  </Remove>
</AssignMessage>

Ten en cuenta que en este ejemplo no se especifica un objetivo con <AssignTo>. Esta política solo agrega el parámetro a la solicitud.

Ejemplo 3

En el siguiente ejemplo, se agregan varios parámetros de formulario a la solicitud:

<AssignMessage name="AM-add-formparams-3">
  <Add>
    <FormParams>
      <FormParam name="username">{request.queryparam.name}</FormParam>
      <FormParam name="zip_code">{request.queryparam.zipCode}</FormParam>
      <FormParam name="default_language">{request.queryparam.lang}</FormParam>
    </FormParams>
  </Add>
  <Remove>
    <QueryParams/>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

En este ejemplo, se obtienen los parámetros de la string de consulta de la solicitud original y se los agrega como parámetros de formulario con diferentes nombres. Luego, quita los parámetros de consulta originales. Apigee enviará la solicitud modificada al extremo de destino.

Puedes usar la descripción general de Depuración para ver el flujo. Verás que el cuerpo de la solicitud contiene los datos del formulario con codificación URL, que se pasaron originalmente como parámetros de string de consulta:

username=nick&zip_code=90210&default_language=en

Solo puedes usar <FormParams> cuando se cumplan los siguientes criterios:

  • Verbo HTTP: POST
  • Tipo de mensaje: solicitud
  • Uno (o ambos) de los siguientes elementos:
    • Datos del formulario: establecidos en algún valor o "" (la string está vacía). Por ejemplo, con curl, agrega -d "" a tu solicitud.
    • Encabezado Content-Length: Se establece en 0 (si no hay datos en la solicitud original; de lo contrario, la longitud actual, en bytes). Por ejemplo, con curl, agrega -H "Content-Length: 0" a tu solicitud.

Por ejemplo:

curl -vL -X POST -d "" -H "Content-Type: application/x-www-form-urlencoded"
  https://ahamilton-eval-test.apigee.net/am-test

Cuando agregas <FormParams>, Apigee establece el encabezado Content-Type de la solicitud en application/x-www-form-urlencoded antes de enviar el mensaje al servicio de destino.

<Headers> (secundario de <Add>)

Agrega encabezados nuevos a la solicitud o respuesta especificadas, que se especifica mediante el elemento <AssignTo>.

Valor predeterminado N/A
¿Es obligatorio? Opcional
Tipo Arreglo de elementos <Header>
Elemento principal <Add>
Elementos secundarios <Header>

El elemento <Headers> usa la siguiente sintaxis:

Sintaxis

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <Add>
    <Headers>
      <Header name="HEADER_NAME">HEADER_VALUE</Header>
      ...
    </Headers>
  </Add>
</AssignMessage>

Ejemplo 1

En el siguiente ejemplo, se agrega el encabezado partner-id al mensaje de solicitud y se asigna el valor de la variable de flujo verifyapikey.VAK-1.developer.app.partner-id a ese encabezado.

<AssignMessage name="AM-add-headers-1">
  <Add>
    <Headers>
      <Header name="partner-id">{verifyapikey.VAK-1.developer.app.partner-id}</Header>
    </Headers>
  </Add>
  <AssignTo>request</AssignTo>
</AssignMessage>

<QueryParams> (secundario de <Add>)

Agrega nuevos parámetros de búsqueda a la solicitud. Este elemento no tiene efecto en una respuesta.

Valor predeterminado N/A
¿Es obligatorio? Opcional
Tipo Arreglo de elementos <QueryParam>
Elemento principal <Add>
Elementos secundarios <QueryParam>

El elemento <QueryParams> usa la siguiente sintaxis:

Sintaxis

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <Add>
    <QueryParams>
      <QueryParam name="QUERYPARAM_NAME">QUERYPARAM_VALUE</QueryParam>
      ...
    </QueryParams>
  </Add>
</AssignMessage>

Ejemplo 1

En el siguiente ejemplo, se agrega el parámetro de búsqueda myParam a la solicitud y se le asigna el valor 42:

<AssignMessage name="AM-add-queryparams-1">
  <Add>
    <QueryParams>
      <QueryParam name="myParam">42</QueryParam>
    </QueryParams>
  </Add>
  <AssignTo>request</AssignTo>
</AssignMessage>

Solo puedes usar <QueryParams> cuando se cumplan los siguientes criterios:

  • Verbos HTTP: GET, POST, PATCH, DELETE
  • Tipo de mensaje: solicitud

Además, solo puedes establecer parámetros de búsqueda cuando el atributo type del elemento <AssignTo> es un mensaje de solicitud. Configurarlos en la respuesta no causa ningún efecto.

Si defines un arreglo vacío de parámetros de búsqueda en tu política (<Add><QueryParams/></Add>), la política no agrega ningún parámetro de búsqueda. Esto es lo mismo que omitir <QueryParams>.

<AssignTo>

Determina en qué objeto funciona la política de AssignMessage. Las opciones son las siguientes:

  • Mensaje de la solicitud: La request que recibe el proxy de API
  • Mensaje de respuesta: La response que muestra el servidor de destino
  • Mensaje personalizado: Un objeto de solicitud o respuesta personalizado

Ten en cuenta que, en algunos casos, no puedes cambiar el objeto en el que actúa la política de AssignMessage. Por ejemplo, no puedes usar <Add> o <Set> para agregar o cambiar parámetros de búsqueda (<QueryParams>) o parámetros de formulario (<FormParams>) en la respuesta. Solo puedes manipular parámetros de búsqueda y parámetros de formulario en la solicitud.

Valor predeterminado N/A
¿Es obligatorio? Opcional
Tipo String
Elemento principal <AssignMessage>
Elementos secundarios Ninguno

Si no especificas <AssignTo> o si especificas el elemento <AssignTo>, pero no especificas un valor de texto para el elemento, la política actúa sobre la solicitud o respuesta predeterminada, que es lo que se muestra a continuación: en función de dónde se ejecuta la política. Si la política se ejecuta en el flujo de la solicitud, afecta el mensaje de la solicitud. Si se ejecuta en el flujo de respuesta, la política afecta la respuesta de forma predeterminada.

El elemento <AssignTo> usa la siguiente sintaxis:

Sintaxis

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <AssignTo createNew="[true|false]" transport="http"
    type="[request|response]">DESTINATION_VARIABLE_NAME</AssignTo>
</AssignMessage>

Ejemplo 1

En el siguiente ejemplo, no se especifica ningún mensaje en el texto de <AssignTo>. Esto implica que la política actuará sobre el mensaje request o response, según dónde se ejecute la política.

<AssignMessage name="assignto-1">
  <AssignTo createNew="false" transport="http" type="request"/> <!-- no-op -->
  ...
</AssignMessage>

Si especificas createNew="false" y no proporcionas un nombre de mensaje de forma explícita, los otros atributos de <AssignTo> son irrelevantes. En este caso, es posible que desees omitir el elemento <AssignTo> por completo.

Ejemplo 2

En el siguiente ejemplo, se crea un objeto de solicitud nuevo y se reemplaza el objeto existente:

<AssignMessage name="assignto-2">
  <AssignTo createNew="true" transport="http" type="request"/>
  ...
</AssignMessage>

Cuando creas un objeto de solicitud o respuesta nuevo, los otros elementos de la política de AssignMessage (como <Add>, <Set> y <Copy>) actúan en ese objeto de solicitud nuevo.

Puedes acceder al nuevo objeto de solicitud en otras políticas más adelante en el flujo o enviar el objeto de solicitud nuevo a un servicio externo con una política ServiceCallout.

Ejemplo 3

En el siguiente ejemplo, se crea un objeto de solicitud nuevo MyRequestObject:

<AssignMessage name="assignto-2">
  <AssignTo createNew="true" transport="http" type="request">MyRequestObject</AssignTo>
  ...
</AssignMessage>

Cuando creas un objeto de solicitud o respuesta nuevo, los otros elementos de la política de AssignMessage (como <Add>, <Set> y <Copy>) actúan en ese objeto de solicitud nuevo.

Puedes acceder al nuevo objeto de solicitud en otras políticas más adelante en el flujo o enviar el objeto de solicitud nuevo a un servicio externo con una política ServiceCallout.

En la siguiente tabla, se describen los atributos de <AssignTo>:

Atributo Descripción ¿Es obligatorio? Tipo
createNew

Determina si esta política crea un mensaje nuevo cuando asigna valores.

Si es true, la política crea una nueva variable del tipo especificado por type (request o response). Si no especificas el nombre de la variable nueva, la política creará un objeto de solicitud o respuesta nuevo, en función del valor de type.

Si es false, la política responde de una de las siguientes dos maneras:

  • Si <AssignTo> puede resolver el nombre de la variable en una solicitud o respuesta, continúa con el procesamiento. Por ejemplo, si la política está en un flujo de solicitudes, la variable es el objeto de solicitud. Si la política está en una respuesta, la variable es el objeto de respuesta.
  • Si <AssignTo> no se puede resolver o se resuelve en un tipo que no es de mensaje, la política muestra un error.

Si no se especifica createNew, la política responde de dos maneras:

  • Si <AssignTo> se resuelve en un mensaje y, luego, procesa el paso siguiente.
  • Si <AssignTo> no se puede resolver o se resuelve en un tipo que no es de mensaje, se crea una nueva variable de tipo especificada en type.
Opcional Booleano
transport

Especifica el tipo de transporte del tipo de mensaje de solicitud o respuesta.

El valor predeterminado es http (el único valor admitido).

Opcional String
type Especifica el tipo de mensaje nuevo, cuando createNew es true. Los valores válidos son request o response.

El valor predeterminado es request. Si omites este atributo, Apigee crea una solicitud o una respuesta, según en qué parte del flujo se ejecute esta política.

Opcional String

<AssignVariable>

Asigna un valor a una variable de flujo de destino (como una variable cuyo valor está establecido por la política AssignMessage). Si la variable de flujo no existe, <AssignVariable> la crea. Puedes usar varios elementos AssignVariable dentro de la política AssignMessage. Se ejecutan en orden de aparición en la configuración de la política.

Valor predeterminado N/A
¿Es obligatorio? Opcional
Tipo Tipo complejo
Elemento principal <AssignMessage>
Elementos secundarios <Name> (obligatorio)
<PropertySetRef>
<Ref>
<ResourceURL>
<Template>
<Value>

El valor que asignes a la variable de flujo de destino puede ser uno de los siguientes:

  • String literal: usa el elemento secundario <Value> para especificar un valor de string literal para la variable de flujo de destino.
  • Variable de flujo: Usa el elemento secundario <Ref> a fin de especificar el valor de una variable de flujo existente para la variable de flujo de destino. Para obtener una lista completa de las variables de flujo que se pueden usar como fuente, consulta Referencia de variables de flujo.
  • Conjunto de propiedades: Usa el elemento secundario <PropertySetRef> para recuperar el valor de un par de claves/nombre del conjunto de propiedades y almacenarlo en una variable de flujo. Te permite acceder a los conjuntos de propiedades de manera dinámica.
  • URL de recurso: Usa el elemento secundario <ResourceURL> a fin de especificar una URL para un recurso de texto, del tipo XSL, XSD, WSDL, JavaScript u OpenAPI Spec. Esto asigna el contenido del recurso a la variable de flujo con nombre.
  • Plantilla de mensaje: Usa el elemento secundario <Template> para especificar una plantilla de mensajes para la variable de flujo de destino.

El orden de prioridad de estos elementos secundarios es ResourceResource, Template, Ref, Value, ReferenceSetRef.

El elemento <AssignVariable> usa la siguiente sintaxis:

Sintaxis

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <AssignVariable>
    <Name>VARIABLE_NAME</Name>
    <PropertySetRef>SOURCE_VARIABLE</PropertySetRef>
    <Ref>SOURCE_VARIABLE</Ref>
    <ResourceURL>RESOURCE_URL_OR_TEMPLATE</ResourceURL>
    <Template>MESSAGE_TEMPLATE</Template>
    or
    <Template ref='TEMPLATE_VARIABLE'></Template>
    <Value>VARIABLE_VALUE</Value>
  </AssignVariable>
</AssignMessage>

Usa el elemento <Ref> para especificar la variable de origen. Si no se puede acceder a la variable a la que hace referencia <Ref>, Apigee usa el valor especificado por el elemento <Value>. Si defines <Template>, tiene prioridad sobre los elementos <Ref> y <Value> del mismo nivel.

Ejemplo 1

En el siguiente ejemplo, se configura el valor de una variable nueva, myvar, en el valor literal 42:

<AssignMessage name="assignvariable-1">
  <AssignVariable>
    <Name>myvar</Name>
    <Value>42</Value>
  </AssignVariable>
</AssignMessage>

Ejemplo 2

En el siguiente ejemplo, se asigna el valor de la variable de flujo request.header.user-agent a la variable de flujo de destino myvar y el valor del parámetro de búsqueda country a la variable de flujo de destino Country:

<AssignMessage name="assignvariable-2">
  <AssignVariable>
    <Name>myvar</Name>
    <Ref>request.header.user-agent</Ref>
    <Value>ErrorOnCopy</Value>
  </AssignVariable>
  <AssignVariable>
    <Name>Country</Name>
    <Ref>request.queryparam.country</Ref>
    <Value>ErrorOnCopy</Value>
  </AssignVariable>
</AssignMessage>

Si alguna de las asignaciones falla, Apigee asigna el valor ErrorOnCopy a la variable de flujo de destino.

Si las variables de flujo myvar o Country no existen, <AssignVariable> las crea.

Ejemplo 3

En el siguiente ejemplo, se usa el elemento secundario <Template> para concatenar dos variables de contexto con una string literal (un guion) entre ellas:

<AssignMessage name='AV-via-template-1'>
  <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
  <AssignVariable>
    <Name>my_destination_variable</Name>
    <Value>BADDBEEF</Value>
    <Template>{system.uuid}-{messageid}</Template>
  </AssignVariable>
</AssignMessage>

Ejemplo 4

En el siguiente ejemplo, se usa <AssignVariable> para inhabilitar el comportamiento predeterminado de propagar el sufijo de ruta de la solicitud de proxy a la solicitud de destino:

<AssignMessage name='AM-PathSuffixFalse'>
  <AssignVariable>
    <Name>target.copy.pathsuffix</Name>
    <Value>false</Value>
  </AssignVariable>
</AssignMessage>

Un uso común de <AssignVariable> es establecer un valor predeterminado para un parámetro de búsqueda, un encabezado o cualquier otro valor que se pueda pasar con la solicitud. Puedes hacerlo con una combinación de los elementos secundarios <Ref> y <Value>. Para obtener más información, consulta los ejemplos de <Ref>.

<Name> (secundario de <AssignVariable>)

Especifica el nombre de la variable de flujo de destino (la variable cuyo valor está establecido por la política AssignMessage). Si la variable con un nombre asignado en <Name> no existe, la política crea una con ese nombre.

Valor predeterminado N/A
¿Es obligatorio? Obligatorio
Tipo String
Elemento principal <AssignVariable>
Elementos secundarios Ninguna

El elemento <Name> usa la siguiente sintaxis:

Sintaxis

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <AssignVariable>
    <Name>VARIABLE_NAME</Name>
  </AssignVariable>
</AssignMessage>

Ejemplo 1

En el siguiente ejemplo, se especifica la variable de destino como myvar y se establece en el valor literal 42:

<AssignMessage name="assignvariable-1">
  <AssignVariable>
    <Name>myvar</Name>
    <Value>42</Value>
  </AssignVariable>
</AssignMessage>

Si myvar no existe, <AssignVariable> lo crea.

<PropertySetRef> (secundario de <AssignVariable>)

Este elemento te permite recuperar el valor de un par de claves/nombre del conjunto de propiedades de forma dinámica. Para obtener información sobre los conjuntos de propiedades, consulta Administra conjuntos de propiedades.

Valor predeterminado N/A
¿Es obligatorio? Opcional
Tipo String
Elemento principal <AssignVariable>
Elementos secundarios None

Un conjunto de propiedades consta de un par nombre/clave. Por ejemplo: propset1.id=12345, en el que propset1 es el nombre del conjunto de propiedades, id es una clave y 12345 es el valor de la clave.

El elemento secundario PropertySetRef te permite seleccionar claves o nombres de conjuntos de propiedades de forma dinámica. Supongamos que tienes 200 reglas de enrutamiento en un archivo de conjunto de propiedades. Puedes acceder a las reglas del conjunto de propiedades de la siguiente manera, en la que routingrules es el nombre del conjunto de propiedades y rule1, rule2, rulen son claves:

propertyset.routingrules.rule1
propertyset.routingrules.rule2
propertyset.routingrules.rulen

Para acceder a estas propiedades en un flujo de proxy de API, debes saber qué regla quieres seleccionar en el momento del diseño. Sin embargo, supongamos que el nombre de la regla viene en el encabezado de la solicitud o en la carga útil. Una forma de seleccionar la regla es usar una política de JavaScript con código como el siguiente:

context.getVariables("propertyset.routingrules." + ruleName); //assuming ruleName was populated earlier.

Por otro lado, la función PropertySetRef de AssignMessage te permite seleccionar una clave de propiedad de forma dinámica sin ingresar JavaScript.

Puedes usar una combinación de variables de flujo y valores de string literales en el elemento <PropertySetRef>. Consulta los ejemplos para obtener más detalles.

El elemento <PropertySetRef> usa la siguiente sintaxis:

Sintaxis

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <AssignVariable>
    <PropertySetRef>SOURCE_VARIABLE</PropertySetRef>
  </AssignVariable>
</AssignMessage>

Ejemplo 1

En este ejemplo, se asigna el valor de una clave de conjunto de propiedades a una variable de flujo. En este caso, el nombre del conjunto de propiedades se obtiene del encabezado propset_name, se proporciona la clave en el encabezado propset_key, y el valor asignado a la clave se almacena en la variable flow_variable.

<AssignMessage async="false" continueOnError="false" enabled="true" name="assignMessage">
  <DisplayName>Assign Message-1</DisplayName>
  <Properties/>
  <AssignVariable>
    <Name>flow_variable</Name>
    <PropertySetRef>{request.header.propset_name}.{request.header.propset_key}</PropertySetRef>
  </AssignVariable>
</AssignMessage>

Puedes usar cualquier combinación de variables de flujo y strings literales en el elemento <PropertySetRef>.

Ejemplo 2

En este ejemplo, se asigna el valor de una clave de conjunto de propiedades a una variable de flujo con un nombre de clave fijo (string literal). En este caso, el nombre del conjunto de propiedades se obtiene del encabezado propset_name, la clave es la string literal key1, y el valor asignado a la clave se almacena en la variable flow_variable.

<AssignMessage async="false" continueOnError="false" enabled="true" name="assignMessage">
  <DisplayName>Assign Message-1</DisplayName>
  <Properties/>
  <AssignVariable>
    <Name>flow_variable</Name>
    <PropertySetRef>{request.header.propset_name}.key1</PropertySetRef>
  </AssignVariable>
</AssignMessage>

Puedes usar cualquier combinación de variables de flujo y strings literales en el elemento <PropertySetRef>.

<Ref> (secundario de <AssignVariable>)

Especifica el origen de la asignación como una variable de flujo. La variable de flujo puede ser una de las variables de flujo predefinidas (como se indica en la referencia de variables de flujo) o una variable de flujo personalizada que creaste.

El valor de <Ref> siempre se interpreta como una variable de flujo. No puedes especificar una string literal como valor. Para asignar un valor de string literal, usa el elemento <Value> en su lugar.

Valor predeterminado N/A
¿Es obligatorio? Opcional
Tipo String
Elemento principal <AssignVariable>
Elementos secundarios Ninguno

Cuando especificas una variable de flujo con <Ref>, omite los corchetes {} que normalmente usarías para hacer referencia a una variable de flujo. Por ejemplo, para configurar el valor de tu variable nueva con el valor de la variable de flujo client.host:

  DO specify the variable name without brackets:
  <Ref>client.host</Ref>

  DO NOT use brackets:
  <Ref>{client.host}</Ref>

Si quieres definir un valor predeterminado para la variable de flujo de destino, usa <Value> en combinación con <Ref>. Si la variable de flujo que especifica <Ref> no existe, no se puede leer o es nula, entonces, Apigee asigna el valor de <Value> a la variable de flujo de destino.

El elemento <Ref> usa la siguiente sintaxis:

Sintaxis

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <AssignVariable>
    <Name>VARIABLE_NAME</Name>
    <Ref>SOURCE_VARIABLE</Ref>
  </AssignVariable>
</AssignMessage>

Ejemplo 1

En el siguiente ejemplo, se asigna el valor de la variable de flujo request.header.user-agent a la variable de flujo de destino myvar y el valor del parámetro de búsqueda country a la variable Country:

<AssignMessage name="assignvariable-4">
  <AssignVariable>
    <Name>myvar</Name>
    <Ref>request.header.user-agent</Ref>
  </AssignVariable>
  <AssignVariable>
    <Name>Country</Name>
    <Ref>request.queryparam.country</Ref>
  </AssignVariable>
</AssignMessage>

En este ejemplo, Apigee no tiene un valor predeterminado (o de resguardo) especificado para ninguna asignación.

Ejemplo 2

En el siguiente ejemplo, se asigna el valor de la variable de flujo request.header.user-agent a la variable de flujo de destino myvar y el valor del parámetro de búsqueda country a la variable Country:

<AssignMessage name="assignvariable-2">
  <AssignVariable>
    <Name>myvar</Name>
    <Ref>request.header.user-agent</Ref>
    <Value>ErrorOnCopy</Value>
  </AssignVariable>
  <AssignVariable>
    <Name>Country</Name>
    <Ref>request.queryparam.country</Ref>
    <Value>ErrorOnCopy</Value>
  </AssignVariable>
</AssignMessage>

En este ejemplo, si los valores de la variable de flujo request.header.user-agent o el parámetro de búsqueda Country son nulos, ilegibles o tienen errores, Apigee asigna el valor ErrorOnCopy a las variables nuevas.

Ejemplo 3

Un caso de uso común para <AssignVariable> es establecer el valor predeterminado de un parámetro de consulta, un encabezado o cualquier otro valor que se pueda pasar con la solicitud. Por ejemplo, creas un proxy de API de clima en el que la solicitud toma un solo parámetro de búsqueda llamado w. Este parámetro contiene el ID de la ciudad para la que deseas obtener el clima. La URL de la solicitud tiene el siguiente formato:

http://myCO.com/v1/weather/forecastrss?w=CITY_ID

Para definir un valor predeterminado para w, crea una política de AssignMessage como la siguiente:

<AssignMessage continueOnError="false" enabled="true" name="assignvariable-3">
  <AssignTo createNew="false" transport="http" type="request"/>
  <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
  <AssignVariable>
    <Name>request.queryparam.w</Name>
    <Ref>request.queryparam.w</Ref>
    <Value>12797282</Value>
  </AssignVariable>
</AssignMessage>

En este ejemplo, <AssignVariable> obtiene el valor de request.queryparam.w y lo asigna a sí mismo. Si la variable de flujo es nula, lo que significa que el parámetro de búsqueda w se omitió de la solicitud. En este ejemplo, se usa el valor predeterminado del elemento <Value>. Por lo tanto, puedes realizar una solicitud a este proxy de API que omite el parámetro de búsqueda w:

http://myCO.com/v1/weather/forecastrss

…y aún el proxy de API mostrará un resultado válido.

El valor de <Ref> debe ser una variable de flujo, como una propiedad de un objeto derequest, response o target, o el nombre de una variable de flujo personalizada.

Si especificas una variable de flujo que no existe para el valor de <Ref> y el valor de <IgnoreUnresolvedVariables> es false, Apigee mostrará un error.

<ResourceURL> (secundario de <AssignVariable>)

Especifica la URL de un recurso de texto como la fuente de la asignación de la variable. Apigee carga la variable de flujo especificada en <Name> con el contenido del recurso al que se hace referencia. El recurso puede ser de tipo XSD, XSL, WSDL, JavaScript, conjunto de propiedades o especificaciones de OpenAPI.

Valor predeterminado N/A
¿Es obligatorio? Opcional
Tipo String
Elemento principal <AssignVariable>
Elementos secundarios Ninguna

Si el recurso especificado por <ResourceURL> no existe, sucede lo siguiente: si el valor de <IgnoreUnresolvedVariables> es true, Apigee asigna el valor null a una variable de flujo de destino y, si el valor de<IgnoreUnresolvedVariables> es false, Apigee generará un error.

El elemento <ResourceURL> usa la siguiente sintaxis:

Sintaxis

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <AssignVariable>
    <Name>VARIABLE_NAME</Name>
    <ResourceURL>RESOURCE_URL_OR_TEMPLATE</ResourceURL>
  </AssignVariable>
</AssignMessage>
      

El valor de texto toma un valor de string y se interpreta como una plantilla de mensajes. Cualquiera de estos elementos es válido:

<ResourceURL>jsc://my-js-file.js</ResourceURL>
<ResourceURL>wsdl://{variable-goes-here}</ResourceURL>
<ResourceURL>{variable-goes-here}</ResourceURL>

Ejemplo 1

En el siguiente ejemplo, se asigna el valor de un recurso JSON, que se cargó en el proxy de la carpeta jsc, en la variable de flujo assigned-variable:

<AssignMessage name='AM-From-ResourceURL-Proxy-JSC'>
  <AssignVariable>
    <Name>assigned-variable</Name>
    <ResourceURL>jsc://settings.json</ResourceURL>
  </AssignVariable>
</AssignMessage>

Ejemplo 2

En el siguiente ejemplo, se asigna el valor de un recurso de especificación de OpenAPI, se carga en el proxy en la carpeta oas, en la variable de flujo assigned-variable y, luego, se establece ese valor como Payload en el cuerpo de la respuesta:

<AssignMessage name='AM-Response'>
  <AssignVariable>
    <Name>assigned-variable</Name>
    <ResourceURL>oas://Fulfillment.yaml</ResourceURL>
  </AssignVariable>
  <Set>
    <Payload contentType='application/yaml'>{assigned-variable}</Payload>
  </Set>
</AssignMessage>

<Template> (secundario de <AssignVariable>)

Especifica una plantilla de mensaje. Una plantilla de mensaje te permite realizar sustituciones de strings variables cuando se ejecuta la política y puedes combinar strings literales con nombres de variables entre llaves. Además, las plantillas de mensajes admiten funciones, como el escape y la conversión de casos.

Usa el atributo ref para especificar una variable de flujo en la que el valor de la variable sea una plantilla de mensaje. Por ejemplo, podrías almacenar una plantilla de mensajes como atributo personalizado en una app para desarrolladores. Cuando Apigee identifica la app para desarrolladores después de que verifique la clave de API o el token de seguridad (mediante una política adicional), el elemento <AssignVariable> podría usar la plantilla de mensaje del atributo personalizado de la app, que está disponible como una variable de flujo de la política de seguridad. En el siguiente ejemplo, suponemos que la plantilla de mensaje está disponible en un atributo personalizado llamado message_template en la app para desarrolladores y realiza la llamada a la API, en el que la Política VerifyAPIKey se usó para verificar la clave de API de la app:

<Template ref='verifyapikey.myVerifyAPIKeyPolicy.app.name.message_template'/>

Valor predeterminado N/A
¿Es obligatorio? Opcional
Tipo String
Elemento principal <AssignVariable>
Elementos secundarios Ninguna

El elemento <Template> usa la siguiente sintaxis:

Sintaxis

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <AssignVariable>
    <Template>MESSAGE_TEMPLATE</Template>
    or
    <Template ref='TEMPLATE_VARIABLE'></Template>
  </AssignVariable>
</AssignMessage>

Ejemplo 1

En el ejemplo siguiente, se usa la sintaxis de plantillas de mensajes para concatenar dos variables de contexto con una string literal (un guion) entre ellas:

<AssignMessage name='AV-via-template-1'>
  <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
  <AssignVariable>
    <Name>my_destination_variable</Name>
    <Value>BADDBEEF</Value>
    <Template>{system.uuid}-{messageid}</Template>
  </AssignVariable>
</AssignMessage>

Ejemplo 2

En el siguiente ejemplo, se especifica una variable de flujo, en la que el valor de la variable es una plantilla de mensaje predefinida. Usa esta opción si deseas incorporar una plantilla predefinida en el entorno de ejecución sin tener que modificar la política:

<AssignMessage name='AV-via-template-indirectly'>
  <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
  <AssignVariable>
    <Name>my_destination_variable</Name>
    <Value>BADDBEEF</Value>
    <Template ref='my_template_variable'/>
  </AssignVariable>
</AssignMessage>

Ejemplo 3

En el siguiente ejemplo, se especifica una variable de flujo y un valor de texto. En este caso, si la variable a la que se hace referencia no es nula, ese valor se usa como plantilla. Si el valor al que se hace referencia es nulo, se usa el valor de texto (en este caso, {system.uuid}-{messageid}) como plantilla. Este patrón es útil para proporcionar un valor override, en el que en algunos casos deseas anular la plantilla predeterminada (la parte de texto) con valores configurados de forma dinámica. Por ejemplo, una instrucción condicional puede obtener un valor de un mapa de clave-valor y establecer la variable a la que se hace referencia en ese valor:

<AssignMessage name='AV-template-with-fallback'>
  <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
  <AssignVariable>
    <Name>my_destination_variable</Name>
    <Template ref='my_variable'>{system.uuid}-{messageid}</Template>
  </AssignVariable>
</AssignMessage>

<Value> (secundario de <AssignVariable>)

Define el valor de la variable de flujo de destino establecida con <AssignVariable>. El valor siempre se interpreta como una string literal. No puedes usar una variable de flujo como valor, incluso si encierras el valor entre corchetes ({}). Para usar una variable de flujo, usa <Ref> en su lugar.

Valor predeterminado N/A
¿Es obligatorio? Opcional
Tipo String
Elemento principal <AssignVariable>
Elementos secundarios None

Cuando se usa en combinación con el elemento <Ref>, <Value> actúa como el valor predeterminado (o de resguardo). Si no se especifica <Ref>, no se puede resolver o es nulo, se usará el valor de <Value>.

El elemento <Value> usa la siguiente sintaxis:

Sintaxis

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <AssignVariable>
    <Name>VARIABLE_NAME</Name>
    <Value>VARIABLE_VALUE</Value>
  </AssignVariable>
</AssignMessage>

Ejemplo 1

En el siguiente ejemplo, se establece el valor de la variable de flujo de destino, myvar, en el valor literal 42:

<AssignMessage name="assignvariable-1">
  <AssignVariable>
    <Name>myvar</Name>
    <Value>42</Value>
  </AssignVariable>
</AssignMessage>

Ejemplo 2

En el siguiente ejemplo, se asigna el valor de la variable de flujo request.header.user-agent a la variable de flujo myvar y el valor del parámetro de búsqueda country a la variable Country:

<AssignMessage name="assignvariable-2">
  <AssignVariable>
    <Name>myvar</Name>
    <Ref>request.header.user-agent</Ref>
    <Value>ErrorOnCopy</Value>
  </AssignVariable>
  <AssignVariable>
    <Name>Country</Name>
    <Ref>request.queryparam.country</Ref>
    <Value>ErrorOnCopy</Value>
  </AssignVariable>
</AssignMessage>

Si alguna de las asignaciones falla, <AssignVariable> asigna el valor ErrorOnCopy a la variable de flujo de destino.

<Copy>

Copia valores desde el mensaje especificado por el atributo source en el mensaje especificado por el elemento <AssignTo>. Si no especificas un destino con <AssignTo>, esta política copia los valores en la solicitud o la respuesta, según la parte del flujo en que se ejecute esta política.

Valor predeterminado N/A
¿Es obligatorio? Opcional
Tipo String
Elemento principal <AssignMessage>
Elementos secundarios <FormParams>
<Headers>
<Path>
<Payload>
<QueryParams>
<StatusCode>
<Verb>
<Version>

Si no especificas elementos secundarios debajo del elemento <Copy>, se copiarán todas las partes del mensaje de origen designado.

El elemento <Copy> usa la siguiente sintaxis:

Sintaxis

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
    <Copy source="VARIABLE_NAME">
    <!-- Can also be an empty array (<FormParams/>) -->
    <FormParams>
      <FormParam name="FORMPARAM_NAME">FORMPARAM_VALUE</FormParam>
      ...
    </FormParams>
    <!-- Copy all headers -->
    <Headers/>
    <!-- or, copy specific headers by name -->
    <Headers>
      <Header name="HEADER_NAME"/>
      <!-- or -->
      <Header name="HEADER_NAME">[false|true]</Header>
      ...
    </Headers>
    <Path>[false|true]</Path>
    <Payload>[false|true]</Payload>
    <!-- Can also be an empty array (<QueryParams/>) -->
    <QueryParams>
      <QueryParam name="QUERYPARAM_NAME">QUERYPARAM_VALUE</QueryParam>
      ...
    </QueryParams>
    <StatusCode>[false|true]</StatusCode>
    <Verb>[false|true]</Verb>
    <Version>[false|true]</Version>
  </Copy>
  <!-- Used as the destination for the <Copy> values -->
  <AssignTo createNew="[true|false]" transport="http"
    type="[request|response]">DESTINATION_VARIABLE_NAME</AssignTo>
</AssignMessage>
  

Ejemplo 1

En el siguiente ejemplo, se copia un encabezado, tres parámetros de formulario, la ruta y todos los parámetros de búsqueda desde el mensaje request hasta una nueva solicitud personalizada denominada newRequest:

<AssignMessage name="AM-copy-1">
  <AssignTo createNew="true" transport="http" type="request">newRequest</AssignTo>
  <Copy source="request">
    <Headers>
      <Header name="Header_Name_1"/>
    </Headers>
    <FormParams>
      <FormParam name="Form_Param_Name_1"/>
      <FormParam name="Form_Param_Name_2"/>
      <FormParam name="Form_Param_Name_3"/>
    </FormParams>
    <Path>true</Path>
    <QueryParams/>
  </Copy>
</AssignMessage>

Debido a que elementos como <Payload> y <Verb> no están presentes, la política no copia esas partes del mensaje.

Ejemplo 2

En el siguiente ejemplo, primero se quita todo en el mensaje response existente y, luego, se copian todos los valores de un mensaje diferente llamado secondResponse en el mensaje response:

<AssignMessage name='AM-Copy-Response'>
  <AssignTo createNew="false" transport="http" type="response">response</AssignTo>
  <!-- first remove any existing values -->
  <Remove/>
  <!-- then copy everything from the designated message -->
  <Copy source="secondResponse"/>
</AssignMessage>

El elemento <Copy> tiene un solo atributo:

Atributo Descripción ¿Es obligatorio? Tipo
origen

Especifica el objeto de origen de la copia.

  • Si no se especifica source, el valor predeterminado es message, que toma un valor diferente según el flujo en el que se ejecuta la política. Si la política se ejecuta dentro del flujo de solicitud, la variable message hace referencia al objeto request. Si la política se ejecuta dentro del flujo de respuesta, la variable message hace referencia al objeto response.
  • Si la variable especificada en el atributo source no se puede resolver o se resuelve en un tipo que no es de mensaje, <Copy> no tendrá ningún efecto.
  • Asegúrate de que el valor que especificas para source sea diferente del mensaje de destino, ya sea el mensaje de destino predeterminado o un destino especificado de forma explícita con <AssignTo>. Si el source es el mismo que el mensaje de destino, <Copy> no tendrá ningún efecto.
Opcional String

<FormParams> (secundario de <Copy>)

Copia los parámetros del formulario de la solicitud especificada por el atributo source del elemento <Copy> en la solicitud especificada por el elemento <AssignTo>. Este elemento no causa ningún efecto en una respuesta.

Valor predeterminado N/A
¿Es obligatorio? Opcional
Tipo Arreglo de elementos <FormParam> o un arreglo vacío
Elemento principal <Copy>
Elementos secundarios <FormParam>

El elemento <FormParams> usa la siguiente sintaxis:

Sintaxis

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <Copy source="VARIABLE_NAME">
    <!-- Can also be an empty array (<FormParams/>) -->
    <FormParams>
      <FormParam name="FORMPARAM_NAME">FORMPARAM_VALUE</FormParam>
      ...
    </FormParams>
  </Copy>
</AssignMessage>

Ejemplo 1

En el siguiente ejemplo, se copia un solo parámetro de formulario de la solicitud a la solicitud personalizada MyCustomRequest:

<AssignMessage name="copy-formparams-1">
  <Copy source="request">
    <FormParams>
      <FormParam name="paramName">Form param value 1</FormParam>
    </FormParams>
  </Copy>
  <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo>
</AssignMessage>

Ejemplo 2

En el siguiente ejemplo, se copian todos los parámetros del formulario a la solicitud personalizada MyCustomRequest:

<AssignMessage name="copy-formparams-2">
  <Copy source="request">
    <FormParams/>
  </Copy>
  <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo>
</AssignMessage>

Ejemplo 3

En el siguiente ejemplo, se copian tres parámetros de formulario en la solicitud personalizada MyCustomRequest:

<AssignMessage name="copy-formparams-3">
  <Copy source="request">
    <FormParams>
      <FormParam name="paramName1"/>
      <FormParam name="paramName2"/>
      <FormParam name="paramName3"/>
    </FormParams>
  </Copy>
  <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo>
</AssignMessage>

Ejemplo 4

Si hay varios parámetros de formulario con el mismo nombre, utiliza la siguiente sintaxis:

<AssignMessage name="copy-formparams-4">
  <Copy source="request">
    <FormParams>
      <FormParam name="f1"/>
      <FormParam name="f2"/>
      <FormParam name="f3.2"/>
    </FormParams>
  </Copy>
  <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo>
</AssignMessage>

En este ejemplo, se copian f1, f2 y el segundo valor de f3. Si f3 tiene solo un valor, no se copiará.

Solo puedes usar <FormParams> cuando se cumplan los siguientes criterios:

  • Verbo HTTP POST
  • Tipo de mensaje: Respuesta
  • Uno (o ambos) de los siguientes elementos:
    • Datos del formulario: establecidos en algún valor o "" (la string está vacía). Por ejemplo, con curl, agrega -d "" a tu solicitud.
    • Encabezado Content-Length: Se establece en 0 (si no hay datos en la solicitud original; de lo contrario, la longitud actual). Por ejemplo, con curl, agrega -H "Content-Length: 0" a tu solicitud.

Cuando copias <FormParams>, <Copy> establece el Content-Type del mensaje en application/x-www-form-urlencoded antes de enviar el mensaje al servicio de destino.

<Headers> (secundario de <Copy>)

Copia encabezados HTTP de del mensaje de respuesta o solicitud que especifica el atributo source del elemento <Copy> en el mensaje de respuesta o solicitud que especifica el elemento <AssignTo>.

Valor predeterminado N/A
¿Es obligatorio? Opcional
Tipo Un arreglo de elementos <Header> o un arreglo vacío
Elemento principal <Copy>
Elementos secundarios <Header>

El elemento <Headers> usa la siguiente sintaxis:

Sintaxis

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <Copy source="VARIABLE_NAME">
    <!-- Copy all headers -->
    <Headers/>
    <!-- or, copy specific headers by name -->
    <Headers>
      <Header name="HEADER_NAME"/>
      <!-- or -->
      <Header name="HEADER_NAME">[false|true]</Header>
      ...
    </Headers>
  </Copy>
</AssignMessage>

Ejemplo 1

En el siguiente ejemplo, se copia el encabezado user-agent de la solicitud en el objeto de solicitud nuevo:

<AssignMessage name="AM-copy-headers-1">
  <Copy source="request">
    <Headers>
      <Header name="user-agent"/>
    </Headers>
  </Copy>
  <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo>
</AssignMessage>

Ejemplo 2

Para copiar todos los encabezados, usa un elemento <Headers> vacío, como se muestra en el siguiente ejemplo:

<AssignMessage name="copy-headers-2">
  <Copy source="request">
    <Headers/>
  </Copy>
  <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo>
</AssignMessage>

Ejemplo 3

Si hay varios encabezados con el mismo nombre, usa la siguiente sintaxis:

<AssignMessage name="copy-headers-3">
  <Copy source="request">
    <Headers>
      <Header name="h1"/>
      <Header name="h2"/>
      <Header name="h3.2"/>
    </Headers>
  </Copy>
  <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo>
</AssignMessage>

En este ejemplo, se copian h1, h2 y el segundo valor de h3. Si h3 tiene solo un valor, no se copiará.

<Path> (secundario de <Copy>)

Determina si la ruta se debe copiar desde la solicitud de origen a la solicitud de destino. Este elemento no tiene efecto en una respuesta.

Si true, esta política copiará la ruta de acceso del mensaje de solicitud especificado por el atributo source del elemento <Copy> al mensaje de solicitud especificado por el elemento <AssignTo>.

Valor predeterminado Falso
¿Es obligatorio? Opcional
Tipo Booleano
Elemento principal <Copy>
Elementos secundarios Ninguna

El elemento <Path> usa la siguiente sintaxis:

Sintaxis

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <Copy source="VARIABLE_NAME">
    <Path>[false|true]</Path>
  </Copy>
</AssignMessage>

Ejemplo 1

En el siguiente ejemplo, se indica que la AssignMessage debe copiar la ruta de la solicitud de origen en nuevo objeto de solicitud personalizado:

<AssignMessage name="copy-path-1">
  <Copy source="request">
    <Path>true</Path>
  </Copy>
  <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo>
</AssignMessage>

Solo puedes usar <Path> cuando se cumplan los siguientes criterios:

  • Tipo de mensaje: solicitud

<Payload> (secundario de <Copy>)

Determina si la carga útil se debe copiar de la fuente al destino. El origen y el destino pueden ser solicitudes o respuestas.

Si es true, esta política copia la carga útil de el mensaje especificado por el atributo source del elemento <Copy> al mensaje especificado por el elemento <AssignTo>.

Valor predeterminado Falso
¿Es obligatorio? Opcional
Tipo Booleano
Elemento principal <Copy>
Elementos secundarios Ninguna

El elemento <Payload> usa la siguiente sintaxis:

Sintaxis

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <Copy source="VARIABLE_NAME">
    <Payload>[false|true]</Payload>
  </Copy>
</AssignMessage>

Ejemplo 1

En el siguiente ejemplo, se configura <Payload> como true para que la carga útil de la solicitud se copie de la solicitud a la respuesta:

<AssignMessage name="AM-copy-payload-1">
  <Copy source="request">
    <Payload>true</Payload>
  </Copy>
  <AssignTo>response</AssignTo>
</AssignMessage>

<QueryParams> (secundario de <Copy>)

Copia los parámetros del formulario de la solicitud especificada por el atributo source del elemento <Copy> a la solicitud especificada por el elemento <AssignTo>. Este elemento no tiene efecto en una respuesta.

Valor predeterminado N/A
¿Es obligatorio? Opcional
Tipo Un arreglo de elementos <QueryParam> o un arreglo vacío
Elemento principal <QueryParam>
Elementos secundarios Ninguna

El elemento <QueryParams> usa la siguiente sintaxis:

Sintaxis

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <Copy source="VARIABLE_NAME">
    <!-- Can also be an empty array (<QueryParams/>) -->
    <QueryParams>
      <QueryParam name="QUERYPARAM_NAME">QUERYPARAM_VALUE</QueryParam>
      ...
    </QueryParams>
  </Copy>
</AssignMessage>

Ejemplo 1

En el siguiente ejemplo, se copia el parámetro de consulta my_param de la solicitud en un objeto de solicitud nuevo:

<AssignMessage name="copy-queryparams-1">
  <Copy source="request">
    <QueryParams>
      <QueryParam name="my_param"/>
    </QueryParams>
  </Copy>
  <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo>
</AssignMessage>

Ejemplo 2

En el siguiente ejemplo, se copian todos los parámetros de búsqueda de la solicitud en un nuevo objeto de solicitud personalizado:

<AssignMessage name="copy-queryparams-2">
  <Copy source="request">
    <QueryParams/>
  </Copy>
  <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo>
</AssignMessage>

Ejemplo 3

Si hay varios parámetros de búsqueda con el mismo nombre, usa la siguiente sintaxis:

<AssignMessage name="copy-queryparams-3">
  <Copy source="request">
    <QueryParams>
      <QueryParam name="qp1"/>
      <QueryParam name="qp2"/>
      <QueryParam name="qp3.2"/>
    </QueryParams>
  </Copy>
  <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo>
</AssignMessage>

En este ejemplo, se copian qp1, qp2 y el segundo valor de qp3. Si qp3 tiene solo un valor, no se copiará.

Solo puedes usar <QueryParams> cuando se cumplan los siguientes criterios:

  • Verbos HTTP: GET, POST, PATCH, DELETE
  • Tipo de mensaje: solicitud

<StatusCode> (secundario de <Copy>)

Determina si el código de estado se copia de la respuesta de origen a la respuesta de destino. Este elemento no causa ningún efecto en una solicitud.

Si es true, esta política copiará el código de estado del mensaje de respuesta especificado por el atributo source del elemento <Copy> al mensaje de respuesta especificado por el elemento <AssignTo>.

Valor predeterminado Falso
¿Es obligatorio? Opcional
Tipo Booleano
Elemento principal <Copy>
Elementos secundarios Ninguna

El elemento <StatusCode> usa la siguiente sintaxis:

Sintaxis

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <Copy source="VARIABLE_NAME">
    <StatusCode>[false|true]</StatusCode>
  </Copy>
</AssignMessage>

Ejemplo 1

En el siguiente ejemplo, se configura <StatusCode> como true, que copia el código de estado del objeto de respuesta predeterminado en un objeto de respuesta nuevo y personalizado:

<AssignMessage name="copy-statuscode-1">
  <Copy source="response">
    <StatusCode>true</StatusCode>
  </Copy>
  <AssignTo createNew="true" transport="http" type="response">MyCustomResponse</AssignTo>
</AssignMessage>

Solo puedes usar <StatusCode> cuando los mensajes de origen y de destino sean del tipo Respuesta.

Un uso común de <StatusCode> es establecer que el código de estado de respuesta del proxy sea un valor diferente del que se recibió del destino.

<Verb> (secundario de <Copy>)

Determina si el verbo HTTP se copia de la solicitud de origen a la solicitud de destino. Este elemento no tiene efecto en una respuesta.

Si es true, se copiará el verbo encontrado en el atributo source del elemento <Copy> en la solicitud especificada en el elemento <AssignTo>.

Valor predeterminado Falso
¿Es obligatorio? Opcional
Tipo Booleano
Elemento principal <Copy>
Elementos secundarios Ninguna

El elemento <Verb> usa la siguiente sintaxis:

Sintaxis

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <Copy source="VARIABLE_NAME">
    <Verb>[false|true]</Verb>
  </Copy>
</AssignMessage>

Ejemplo 1

En el siguiente ejemplo, se configura <Verb> como true, que copiará el verbo de la solicitud predeterminada en una nueva solicitud personalizada:

<AssignMessage name="copy-verb-1">
  <Copy source="request">
    <Verb>true</Verb>
  </Copy>
  <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo>
</AssignMessage>

Solo puedes usar <Verb> cuando se cumplan los siguientes criterios:

  • Tipo de mensaje: solicitud

<Version> (secundario de <Copy>)

Determina si la versión HTTP se copia de la solicitud de origen a la solicitud de destino. Este elemento no tiene efecto en una respuesta.

Si es true, copia la versión HTTP que se encuentra en el atributo source del elemento <Copy> en el objeto especificado en el elemento <AssignTo>.

Valor predeterminado Falso
¿Es obligatorio? Opcional
Tipo Booleano
Elemento principal <Copy>
Elementos secundarios Ninguna

El elemento <Version> usa la siguiente sintaxis:

Sintaxis

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <Copy source="VARIABLE_NAME">
    <Version>[false|true]</Version>
  </Copy>
</AssignMessage>

Ejemplo 1

En el siguiente ejemplo, se configura <Version> como true en la solicitud, que copia la versión del objeto de solicitud predeterminado a un objeto de solicitud nuevo y personalizado:

<AssignMessage name="copy-version-1">
  <Copy source="request">
    <Version>true</Version>
  </Copy>
  <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo>
</AssignMessage>

Solo puedes usar <Version> cuando se cumplan los siguientes criterios:

  • Tipo de mensaje: solicitud

<DisplayName>

Se usan además del atributo name para etiquetar la política en el editor de proxy de la IU de administración con un nombre de lenguaje natural diferente.

El elemento <DisplayName> es común a todas las políticas.

Valor predeterminado N/A
¿Es obligatorio? Opcional. Si omites <DisplayName>, se usa el valor del atributo name de la política.
Tipo String
Elemento principal <PolicyElement>
Elementos secundarios Ninguna

El elemento <DisplayName> usa la siguiente sintaxis:

Sintaxis

<PolicyElement>
  <DisplayName>POLICY_DISPLAY_NAME</DisplayName>
  ...
</PolicyElement>

Ejemplo

<PolicyElement>
  <DisplayName>My Validation Policy</DisplayName>
</PolicyElement>

El elemento <DisplayName> no tiene atributos ni elementos secundarios.

<IgnoreUnresolvedVariables>

Determina si el procesamiento se detiene cuando se encuentra una variable sin resolver.

Valor predeterminado Falso
¿Es obligatorio? Opcional
Tipo Booleano
Elemento principal <AssignMessage>
Elementos secundarios Ninguno

Configúralo como true para ignorar las variables sin resolver y continuar con el procesamiento, de lo contrario, false. El valor predeterminado es false.

Configurar <IgnoreUnresolvedVariables> como true es diferente a configurar el parámetro continueOnError de <AssignMessage> como true puesto que es específico de la configuración y la obtención de valores de variables. Si configuras continueOnError como true, Apigee ignorará todos los errores, no solo los errores detectados cuando se usan variables.

El elemento <IgnoreUnresolvedVariables> usa la siguiente sintaxis:

Sintaxis

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <IgnoreUnresolvedVariables>[true|false]</IgnoreUnresolvedVariables>
</AssignMessage>

Ejemplo 1

En el siguiente ejemplo, se configura <IgnoreUnresolvedVariables> como true:

<AssignMessage name="AM-Set-Headers">
  <Set>
    <Headers>
      <Header name='new-header'>{possibly-defined-variable}<Header>
    </Headers>
  </Set>
  <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
</AssignMessage>

Debido a que <IgnoreUnresolvedVariables> está configurado como true, si la variable possibly-defined-variable no está definida, esta política no arrojará una falla.

<Remove>

Quita los encabezados, los parámetros de búsqueda de la consulta, los parámetros de formulario y/o la carga útil del mensaje de un mensaje. Una etiqueta <Remove> vacía quita todo del mensaje.

El mensaje afectado puede ser una solicitud o una respuesta. Especifica en qué mensaje actúa <Remove> mediante el elemento <AssignTo>.

Valor predeterminado N/A
¿Es obligatorio? Opcional
Tipo Tipo complejo
Elemento principal <AssignMessage>
Elementos secundarios <FormParams>
<Headers>
<Payload>
<QueryParams>

Un caso de uso común para <Remove> es borrar un parámetro de consulta o encabezado que contiene información sensible del objeto de solicitud entrante para evitar pasarlo al servidor de backend.

El elemento <Remove> usa la siguiente sintaxis:

Sintaxis

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <!-- Can also be empty to remove everything from the message (<Remove/>) -->
  <Remove>
    <!-- Remove all form parameters -->
    <FormParams/>
    <!-- or, remove specific form parameters by name -->
    <FormParams>
      <FormParam name="FORMPARAM_NAME"/>
      <!-- or -->
      <FormParam name="FORMPARAM_NAME">[false|true]</FormParam>
      ...
    </FormParams>
    <!-- Remove all headers -->
    <Headers/>
    <!-- or, remove specific headers by name -->
    <Headers>
      <Header name="HEADER_NAME"/>
      <!-- or -->
      <Header name="HEADER_NAME">[false|true]</Header>
      ...
    </Headers>
    <Payload>[false|true]</Payload>
    <!-- Remove all query parameters -->
    <QueryParams/>
    <!-- or, remove specific query parameters by name -->
    <QueryParams>
      <QueryParam name="QUERYPARAM_NAME"/>
      <!-- or -->
      <QueryParam name="QUERYPARAM_NAME">[false|true]</QueryParam>
      ...
    </QueryParams>
  </Remove>
</AssignMessage>

Ejemplo 1

En el siguiente ejemplo, se quita el cuerpo del mensaje de la respuesta:

<AssignMessage name="AM-remove-1">
  <DisplayName>remove-1</DisplayName>
  <Remove>
    <Payload>true</Payload>
  </Remove>
  <AssignTo>response</AssignTo>
</AssignMessage>

En el flujo de respuesta, esta política quita el cuerpo de la respuesta y muestra solo los encabezados HTTP al cliente.

Ejemplo 2

En el siguiente ejemplo, se quitan todos los parámetros de formulario y un parámetro de consulta del objeto request:

<AssignMessage name="AM-remove-2">
  <Remove>
    <!-- Empty (<FormParams/>) removes all form parameters -->
    <FormParams/>
    <QueryParams>
      <QueryParam name="qp1"/>
    </QueryParams>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

Ejemplo 3

En el siguiente ejemplo, se quita todo del objeto de mensaje:

<AssignMessage name="AM-remove-3">
  <Remove/>
  <AssignTo>request</AssignTo>
</AssignMessage>

Por lo general, lo haces solo si usarías el elemento <Set> o el elemento <Copy> para establecer algunos valores de reemplazo en el mensaje.

<FormParams> (secundario de <Remove>)

Quita los parámetros de búsqueda especificados de la solicitud. Este elemento no causa ningún efecto en una respuesta.

Valor predeterminado N/A
¿Es obligatorio? Opcional
Tipo Arreglo de elementos <FormParam> o un arreglo vacío
Elemento principal <Remove>
Elementos secundarios <FormParam>

El elemento <FormParams> usa la siguiente sintaxis:

Sintaxis

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <!-- Can also be empty to remove everything from the message (<Remove/>) -->
  <Remove>
    <!-- Remove all form parameters -->
    <FormParams/>
    <!-- or, remove specific form parameters by name -->
    <FormParams>
      <FormParam name="FORMPARAM_NAME"/>
      <!-- or -->
      <FormParam name="FORMPARAM_NAME">[false|true]</FormParam>
      ...
    </FormParams>
  </Remove>
</AssignMessage>

Ejemplo 1

En el siguiente ejemplo, se quitan tres parámetros de búsqueda de la solicitud:

<AssignMessage name="AM-remove-formparams-1">
  <Remove>
    <FormParams>
      <FormParam name="form_param_1"/>
      <FormParam name="form_param_2"/>
      <FormParam name="form_param_3"/>
    </FormParams>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

Ejemplo 2

En el siguiente ejemplo, se quitan todos los parámetros de búsqueda de la solicitud:

<AssignMessage name="AM-remove-formparams-2">
  <Remove>
    <FormParams/>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

Ejemplo 3

Si hay varios parámetros de formulario con el mismo nombre, utiliza la siguiente sintaxis:

<AssignMessage name="AM-remove-formparams-3">
  <Remove>
    <FormParams>
      <FormParam name="f1"/>
      <FormParam name="f2"/>
      <FormParam name="f3.2"/>
    </FormParams>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

En este ejemplo, se quitan f1, f2 y el segundo valor de f3. Si f3 tiene solo un valor, no se quitará.

Solo puedes usar <FormParams> cuando se cumplan los siguientes criterios:

  • Tipo de mensaje: solicitud
  • Content-Type: application/x-www-form-urlencoded

<Headers> (secundario de <Remove>)

Quita los encabezados HTTP especificados de la solicitud o respuesta, que se especifica mediante el elemento <AssignTo>.

Valor predeterminado N/A
¿Es obligatorio? Opcional
Tipo Arreglo de elementos <Header> o un arreglo vacío
Elemento principal <Remove>
Elementos secundarios <Header>

El elemento <Headers> usa la siguiente sintaxis:

Sintaxis

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <!-- Can also be empty to remove everything from the message (<Remove/>) -->
  <Remove>
    <!-- Remove all headers -->
    <Headers/>
    <!-- or, remove specific headers by name -->
    <Headers>
      <Header name="HEADER_NAME"/>
      <!-- or -->
      <Header name="HEADER_NAME">[false|true]</Header>
      ...
    </Headers>
  </Remove>
</AssignMessage>

Ejemplo 1

En el siguiente ejemplo, se quita el encabezado user-agent de la solicitud:

<AssignMessage name="AM-remove-one-header">
  <Remove>
    <Headers>
      <Header name="user-agent"/>
    </Headers>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

Ejemplo 2

En el siguiente ejemplo, se quitan todos los encabezados de la solicitud:

<AssignMessage name="AM-remove-all-headers">
  <Remove>
    <Headers/>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

Ejemplo 3

Si hay varios encabezados con el mismo nombre, usa la siguiente sintaxis:

<AssignMessage name="AM-remove-headers-3">
  <Remove>
    <Headers>
      <Header name="h1"/>
      <Header name="h2"/>
      <Header name="h3.2"/>
    </Headers>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

En este ejemplo, se quitan h1, h2 y el segundo valor de h3 de la solicitud. Si h3 tiene solo un valor, no se quitará.

<Payload> (secundario de <Remove>)

Determina si <Remove> borra la carga útil en la solicitud o respuesta, que se especifica mediante el elemento <AssignTo>. Configúralo como true para borrar la carga útil; de lo contrario, es false. El valor predeterminado es false.

Valor predeterminado Falso
¿Es obligatorio? Opcional
Tipo Booleano
Elemento principal <Remove>
Elementos secundarios Ninguna

El elemento <Payload> usa la siguiente sintaxis:

Sintaxis

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <!-- Can also be empty to remove everything from the message (<Remove/>) -->
  <Remove>
    <Payload>[false|true]</Payload>
  </Remove>
</AssignMessage>

Ejemplo 1

En el siguiente ejemplo, se configura <Payload> como true para que se borre la carga útil de la solicitud:

<AssignMessage name="AM-remove-payload-1">
  <Remove>
    <Payload>true</Payload>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

<QueryParams> (secundario de <Remove>)

Quita los parámetros de búsqueda especificados de la solicitud. Este elemento no causa ningún efecto en una respuesta.

Valor predeterminado N/A
¿Es obligatorio? Opcional
Tipo Arreglo de elementos <QueryParam> o un arreglo vacío
Elemento principal <Remove>
Elementos secundarios <QueryParam>

El elemento <QueryParams> usa la siguiente sintaxis:

Sintaxis

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <!-- Can also be empty to remove everything from the message (<Remove/>) -->
  <Remove>
    <!-- Remove all query parameters -->
    <QueryParams/>
    <!-- or, remove specific query parameters by name -->
    <QueryParams>
      <QueryParam name="QUERYPARAM_NAME"/>
      <!-- or -->
      <QueryParam name="QUERYPARAM_NAME">[false|true]</QueryParam>
      ...
    </QueryParams>
  </Remove>
</AssignMessage>

Ejemplo 1

En el siguiente ejemplo, se quita un solo parámetro de búsqueda de la solicitud:

<AssignMessage name="AM-remove-queryparams-1">
  <Remove>
      <QueryParams>
        <QueryParam name="qp1"/>
      </QueryParams>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

Ejemplo 2

En el siguiente ejemplo, se quitan todos los parámetros de búsqueda de la solicitud:

<AssignMessage name="AM-remove-queryparams-2">
  <Remove>
      <QueryParams/>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

Ejemplo 3

Si hay varios parámetros de búsqueda con el mismo nombre, usa la siguiente sintaxis:

<AssignMessage name="AM-remove-queryparams-3">
  <Remove>
      <QueryParams>
        <QueryParam name="qp1"/>
        <QueryParam name="qp2"/>
        <QueryParam name="qp3.2"/>
      </QueryParams>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

En este ejemplo, se quitan qp1, qp2 y el segundo valor de qp3 de la solicitud. Si qp3 tiene solo un valor, no se quitará.

Ejemplo 4

En el siguiente ejemplo, se quita el parámetro de búsqueda apikey de la solicitud:

<AssignMessage name="AM-remove-query-param">
  <Remove>
    <QueryParams>
      <QueryParam name="apikey"/>
    </QueryParams>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

Solo puedes usar <QueryParams> cuando se cumplan los siguientes criterios:

  • Verbos HTTP: GET, POST, PATCH, DELETE
  • Tipo de mensaje: solicitud

<Set>

Establece la información en la solicitud o mensaje de respuesta, que se especifica mediante el elemento <AssignTo>. <Set> reemplaza los encabezados o los parámetros de consulta o formulario que ya existen en el mensaje original o agrega nuevos si no existen.

Los encabezados y los parámetros de consulta y formulario en un mensaje HTTP pueden contener varios valores. Para agregar valores adicionales a un encabezado o parámetro, usa el elemento <Add> en su lugar.

Valor predeterminado N/A
¿Es obligatorio? Opcional
Tipo Tipo complejo
Elemento principal <AssignMessage>
Elementos secundarios <FormParams>
<Headers>
<Payload>
<Path>
<QueryParams>
<StatusCode>
<Verb>
<Version>

El elemento <Set> usa la siguiente sintaxis:

Sintaxis

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <Set>
    <FormParams>
      <FormParam name="FORMPARAM_NAME">FORMPARAM_VALUE</FormParam>
      ...
    </FormParams>
    <Headers>
      <Header name="HEADER_NAME">HEADER_VALUE</Header>
      ...
    </Headers>
    <Path>PATH</Path>
    <Payload contentType="CONTENT_TYPE" variablePrefix="PREFIX"
        variableSuffix="SUFFIX">NEW_PAYLOAD</Payload>
    <QueryParams>
      <QueryParam name="QUERYPARAM_NAME">QUERYPARAM_VALUE</QueryParam>
      ...
    </QueryParams>
    <StatusCode>HTTP_STATUS_CODE or {variable}</StatusCode>
    <Verb>[GET|POST|PUT|PATCH|DELETE|{variable}]</Verb>
    <Version>[1.0|1.1|{variable}]</Verb>
  </Set>
</AssignMessage>

Ejemplo 1

En el siguiente ejemplo, se establece un encabezado específico. Cuando se adjunte esta política en el flujo de solicitudes, permitirá que el sistema ascendente reciba un encabezado adicional que no se incluyó en la solicitud de entrada original.

<AssignMessage name="AM-Set-Header">
  <Set>
    <Headers>
        <Header name="authenticated-developer">{verifyapikey.VAK-1.developer.id}</Header>
    </Headers>
  </Set>
  <AssignTo>request</AssignTo>
</AssignMessage>

Ejemplo 2

En el siguiente ejemplo, se reemplaza la carga útil de una respuesta, así como el encabezado Content-Type.

<AssignMessage name="AM-Overwrite-Payload">
  <Set>
    <Payload contentType="application/json">{ "status" : 42 }</Payload>
  </Set>
  <AssignTo>response</AssignTo>
</AssignMessage>

<FormParams> (secundario de <Set>)

Reemplaza los parámetros de formulario existentes en una solicitud y los reemplaza por los nuevos valores que especificas con este elemento. Este elemento no tiene efecto en una respuesta.

Valor predeterminado N/A
¿Es obligatorio? Opcional
Tipo Arreglo de elementos <FormParam>
Elemento principal <Set>
Elementos secundarios <FormParam>

El elemento <FormParams> usa la siguiente sintaxis:

Sintaxis

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <Set>
    <FormParams>
      <FormParam name="FORMPARAM_NAME">FORMPARAM_VALUE</FormParam>
      ...
    </FormParams>
  </Set>
</AssignMessage>

Ejemplo 1

En el siguiente ejemplo, se configura un parámetro de formulario llamado myparam para el valor de la variable request.header.myparam en una nueva solicitud personalizada:

<AssignMessage name="AM-set-formparams-1">
  <Set>
    <FormParams>
      <FormParam name="myparam">{request.header.myparam}</FormParam>
    </FormParams>
  </Set>
  <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo>
</AssignMessage>

Solo puedes usar <FormParams> cuando se cumplan los siguientes criterios:

  • Verbo HTTP POST
  • Tipo de mensaje: solicitud

Si defines parámetros de formulario vacíos en tu política (<Add><FormParams/></Add>), la política no agregará ningún parámetro de formulario. Esto es lo mismo que omitir <FormParams>.

<Set> cambia el Content-Type del mensaje a application/x-www-form-urlencoded antes de enviarlo al extremo de destino.

<Headers> (secundario de <Set>)

Reemplaza los encabezados HTTP existentes en la solicitud o respuesta, que se especifica mediante el elemento <AssignTo>.

Valor predeterminado N/A
¿Es obligatorio? Opcional
Tipo Arreglo de elementos <Header>
Elemento principal <Set>
Elementos secundarios <Header>

El elemento <Headers> usa la siguiente sintaxis:

Sintaxis

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <Set>
    <Headers>
      <Header name="HEADER_NAME">HEADER_VALUE</Header>
      ...
    </Headers>
  </Set>
</AssignMessage>

Ejemplo 1

En el siguiente ejemplo, se establece el encabezado x-ratelimit-remaining en el valor de la variable ratelimit.Quota-1.available.count:

<AssignMessage name="AM-Set-RateLimit-Header">
  <Set>
    <Headers>
      <Header name="X-RateLimit-Remaining">{ratelimit.Quota-1.available.count}</Header>
    </Headers>
  </Set>
  <AssignTo>response</AssignTo>
</AssignMessage>

Si defines encabezados vacíos en tu política (<Set><Headers/></Set>), la política no agregará encabezados. Esto tendrá el mismo efecto que omitir <Headers>.

<Path> (secundario de <Set>)

<Payload> (secundario de <Set>)

Define el cuerpo del mensaje de una solicitud o respuesta, que se especifica mediante el elemento <AssignTo>. La carga útil puede ser cualquier tipo de contenido válido, como texto sin formato, JSON o XML.

Valor predeterminado (string vacía)
¿Es obligatorio? Opcional
Tipo String
Elemento principal <Set>
Elementos secundarios Ninguna

El elemento <Payload> usa la siguiente sintaxis:

Sintaxis

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <Set>
    <Payload contentType="CONTENT_TYPE" variablePrefix="PREFIX"
        variableSuffix="SUFFIX">NEW_PAYLOAD</Payload>
  </Set>
</AssignMessage>

Ejemplo 1

En el siguiente ejemplo, se configura una carga útil de texto sin formato:

<AssignMessage name="set-payload-1">
  <Set>
    <Payload contentType="text/plain">42</Payload>
  </Set>
</AssignMessage>

Ejemplo 2

En el siguiente ejemplo, se configura una carga útil de JSON:

<AssignMessage name="set-payload-2">
  <Set>
    <Payload contentType="application/json">
      {"name":"foo", "type":"bar"}
    </Payload>
  </Set>
</AssignMessage>

Ejemplo 3

En el siguiente ejemplo, se insertan valores de variable en la carga útil mediante la inserción de nombres de variables entre llaves:

<AssignMessage name="set-payload-3">
  <Set>
    <Payload contentType="application/json">
      {"name":"foo", "type":"{variable_name}"}
    </Payload>
  </Set>
</AssignMessage>

En las versiones anteriores de Apigee, por ejemplo, antes de la versión 16.08.17 en la nube, no podías usar llaves para indicar referencias variables en cargas útiles JSON. En esas versiones, necesitabas usar los atributos variablePrefix y variableSuffix para especificar los caracteres delimitadores y usarlos a fin de encerrar los nombres de las variables de la siguiente manera:

<AssignMessage name="set-payload-3b">
  <Set>
    <Payload contentType="application/json" variablePrefix="@" variableSuffix="#">
      {"name":"foo", "type":"@variable_name#"}
    </Payload>
  </Set>
</AssignMessage>

Esta sintaxis anterior sigue funcionando.

Ejemplo 4

El contenido de <Payload> se considera una plantilla de mensaje. Esto significa que la política AssignMessage reemplaza las variables entre llaves con el valor de las variables a las que se hace referencia en el entorno de ejecución.

En el siguiente ejemplo, se usa la sintaxis de llaves para configurar parte de la carga útil en un valor de variable:

<AssignMessage name="set-payload-4">
  <Set>
    <Payload contentType="text/xml">
      <root>
        <e1>sunday</e1>
        <e2>funday</e2>
        <e3>{var1}</e3>
      </root>
    </Payload>
  </Set>
</AssignMessage>

En la siguiente tabla, se describen los atributos de <Payload>:

Atributo Descripción Presencia Tipo
contentType

Si se especifica, el valor de contentType se asigna al encabezado HTTP Content-Type.

Opcional String
variablePrefix Especifica de manera opcional el delimitador principal en una variable de flujo. La configuración predeterminada es “{”. Para obtener más información, consulta Referencia de variables de flujo. Opcional Caracteres
variableSuffix De manera opcional, especifica el delimitador final en una variable de flujo. La configuración predeterminada es "}". Para obtener más información, consulta Referencia de variables de flujo. Opcional Caracteres

<QueryParams> (secundario de <Set>)

Reemplaza los parámetros de búsqueda existentes en la solicitud con valores nuevos. Este elemento no causa ningún efecto en una respuesta.

Valor predeterminado N/A
¿Es obligatorio? Opcional
Tipo Arreglo de elementos <QueryParam>
Elemento principal <Set>
Elementos secundarios <QueryParam>

El elemento <QueryParams> usa la siguiente sintaxis:

Sintaxis

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <Set>
    <QueryParams>
      <QueryParam name="QUERYPARAM_NAME">QUERYPARAM_VALUE</QueryParam>
      ...
    </QueryParams>
  </Set>
</AssignMessage>

Ejemplo 1

En el siguiente ejemplo, se establece el parámetro de búsqueda address en el valor de la variable request.header.address:

<AssignMessage name="AM-set-queryparams-1">
  <Set>
    <QueryParams>
      <QueryParam name="address">{request.header.address}</QueryParam>
    </QueryParams>
  </Set>
</AssignMessage>

Solo puedes usar <QueryParams> cuando se cumplan los siguientes criterios:

  • Verbos HTTP: GET, POST, PATCH, DELETE
  • Tipo de mensaje: solicitud

Si defines parámetros de búsqueda vacíos en tu política (<Set><QueryParams/></Set>), la política no establece ningún parámetro de consulta. Esto es lo mismo que omitir <QueryParams>.

<StatusCode> (secundario de <Set>)

Establece el código de estado en la respuesta. Este elemento no causa ningún efecto en una solicitud.

Valor predeterminado “200” (cuando el atributo createNew de <AssignTo> se configura como “true”)
¿Es obligatorio? Opcional
Tipo String o VARIABLE
Elemento principal <Set>
Elementos secundarios Ninguna

El elemento <StatusCode> usa la siguiente sintaxis:

Sintaxis

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <Set>
    <StatusCode>HTTP_STATUS_CODE or {variable}</StatusCode>
  </Set>
</AssignMessage>

Ejemplo 1

En el siguiente ejemplo, se configura un código de estado simple:

<AssignMessage name="AM-set-statuscode-404">
  <Set>
    <StatusCode>404</StatusCode>
  </Set>
  <AssignTo>response</AssignTo>
</AssignMessage>

Ejemplo 2

El contenido de <StatusCode> se considera una plantilla de mensaje. Esto significa que un nombre de variable entre llaves se reemplazará en el entorno de ejecución por el valor de la variable a la que se hace referencia, como se muestra en el siguiente ejemplo:

<AssignMessage name="set-statuscode-2">
  <Set>
    <StatusCode>{calloutresponse.status.code}</StatusCode>
  </Set>
  <AssignTo>response</AssignTo>
</AssignMessage>

Solo puedes usar <StatusCode> cuando se cumplan los siguientes criterios:

  • Tipo de mensaje: Respuesta

<Verb> (secundario de <Set>)

Establece el verbo HTTP en la solicitud. Este elemento no tiene efecto en una respuesta.

Valor predeterminado N/A
¿Es obligatorio? Opcional
Tipo String o VARIABLE
Elemento principal <Set>
Elementos secundarios Ninguna

El elemento <Verb> usa la siguiente sintaxis:

Sintaxis

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <Set>
    <Verb>[GET|POST|PUT|PATCH|DELETE|{variable}]</Verb>
  </Set>
</AssignMessage>

Ejemplo 1

En el siguiente ejemplo, se configura un verbo simple en la solicitud:

<AssignMessage name="AM-set-verb-1">
  <Set>
    <Verb>POST</Verb>
  </Set>
  <AssignTo>request</AssignTo>
</AssignMessage>

Ejemplo 2

El contenido de <Verb> se considera una plantilla de mensaje. Esto significa que un nombre de variable entre llaves se reemplazará en el entorno de ejecución por el valor de la variable a la que se hace referencia.

En el siguiente ejemplo, se usa una variable para propagar un verbo:

<AssignMessage name="AM-set-verb-to-dynamic-value">
  <Set>
    <Verb>{my_variable}</Verb>
  </Set>
  <AssignTo>request</AssignTo>
</AssignMessage>

Solo puedes usar <Verb> cuando se cumplan los siguientes criterios:

  • Tipo de mensaje: solicitud

<Version> (secundario de <Set>)

Establece la versión HTTP en una solicitud. Este elemento no tiene efecto en una respuesta.

Valor predeterminado N/A
¿Es obligatorio? Opcional
Tipo String o VARIABLE
Elemento principal <Set>
Elementos secundarios Ninguna

El elemento <Version> usa la siguiente sintaxis:

Sintaxis

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <Set>
    <Version>[1.0|1.1|{variable}]</Verb>
  </Set>
</AssignMessage>

Ejemplo 1

En el siguiente ejemplo, se establece el número de versión en 1.1:

<AssignMessage name="AM-set-version-1">
  <Set>
    <Version>1.1</Version>
  </Set>
 </AssignMessage>

Ejemplo 2

El siguiente comando usa una variable entre llaves para establecer el número de versión:

<AssignMessage name="AM-set-version-2">
  <Set>
    <Version>{my_version}</Version>
  </Set>
  <AssignTo>request</AssignTo>
</AssignMessage>

El contenido de <Version> se considera una plantilla de mensaje. Esto significa que un nombre de variable entre llaves se reemplazará en el entorno de ejecución por el valor de la variable a la que se hace referencia.

Solo puedes usar <Version> cuando se cumplan los siguientes criterios:

  • Tipo de mensaje: solicitud

Crea mensajes de solicitud personalizados

Puedes usar AssignMessage para crear un mensaje de solicitud personalizado. Después de crear una solicitud personalizada, puedes usarla de las maneras siguientes:

  • Accede a sus variables en otras políticas
  • Pásalo a un servicio externo

Para crear un mensaje de solicitud personalizado, usa el elemento <AssignTo> en tu política de AssignMessage. Configura createNew como true y especifica el nombre del mensaje nuevo en el cuerpo del elemento, como se muestra en el siguiente ejemplo:

<AssignMessage name="assignto-2">
  <AssignTo createNew="true" transport="http" type="request">MyRequestObject</AssignTo>
  ...
</AssignMessage>

Según la configuración predeterminada, Apigee no hace nada con el mensaje de solicitud personalizado. Después de crearla, Apigee pasará a través del flujo con la solicitud original. Para usar la solicitud personalizada, agrega una política como la política ServiceCallout a tu proxy y haz referencia de forma explícita al mensaje de solicitud recién creado en la configuración de esa política. Esto te permitirá pasar la solicitud personalizada a un extremo de servicio externo.

En los siguientes ejemplos, se crean mensajes de solicitud personalizados:

Ejemplo 1

En el siguiente ejemplo, se crea un objeto de solicitud personalizado con AssignMessage:

<AssignMessage name="AssignMessage-3">
  <AssignTo createNew="true" type="request">MyCustomRequest</AssignTo>
  <Copy>
    <Headers>
      <Header name="user-agent"/>
    </Headers>
  </Copy>
  <Set>
    <QueryParams>
      <QueryParam name="address">{request.queryparam.addy}</QueryParam>
    </QueryParams>
    <Verb>GET</Verb>
  </Set>
  <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
</AssignMessage>

En este ejemplo, se dan las siguientes situaciones:

  • Crea un nuevo objeto de mensaje de solicitud llamado MyCustomRequest.
  • En MyCustomRequest, esta política:
    • Copia el valor del encabezado HTTP user-agent de la solicitud entrante al mensaje nuevo. Debido a que <Copy> no especifica el atributo source, Apigee usará el mensaje request como fuente para copiar desde.
    • Configura el parámetro de búsqueda address en el mensaje personalizado con el valor del parámetro de búsqueda addy de la solicitud entrante.
    • Establece el verbo HTTP como GET.
  • Establece <IgnoreUnresolvedVariables> en false. Cuando <IgnoreUnresolvedVariables> es false, si una de las variables a las que se hace referencia en la configuración de la política no existe, Apigee ingresará un estado de falla en el flujo de la API.

Ejemplo 2

A continuación, se muestra otro ejemplo que muestra cómo crear un objeto de solicitud personalizado con AssignMessage:

<AssignMessage name="AssignMessage-2">
  <AssignTo createNew="true" type="request">partner.request</AssignTo>
  <Set>
    <Verb>POST</Verb>
    <Payload contentType="text/xml">
      <request><operation>105</operation></request>
    </Payload>
  </Set>
</AssignMessage>

En este ejemplo, se crea una solicitud personalizada nueva llamada partner.request. Luego, configura <Verb> y <Payload> en la solicitud nueva.

Puedes acceder a las diversas propiedades de un mensaje personalizado en otra política de AssignMessage que se produzca más adelante en el flujo. En el siguiente ejemplo, se obtiene el valor de un encabezado de una respuesta personalizada con nombre y se coloca en un encabezado nuevo en el mensaje de solicitud:

<AssignMessage name="AM-Copy-Custom-Header">
  <AssignTo>request</AssignTo>
  <Set>
    <Headers>
      <Header name="injected-approval-id">{MyCalloutResponse.header.approval-id}</Header>
    </Headers>
  </Set>
</AssignMessage>

Códigos de error

En esta sección, se describen los códigos de falla y los mensajes de error que se muestran, y las variables de falla que establece Apigee cuando esta política activa un error. Esta información es importante para saber si estás desarrollando reglas de fallas con el propósito de manejar fallas. Para obtener más información, consulta Qué debes saber sobre los errores de políticas y Cómo solucionar fallas.

Errores de entorno de ejecución

Estos errores pueden producirse cuando se ejecuta la política.

Código de falla Estado de HTTP Causa Corregir
steps.assignmessage.SetVariableFailed 500 La política no pudo establecer una variable. Consulta la string con error para el nombre de la variable sin resolver.
steps.assignmessage.VariableOfNonMsgType 500

Este error ocurre si el atributo source del elemento <Copy> se configuró como una variable que no es del tipo message.

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

steps.assignmessage.UnresolvedVariable 500

Este error se produce si una variable especificada en la política AssignMessage es una de las siguientes:

  • Está fuera del alcance (no está disponible en el flujo específico en el que se ejecuta la política) o
  • o
  • No se puede resolver (no está definida)

Errores en la implementación

Estos errores pueden generarse cuando implementas un proxy que contiene esta política.

Nombre del error Causa Corregir
InvalidIndex Si el índice especificado en los elementos <Copy> o <Remove> de la política AssignMessage es 0 o un número negativo, fallará la implementación del proxy de API.
InvalidVariableName Si el elemento secundario <Name> está vacío o no se especificó en el elemento <AssignVariable>, la implementación del proxy de API fallará porque no hay un nombre de variable válido al que asignarle un valor. Se requiere un nombre de variable válido.
InvalidPayload Una carga útil especificada en la política no es válida.

Variables con fallas

Estas variables se configuran cuando esta política activa un error en el entorno de ejecución. Para obtener más información, consulta Qué debes saber sobre los errores de la política.

Variables Donde Ejemplo
fault.name="FAULT_NAME" FAULT_NAME es el nombre de la falla, como se indica en la tabla de Errores del entorno de ejecución anterior. El nombre de la falla es la última parte del código de la falla. fault.name Matches "UnresolvedVariable"
assignmessage.POLICY_NAME.failed POLICY_NAME es el nombre especificado por el usuario de la política que generó la falla. assignmessage.AM-SetResponse.failed = true

Ejemplo de respuesta de error

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

Ejemplo de regla de falla

<FaultRule name="Assign Message Faults">
    <Step>
        <Name>AM-CustomNonMessageTypeErrorResponse</Name>
        <Condition>(fault.name Matches "VariableOfNonMsgType") </Condition>
    </Step>
    <Step>
        <Name>AM-CustomSetVariableErrorResponse</Name>
        <Condition>(fault.name = "SetVariableFailed")</Condition>
    </Step>
    <Condition>(assignmessage.failed = true) </Condition>
</FaultRule>

Esquemas

Un esquema XML (.xsd) define cada tipo de política. Como referencia, los esquemas de políticas están disponibles en GitHub.

Temas relacionados

En las muestras de la plataforma de API, están disponibles ejemplos de cómo trabajar de la política AssignMessage.

Para ver un ejemplo más avanzado de cómo anular target.url del ProxyEndpoint consulta este artículo de la comunidad de Apigee.

Para ver una ruta de acceso en acción en una política ServiceCallout, consulta este ejemplo de cómo hacerlo en las muestras de GitHub de Apigee. Solo clona el repositorio y sigue las instrucciones en ese tema. En el ejemplo, se usa AssignMessage para establecer una ruta de solicitud y, luego, se usa una política ServiceCallout a fin de realizar la solicitud en un servicio externo.