Esta página se aplica a Apigee y Apigee Hybrid.
Consulta la documentación de
Apigee Edge.
Qué
La política AssignMessage puede cambiar un mensaje de solicitud o respuesta que ya exista, o crear un mensaje de solicitud o respuesta durante el flujo del proxy de API. La política te permite realizar las siguientes acciones con esos mensajes:
- Añadir nuevos parámetros de formulario, encabezados o parámetros de consulta a un mensaje
- Copiar propiedades de un mensaje a otro
- Quitar encabezados, parámetros de consulta, parámetros de formulario y cargas útiles de mensajes
- Definir el valor de las propiedades de un mensaje
AssignMessage también te permite definir variables de contexto arbitrarias, independientemente de las operaciones anteriores que se puedan aplicar a un mensaje.
Con AssignMessage, puedes añadir, cambiar o quitar propiedades de la solicitud o de la respuesta. También puede usar AssignMessage para crear un mensaje de solicitud o de respuesta personalizado y enviarlo a un destino alternativo, tal como se describe en Crear mensajes de solicitud personalizados.
Esta política es una política extensible y su uso puede tener implicaciones en cuanto a costes o utilización, en función de tu licencia de Apigee. Para obtener información sobre los tipos de políticas y las implicaciones de uso, consulta Tipos de políticas.
La política AssignMessage puede crear o cambiar variables de flujo con los siguientes elementos secundarios:
Es importante el orden en el que organices los elementos <Add>
, <Copy>
, <Set>
y <Remove>
. La política ejecuta esas acciones en el orden en el que aparecen en la configuración de la política. Si necesitas quitar todos los encabezados y, a continuación, definir un encabezado específico, debes incluir el elemento <Remove>
antes del elemento <Set>
.
Elemento <AssignMessage>
Define una política AssignMessage.
Valor predeterminado | Consulta la pestaña Política predeterminada que aparece más abajo. |
¿Es obligatorio? | Obligatorio |
Tipo | Objeto complejo |
Elemento principal | N/A |
Elementos secundarios |
<Add> <AssignTo> <AssignVariable> <Copy> <DisplayName> <IgnoreUnresolvedVariables> <Remove> <Set> |
El elemento <AssignMessage>
utiliza la siguiente sintaxis:
Sintaxis
El elemento <AssignMessage>
utiliza 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> <Authentication> <HeaderName>HEADER_NAME</HeaderName> <!-- Use either GoogleAccessToken or GoogleIDToken --> <GoogleAccessToken> <Scopes> <Scope>SCOPE</Scope> ... </Scopes> </GoogleAccessToken> ----- or ----- <GoogleIDToken> <Audience ref='FLOW_VARIABLE_NAME>TARGET_URL</Scope> </GoogleAccessToken> </Authentication> <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 muestran los ajustes predeterminados al añadir una política AssignMessage a tu flujo en la interfaz de Apigee. Probablemente nunca quieras que se muestren todos los elementos de configuración que se indican aquí.
<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 política AssignMessage en la interfaz de usuario de Apigee, la plantilla contiene stubs para todas las operaciones posibles. Normalmente, se seleccionan las operaciones que se quieren realizar con esta política y se eliminan el resto de los elementos secundarios. Por ejemplo, si quieres 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 | Predeterminado | ¿Es obligatorio? | Descripción |
---|---|---|---|
name |
N/A | Obligatorio |
El nombre interno de la política. El valor del atributo Opcionalmente, usa el elemento |
continueOnError |
falso | Opcional | Asigna el valor false para devolver un error cuando falle una política. Este es el comportamiento esperado de la mayoría de las políticas. Asigna el valor true para que la ejecución del flujo continúe incluso después de que falle una política. Consulta también:
|
enabled |
true | Opcional | Asigna el valor true para aplicar la política. Selecciona false para desactivar la política. La política no se aplicará aunque siga adjunta a un flujo. |
async |
falso | Obsoleto | Este atributo está obsoleto. |
En la siguiente tabla se ofrece una descripción general de los elementos secundarios de <AssignMessage>
:
Elemento secundario | ¿Es obligatorio? | Descripción |
---|---|---|
Operaciones comunes | ||
<Add> |
Opcional | Añade información al objeto de mensaje especificado por el elemento <AssignTo> .
Para sobrescribir los encabezados o parámetros, usa el elemento |
<Copy> |
Opcional | Copia información del mensaje especificado por el atributo source al objeto de mensaje especificado por el elemento <AssignTo> . |
<Remove> |
Opcional | Elimina los elementos especificados de la variable de mensaje indicada en el elemento <AssignTo> . |
<Set> |
Opcional | Sustituye los valores de las propiedades de la solicitud o la respuesta, que se especifican mediante el elemento <AssignTo> .
|
Otros elementos secundarios | ||
<AssignTo> |
Opcional | Especifica en qué mensaje opera la política AssignMessage. Puede ser la solicitud o la respuesta estándar, o bien un mensaje personalizado. |
<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 secciones que aparecen a continuación.
Ejemplos
En los siguientes ejemplos se muestran algunas de las formas en las que puedes usar la política AssignMessage:
1: Añadir encabezado
En el siguiente ejemplo se añade 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: Elimina la carga útil
En el siguiente ejemplo se elimina 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: Modificar respuesta
En el siguiente ejemplo se modifica un objeto de respuesta añadiéndole 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, modifica un mensaje de respuesta añadiendo un encabezado HTTP.
Como en este ejemplo se especifica response
como nombre de variable en el elemento <AssignTo>
, esta política modifica el objeto de respuesta que se había definido originalmente con los datos devueltos por el servidor de destino.
El encabezado HTTP que añade esta política al mensaje de respuesta se deriva de una variable rellenada por la política LookupCache. Por lo tanto, el mensaje de respuesta modificado por esta política Assign Message contiene un encabezado HTTP que indica si los resultados se han extraído de la caché o no. Definir encabezados en la respuesta puede ser útil para depurar y solucionar problemas.
4: Define el contenido dinámico
Puedes usar AssignMessage para insertar contenido dinámico en la carga útil de los mensajes de respuesta y de solicitud.
Para insertar variables de flujo en una carga útil XML, incluya la variable designada entre llaves, como en este ejemplo: {prefix.name}
.
En el siguiente ejemplo se inserta 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>
En el caso de las cargas útiles JSON, puede insertar variables mediante los atributos variablePrefix
y variableSuffix
con caracteres delimitadores, como se muestra en el siguiente ejemplo:
<AssignMessage name="AM-set-payload"> <Payload contentType="application/json" variablePrefix="@" variableSuffix="#"> { "user-agent": "@request.header.user-agent#" } </Payload> </AssignMessage>
Para ver una lista completa de las variables de flujo, consulta la referencia de variables de flujo.
También puedes usar llaves para insertar variables.
5: Quitar parámetro de consulta
En el ejemplo siguiente, se elimina el parámetro de consulta apikey
de la solicitud:
<AssignMessage name="AM-remove-query-param"> <Remove> <QueryParams> <QueryParam name="apikey"/> </QueryParams> </Remove> <AssignTo>request</AssignTo> </AssignMessage>
Se recomienda eliminar el parámetro de consulta apikey
del mensaje de solicitud cuando se usa la política VerifyAPIKey para la autenticación de usuarios. De esta forma, se evita que se transfiera información sensible de la clave al backend de destino.
6: Definir o obtener variables
En el siguiente ejemplo se usan tres políticas AssignMessage:
- Crea tres variables de flujo en la solicitud con valores estáticos.
- Obtiene las variables de flujo de forma dinámica en una segunda política del flujo de solicitud
- Los define 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 define 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 nuevas variables. Si no se puede acceder a la variable a la que hace referencia el elemento <Ref>
, puede usar el valor especificado por el elemento <Value>
.
Para probar este conjunto de políticas, haz lo siguiente:
- Añade las políticas 1 y 2 al flujo de solicitud. Asegúrate de poner la política 1 antes que la política 2.
- Añade la tercera política en el flujo de respuesta.
- La tercera política usa el elemento
<Set>
para añadir las variables a la respuesta. En el siguiente ejemplo se crea una carga útil XML en la respuesta que Edge devuelve 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>
consiste en envolverlas entre llaves.Asegúrate de asignar el valor
application/xml
al atributocontentType
del elemento<Payload>
. - Envía una solicitud a tu proxy de API. Por ejemplo:
curl -vL https://ahamilton-eval-test.apigee.net/myproxy
También puedes canalizar los resultados a través de una utilidad como
xmllint
para que el XML se muestre en una estructura con un formato adecuado:curl -vL https://ahamilton-eval-test.apigee.net/myproxy | xmllint --format -
El cuerpo de la respuesta debería tener este aspecto:
42 test gopher
7: Obtener encabezados de respuesta de ServiceCallout
En el siguiente ejemplo, supongamos que hay una política ServiceCallout en la solicitud del proxy de API y que la respuesta de la llamada contiene varios encabezados con el mismo nombre (Set-Cookie
). Si la variable de respuesta de Service Callout es la predeterminada calloutResponse
, la siguiente política obtiene el segundo valor del 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 obtener una lista con todos los valores de encabezado, utilice la siguiente variable:
{calloutResponse.header.Set-Cookie.values}
8: Almacenar y eliminar parámetros de formulario, encabezados y parámetros de consulta
Si quiere usar <Remove>
para eliminar los encabezados, los parámetros de consulta o los parámetros de formulario, pero
conservar el acceso a sus valores más adelante en el flujo de la política, puede 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 de esta referencia tiene ejemplos adicionales. Para ver más ejemplos, consulta el ejemplo de AssignMessage en GitHub.
Referencia de elemento secundario
En esta sección se describen los elementos secundarios de <AssignMessage>
.
<Add>
Añade información a la solicitud o a la respuesta, que se especifica en el elemento <AssignTo>
.
El elemento <Add>
añade propiedades al mensaje que no existen en el mensaje original. Ten en cuenta que <Set>
también ofrece esta función. Para cambiar los valores de las propiedades existentes, use el elemento <Set>
.
Valor predeterminado | N/A |
¿Es obligatorio? | Opcional |
Tipo | Tipo complejo |
Elemento principal |
<AssignMessage>
|
Elementos secundarios |
<FormParams> <Headers> <QueryParams> |
El elemento <Add>
utiliza 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 siguiente ejemplo se modifica el mensaje de solicitud. Para ello, se obtienen los valores de tres parámetros de cadena de consulta de la solicitud inicial y se definen como parámetros de formulario en la solicitud del endpoint de destino. Por último, se eliminan todos los parámetros de cadena de consulta originales:
<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 añadir un encabezado partner-id
a la solicitud que se enviará al endpoint 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 añadir un único parámetro de consulta 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 preflujo de la solicitud. Si consulta los resultados en una herramienta como la Descripción general de la 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 sustitución dinámica de cadenas, conocida como plantillas de mensajes.
<FormParams>
(hijo de <Add>
)
Añade nuevos parámetros de formulario al mensaje de solicitud. Este elemento no tiene ningún efecto en un mensaje de respuesta.
Valor predeterminado | N/A |
¿Es obligatorio? | Opcional |
Tipo | Matriz de elementos <FormParam> |
Elemento principal |
<Add>
|
Elementos secundarios |
<FormParam> |
El elemento <FormParams>
utiliza 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 añade un 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
, se añade a la solicitud como parámetro de formulario y, a continuación, se elimina 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 ningún objetivo con <AssignTo>
. Esta política solo añade el parámetro
a la solicitud.
Ejemplo 3
En el siguiente ejemplo se añaden 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 cadena de consulta de la solicitud original y se añaden como parámetros de formulario con nombres diferentes. Después, elimina los parámetros de consulta originales. Apigee enviará la solicitud modificada al endpoint de destino.
Puedes usar la vista general de depuración para ver el flujo. Verás que el cuerpo de la solicitud contiene los datos del formulario codificados en la URL, que originalmente se transfirieron como parámetros de cadena de consulta:
username=nick&zip_code=90210&default_language=en
Puedes usar <FormParams>
solo si se cumplen los siguientes criterios:
- Verbo HTTP: POST
- Tipo de mensaje: solicitud
- Una (o ambas) de las siguientes opciones:
- Datos de formulario: se asigna un valor o "" (la cadena vacía). Por ejemplo, con
curl
, añade-d ""
a tu solicitud. - Encabezado
Content-Length
: se define como 0 (si no hay datos en la solicitud original; de lo contrario, la longitud actual, en bytes). Por ejemplo, concurl
añade-H "Content-Length: 0"
a tu solicitud.
- Datos de formulario: se asigna un valor o "" (la cadena vacía). Por ejemplo, con
Por ejemplo:
curl -vL -X POST -d "" -H "Content-Type: application/x-www-form-urlencoded" https://ahamilton-eval-test.apigee.net/am-test
Cuando añades <FormParams>
, Apigee asigna el valor application/x-www-form-urlencoded
a la cabecera Content-Type
de la solicitud antes de enviar el mensaje al servicio de destino.
<Headers>
(hijo de <Add>
)
Añade nuevos encabezados a la solicitud o respuesta especificada, que se indica mediante el elemento <AssignTo>
.
Valor predeterminado | N/A |
¿Es obligatorio? | Opcional |
Tipo | Matriz de elementos <Header> |
Elemento principal |
<Add>
|
Elementos secundarios |
<Header> |
El elemento <Headers>
utiliza 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 añade un 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>
(hijo de <Add>
)
Añade nuevos parámetros de consulta a la solicitud. Este elemento no tiene ningún efecto en una respuesta.
Valor predeterminado | N/A |
¿Es obligatorio? | Opcional |
Tipo | Matriz de elementos <QueryParam> |
Elemento principal |
<Add>
|
Elementos secundarios |
<QueryParam> |
El elemento <QueryParams>
utiliza 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 ejemplo siguiente, se añade el parámetro de consulta 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>
Puedes usar <QueryParams>
solo si se cumplen los siguientes criterios:
- Verbos HTTP:
GET
,POST
,PATCH
yDELETE
- Tipo de mensaje: solicitud
Además, solo puede definir parámetros de consulta cuando el atributo type
del elemento <AssignTo>
sea un mensaje de solicitud. Definirlos en la respuesta no tiene ningún efecto.
Si define una matriz vacía de parámetros de consulta en su política (<Add><QueryParams/></Add>
), la política no añade ningún parámetro de consulta. Es lo mismo que omitir <QueryParams>
.
<AssignTo>
Determina en qué objeto opera la política AssignMessage. Las opciones disponibles son:
- Mensaje de solicitud: el
request
recibido por el proxy de API - Mensaje de respuesta: el
response
devuelto por 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 sobre el que actúa la política AssignMessage.
Por ejemplo, no puede usar <Add>
ni <Set>
para añadir o cambiar parámetros de consulta (<QueryParams>
) o parámetros de formulario (<FormParams>
) en la respuesta. Solo puede manipular los parámetros de consulta y los parámetros de formulario en la solicitud.
Valor predeterminado | N/A |
¿Es obligatorio? | Opcional |
Tipo | Cadena |
Elemento principal |
<AssignMessage>
|
Elementos secundarios | Ninguno |
Si no especifica <AssignTo>
o si especifica el elemento <AssignTo>
, pero no especifica un valor de texto para el elemento, la política se aplica a la solicitud o respuesta predeterminada, que se basa en el lugar donde se ejecuta la política. Si la política se ejecuta en el flujo de solicitudes, afecta al mensaje de solicitud. Si se ejecuta en el flujo de respuesta, la política afecta a la respuesta de forma predeterminada.
El elemento <AssignTo>
utiliza 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 del <AssignTo>
. Esto implica que la política actuará sobre el mensaje request
o response
, en función de dónde se ejecute.
<AssignMessage name="assignto-1"> <AssignTo createNew="false" transport="http" type="request"/> <!-- no-op --> ... </AssignMessage>
Si especifica createNew="false"
y no proporciona explícitamente un nombre de mensaje, los demás atributos de <AssignTo>
no serán relevantes. En ese caso, puede que te interese omitir por completo el elemento <AssignTo>
.
Ejemplo 2
En el siguiente ejemplo se crea un objeto de solicitud y se sobrescribe el objeto anterior:
<AssignMessage name="assignto-2"> <AssignTo createNew="true" transport="http" type="request"/> ... </AssignMessage>
Cuando creas un objeto de solicitud o respuesta, los demás elementos de la política AssignMessage (como <Add>
, <Set>
y <Copy>
) actúan sobre ese nuevo objeto de solicitud o respuesta.
Puedes acceder al nuevo objeto de solicitud en otras políticas más adelante en el flujo o enviar el nuevo objeto de solicitud a un servicio externo con una política ServiceCallout.
Ejemplo 3
En el siguiente ejemplo se crea un objeto de solicitud llamado MyRequestObject
:
<AssignMessage name="assignto-2"> <AssignTo createNew="true" transport="http" type="request">MyRequestObject</AssignTo> ... </AssignMessage>
Cuando creas un objeto de solicitud o de respuesta, los demás elementos de la política AssignMessage (como <Add>
, <Set>
y <Copy>
) actúan sobre ese nuevo objeto de solicitud.
Puedes acceder al nuevo objeto de solicitud por su nombre en otras políticas más adelante en el flujo o enviar el nuevo objeto de solicitud 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 al asignar valores. Si Si
Si no se especifica
|
Opcional | Booleano |
transport |
Especifica el tipo de transporte del tipo de mensaje de solicitud o respuesta. El valor predeterminado es |
Opcional | Cadena |
type |
Especifica el tipo del nuevo mensaje cuando createNew es true . Los valores válidos son request y response .
El valor predeterminado es |
Opcional | Cadena |
<AssignVariable>
Asigna un valor a una variable de flujo de destino (por ejemplo, una variable cuyo valor se define mediante la política AssignMessage). Si la variable de flujo no existe, <AssignVariable>
la crea. Puede usar varios elementos AssignVariable en la política AssignMessage. Se ejecutan en el orden en el que aparecen 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:
- Cadena literal: usa el elemento secundario
<Value>
para especificar un valor de cadena literal para la variable de flujo de destino. - Variable de flujo: usa el elemento secundario
<Ref>
para especificar el valor de una variable de flujo que ya exista en la variable de flujo de destino. Para ver 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 obtener el valor de un par nombre/clave de conjunto de propiedades y almacenarlo en una variable de flujo. Te permite acceder a conjuntos de propiedades de forma dinámica. - URL del recurso: usa el elemento secundario
<ResourceURL>
para especificar una URL de un recurso de texto de tipo XSL, XSD, WSDL, JavaScript o especificación de OpenAPI. De esta forma, se 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 mensaje para la variable de flujo de destino.
El orden de precedencia de estos elementos secundarios es el siguiente: ResourceURL, Template, Ref, Value y PropertySetRef.
El elemento <AssignVariable>
utiliza 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>
, tendrá prioridad sobre los elementos hermanos <Ref>
y <Value>
.
Ejemplo 1
En el siguiente ejemplo se asigna el valor literal 42
a una nueva variable, myvar
:
<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 consulta 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 falla alguna de las asignaciones, 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 cadena 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 propagación del sufijo de ruta de la solicitud proxy a la solicitud de destino:
<AssignMessage name='AM-PathSuffixFalse'> <AssignVariable> <Name>target.copy.pathsuffix</Name> <Value>false</Value> </AssignVariable> </AssignMessage>
Un uso habitual de <AssignVariable>
es definir un valor predeterminado para un parámetro de consulta, un encabezado u otro valor que se pueda incluir en la solicitud. Para ello, combina los elementos secundarios <Ref>
y <Value>
. Para obtener más información, consulta los ejemplos de <Ref>
.
<Name>
(hijo de <AssignVariable>
)
Especifica el nombre de la variable de flujo de destino, es decir, la variable cuyo valor se define mediante la política AssignMessage. Si la variable cuyo nombre se indica en <Name>
no existe, la política crea una con ese nombre.
Valor predeterminado | N/A |
¿Es obligatorio? | Obligatorio |
Tipo | Cadena |
Elemento principal |
<AssignVariable>
|
Elementos secundarios | Ninguno |
El elemento <Name>
utiliza 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 ejemplo siguiente se especifica la variable de destino como myvar
y se le asigna 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>
(hijo de <AssignVariable>
)
Este elemento le permite obtener de forma dinámica el valor de un par clave-nombre de propiedad. Para obtener información sobre los conjuntos de propiedades, consulta el artículo Usar conjuntos de propiedades.
Valor predeterminado | N/A |
¿Es obligatorio? | Opcional |
Tipo | Cadena |
Elemento principal |
<AssignVariable>
|
Elementos secundarios | Ninguno |
Un conjunto de propiedades consta de un par de nombre/clave.
Por ejemplo: propset1.id=12345
,
donde 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 nombres de conjuntos de propiedades o claves de forma dinámica. Supongamos que tiene 200 reglas de enrutamiento en un archivo de conjunto de propiedades. Puedes acceder a las reglas del conjunto de propiedades de la siguiente manera, donde routingrules
es el nombre del conjunto de propiedades y rule1
, rule2
y rulen
son claves:
propertyset.routingrules.rule1 propertyset.routingrules.rule2 propertyset.routingrules.rulen
Para acceder a estas propiedades en un flujo de proxy de API, debe saber qué regla quiere seleccionar en tiempo de diseño. Sin embargo, supongamos que el nombre de la regla se incluye en el encabezado o en la carga útil de la solicitud. Una forma de seleccionar la regla es usar una política de JavaScript con un código como el siguiente:
context.getVariables("propertyset.routingrules." + ruleName); //assuming ruleName was populated earlier.
Por otro lado, la función AssignMessage PropertySetRef
te permite seleccionar una clave de propiedad de forma dinámica sin introducir JavaScript.
Puede usar una combinación de variables de flujo y valores de cadena literal en el elemento <PropertySetRef>
. Consulta los ejemplos para obtener más información.
El elemento <PropertySetRef>
utiliza 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
, la clave se proporciona 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>
Puede usar cualquier combinación de variables de flujo y cadenas 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 mediante un nombre de clave fijo (cadena literal). En este caso, el nombre del conjunto de propiedades se obtiene del encabezado propset_name
, la clave es la cadena 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>
Puede usar cualquier combinación de variables de flujo y cadenas literales en el elemento <PropertySetRef>
.
<Ref>
(hijo 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 (que se indican en la referencia de variables de flujo) o una variable de flujo personalizada que hayas creado.
El valor de <Ref>
siempre se interpreta como una variable de flujo. No puedes especificar una cadena literal como valor. Para asignar un valor de cadena literal, usa el elemento <Value>
.
Valor predeterminado | N/A |
¿Es obligatorio? | Opcional |
Tipo | Cadena |
Elemento principal |
<AssignVariable>
|
Elementos secundarios | Ninguno |
Cuando especifiques una variable de flujo con <Ref>
, omite los corchetes {}
que normalmente usarías para hacer referencia a una variable de flujo. Por ejemplo, para asignar a la nueva variable el valor de la variable de flujo client.host
, haz lo siguiente:
DO specify the variable name without brackets: <Ref>client.host</Ref> DO NOT use brackets: <Ref>{client.host}</Ref>
Para definir un valor predeterminado para la variable de flujo de destino, usa <Value>
en combinación con <Ref>
. Si la variable de flujo especificada por <Ref>
no existe, no se puede leer o es nula, Apigee asigna el valor de <Value>
a la variable de flujo de destino.
El elemento <Ref>
utiliza 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 consulta 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 ningún valor predeterminado (ni de respaldo) especificado para ninguna de las asignaciones.
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 consulta 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 del parámetro de consulta Country
son nulos, ilegibles o tienen un formato incorrecto, Apigee asigna el valor ErrorOnCopy
a las nuevas variables.
Ejemplo 3
Un caso práctico habitual de <AssignVariable>
es definir el valor predeterminado de un parámetro de consulta, un encabezado u otro valor que se pueda transferir con la solicitud. Por ejemplo, creas un proxy de API meteorológica en el que la solicitud toma un único parámetro de consulta llamado w
. Este parámetro contiene el ID de la ciudad de la que quieres obtener la información meteorológica. 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 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 se lo asigna a sí mismo. Si la variable de flujo es nula, lo que significa que el parámetro de consulta w
se ha omitido en la solicitud, en este ejemplo se usa el valor predeterminado del elemento <Value>
. Por lo tanto, puedes enviar una solicitud a este proxy de API
que omita el parámetro de consulta w
:
http://myCO.com/v1/weather/forecastrss
...y que el proxy de API devuelva un resultado válido.
El valor de <Ref>
debe ser una variable de flujo, como una propiedad de un objeto request
, response
o target
, o el nombre de una variable de flujo personalizada.
Si especifica una variable de flujo que no existe para el valor de <Ref>
y el valor de <IgnoreUnresolvedVariables>
es false
, Apigee genera un error.
<ResourceURL>
(hijo de <AssignVariable>
)
Especifica la URL de un recurso de texto
como origen de la asignación de variables. 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 especificación de OpenAPI.
Valor predeterminado | N/A |
¿Es obligatorio? | Opcional |
Tipo | Cadena |
Elemento principal |
<AssignVariable>
|
Elementos secundarios | Ninguno |
Si el recurso especificado por <ResourceURL>
no existe, se asigna el valor null
a la variable de flujo de destino si el valor de <IgnoreUnresolvedVariables>
es true
. En cambio, si el valor de <IgnoreUnresolvedVariables>
es false
, Apigee genera un error.
El elemento <ResourceURL>
utiliza 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 cadena y se interpreta como una plantilla de mensaje. Cualquiera de las siguientes opciones es válida:
jsc://my-js-file.js wsdl://{variable-goes-here} {variable-goes-here}
Ejemplo 1
En el siguiente ejemplo, se asigna el valor de un recurso JSON, cargado en el proxy en la carpeta jsc
, a 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, cargado en el proxy
en la carpeta oas
, a la variable de flujo assigned-variable
y, a continuación, se asigna
ese valor al Payload
del 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>
(hijo de <AssignVariable>
)
Especifica una plantilla de mensaje. Una plantilla de mensaje te permite sustituir cadenas de variables cuando se ejecuta la política y puede combinar cadenas literales con nombres de variables entre llaves. Además, las plantillas de mensajes admiten funciones como el escape y la conversión de mayúsculas y minúsculas.
Utilice el atributo ref
para especificar una variable de flujo en la que el valor de la variable sea una plantilla de mensaje. Por ejemplo, puedes almacenar una plantilla de mensaje como un atributo personalizado en una aplicación de desarrollador. Cuando Apigee identifica la aplicación de desarrollador después de verificar la clave de API o el token de seguridad (mediante una política adicional), el elemento <AssignVariable>
puede usar la plantilla de mensaje del atributo personalizado de la aplicación, que está disponible como variable de flujo de la política de seguridad. En el siguiente ejemplo, se da por hecho que la plantilla de mensaje está disponible en un atributo personalizado llamado message_template
en la aplicación de desarrollador que hace la llamada a la API, donde se ha usado la política VerifyAPIKey para verificar la clave de API de la aplicación:
<Template ref='verifyapikey.myVerifyAPIKeyPolicy.app.name.message_template'/>
Valor predeterminado | N/A |
¿Es obligatorio? | Opcional |
Tipo | Cadena |
Elemento principal |
<AssignVariable>
|
Elementos secundarios | Ninguno |
El elemento <Template>
utiliza 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 siguiente ejemplo se usa la sintaxis de plantillas de mensajes para concatenar dos variables de contexto con una cadena 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, donde el valor de la variable es una plantilla de mensaje predefinida. Usa esta opción si quieres insertar una plantilla predefinida en tiempo 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, se usará ese valor 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 de override
, donde
en algunos casos quieres anular la plantilla predeterminada (la parte de texto) con valores
que se definen de forma dinámica. Por ejemplo, una instrucción condicional puede obtener un valor de un mapa de pares clave-valor y asignar ese valor a la variable a la que se hace referencia:
<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>
(hijo de <AssignVariable>
)
Define el valor de la variable de flujo de destino definida con <AssignVariable>
. El valor siempre se interpreta como una cadena literal. No puedes usar una variable de flujo como valor, aunque lo incluyas entre corchetes ({}
). Para usar una variable de flujo, usa <Ref>
en su lugar.
Valor predeterminado | N/A |
¿Es obligatorio? | Opcional |
Tipo | Cadena |
Elemento principal |
<AssignVariable>
|
Elementos secundarios | Ninguno |
Cuando se usa en combinación con el elemento <Ref>
, <Value>
actúa como valor predeterminado (o de reserva). Si no se especifica <Ref>
, no se puede resolver o es nulo, se usa el valor de <Value>
.
El elemento <Value>
utiliza 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 asigna el valor literal 42
a la variable de flujo de destino myvar
:
<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 consulta 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 falla alguna de las asignaciones, <AssignVariable>
asigna el valor ErrorOnCopy
a la variable de flujo de destino.
<Copy>
Copia los valores del mensaje especificado por el atributo source
al mensaje especificado por el elemento <AssignTo>
. Si no especificas un destino con <AssignTo>
, esta política copia los valores en la solicitud o en la respuesta, según en qué parte del flujo se ejecute.
Valor predeterminado | N/A |
¿Es obligatorio? | Opcional |
Tipo | Cadena |
Elemento principal |
<AssignMessage>
|
Elementos secundarios |
<FormParams> <Headers> <Path> <Payload> <QueryParams> <StatusCode> <Verb> <Version> |
Si no especificas ningún elemento secundario debajo del elemento <Copy>
, se copiarán todas las partes del mensaje de origen designado.
El elemento <Copy>
utiliza 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 copian un encabezado, tres parámetros de formulario, la ruta y todos los parámetros de consulta del mensaje request
en una solicitud personalizada nueva llamada 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>
Como no están presentes elementos como <Payload>
y <Verb>
, la política no copia esas partes del mensaje.
Ejemplo 2
En el siguiente ejemplo, primero se elimina todo el contenido del mensaje response
y, a continuación, se copian todos los valores de otro mensaje llamado secondResponse
en el mensaje response
:
<AssignMessage name='AM-Copy-Response'> <AssignTo>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 |
---|---|---|---|
fuente |
Especifica el objeto de origen de la copia.
|
Opcional | Cadena |
<FormParams>
(hijo 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 ningún efecto en una respuesta.
Valor predeterminado | N/A |
¿Es obligatorio? | Opcional |
Tipo | Matriz de elementos <FormParam> o una matriz vacía |
Elemento principal |
<Copy>
|
Elementos secundarios |
<FormParam> |
El elemento <FormParams>
utiliza 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 en la solicitud personalizada MyCustomRequest
:
<AssignMessage name="AM-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 en la solicitud personalizada
MyCustomRequest
:
<AssignMessage name="AM-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="AM-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, usa la siguiente sintaxis:
<AssignMessage name="AM-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
solo tiene un valor, no se copia.
Solo puedes usar <Copy>
/<FormParams>
cuando se cumplan los siguientes criterios:
- El tipo de mensaje tanto del origen como del destino es "request"
- El verbo HTTP tanto para el origen como para el destino es
POST
oPUT
. - El mensaje de origen tiene el encabezado
Content-Type
definido comoapplication/x-www-form-urlencoded
.
Cuando copias <FormParams>
, <Copy>
define el encabezado Content-Type
en el mensaje de destino (designado por el elemento <AssignTo>
)
como application/x-www-form-urlencoded
.
<Headers>
(hijo de <Copy>
)
Copia los encabezados HTTP de la solicitud o el mensaje de respuesta especificados por el atributo source
del elemento <Copy>
a la solicitud o el mensaje de respuesta especificados por el elemento <AssignTo>
.
Valor predeterminado | N/A |
¿Es obligatorio? | Opcional |
Tipo | Matriz de elementos <Header> o matriz vacía |
Elemento principal |
<Copy>
|
Elementos secundarios |
<Header> |
El elemento <Headers>
utiliza 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 al nuevo objeto de solicitud personalizado:
<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="AM-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, utiliza la siguiente sintaxis:
<AssignMessage name="AM-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
solo tiene un valor, no se copia.
<Path>
(hijo de <Copy>
)
Determina si la ruta se debe copiar de la solicitud de origen a la de destino. Este elemento no tiene ningún efecto en una respuesta.
Si true
, esta política copia la ruta de el 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 | Ninguno |
El elemento <Path>
utiliza 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 AssignMessage debe copiar la ruta de la solicitud de origen al 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 <Copy>
/<Path>
cuando se cumplan los siguientes criterios:
- El tipo de mensaje tanto del origen como del destino es "request"
<Payload>
(hijo de <Copy>
)
Determina si la carga útil se debe copiar del origen al destino. El origen y el destino pueden ser solicitudes o respuestas.
Si 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 | Ninguno |
El elemento <Payload>
utiliza 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 asigna el valor true
a <Payload>
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>
(hijo de <Copy>
)
Copia los parámetros de cadena de consulta de la solicitud especificada por el atributo source
del elemento <Copy>
a la solicitud especificada por el elemento <AssignTo>
. Este elemento no tiene ningún efecto en una respuesta.
Valor predeterminado | N/A |
¿Es obligatorio? | Opcional |
Tipo | Matriz de elementos <QueryParam> o matriz vacía |
Elemento principal |
<QueryParam>
|
Elementos secundarios | Ninguno |
El elemento <QueryParams>
utiliza 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 ejemplo siguiente, se copia el parámetro de consulta my_param
de la solicitud en un objeto de solicitud personalizado 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 ejemplo siguiente se copian todos los parámetros de consulta 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 consulta con el mismo nombre, utiliza 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
solo tiene un valor, no se copia.
Solo puedes usar <Copy>
/<QueryParams>
cuando se cumplan los siguientes criterios:
- Verbos HTTP:
GET
,PUT
,POST
,PATCH
yDELETE
- El tipo de mensaje tanto del origen como del destino es "request"
<StatusCode>
(hijo de <Copy>
)
Determina si el código de estado se copia de la respuesta de origen a la de destino. Este elemento no tiene ningún efecto en una solicitud.
Si true
, esta política copia el código de estado de el 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 | Ninguno |
El elemento <StatusCode>
utiliza 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 asigna true
a <StatusCode>
, lo que copia el código de estado del objeto de respuesta predeterminado en un objeto de respuesta 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 de tipo respuesta.
Un uso habitual de <StatusCode>
es definir el código de estado de la respuesta del proxy en un valor distinto al recibido del destino.
<Verb>
(hijo de <Copy>
)
Determina si el verbo HTTP se copia de la solicitud de origen a la de destino. Este elemento no tiene ningún efecto en una respuesta.
Si true
, copia 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 | Ninguno |
El elemento <Verb>
utiliza 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 asigna true
a <Verb>
, lo que copia el verbo de la solicitud predeterminada en una solicitud personalizada nueva:
<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 <Copy>
/<Verb>
cuando se cumplan los siguientes criterios:
- El tipo de mensaje tanto del origen como del destino es "request"
<Version>
(hijo de <Copy>
)
Determina si la versión HTTP se copia de la solicitud de origen a la solicitud de destino. Este elemento no tiene ningún efecto en una respuesta.
Si true
, copia la versión HTTP que se encuentra en el atributo source
del elemento <Copy>
en el objeto especificado por el elemento <AssignTo>
.
Valor predeterminado | Falso |
¿Es obligatorio? | Opcional |
Tipo | Booleano |
Elemento principal |
<Copy>
|
Elementos secundarios | Ninguno |
El elemento <Version>
utiliza 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 asigna true
a <Version>
en la solicitud, lo que copia la versión del objeto de solicitud predeterminado en un objeto de solicitud personalizado nuevo:
<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 <Copy>
/<Version>
cuando se cumplan los siguientes criterios:
- El tipo de mensaje tanto del origen como del destino es "request"
<DisplayName>
Se usa junto con el atributo name
para etiquetar la política en el editor de proxy de la interfaz de usuario de gestión con un nombre diferente que suene más natural.
El elemento <DisplayName>
es común a todas las políticas.
Valor predeterminado | N/A |
¿Es obligatorio? | Opcional. Si omite <DisplayName> , se usará el valor del atributo name de la política. |
Tipo | Cadena |
Elemento principal | <PolicyElement> |
Elementos secundarios | Ninguno |
El elemento <DisplayName>
utiliza 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 |
Asigna el valor true
para ignorar las variables sin resolver y continuar con el procesamiento. De lo contrario, asigna el valor false
. El valor predeterminado es false
.
Definir <IgnoreUnresolvedVariables>
como true
es diferente de definir continueOnError
de <AssignMessage>
como true
, ya que se refiere específicamente a la definición y obtención de valores de variables. Si asignas el valor true
a continueOnError
, Apigee ignora todos los errores, no solo los que se producen al usar variables.
El elemento <IgnoreUnresolvedVariables>
utiliza 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 asigna true
a <IgnoreUnresolvedVariables>
:
<AssignMessage name="AM-Set-Headers"> <Set> <Headers> <Header name='new-header'>{possibly-defined-variable}<Header> </Headers> </Set> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> </AssignMessage>
Como <IgnoreUnresolvedVariables>
tiene el valor true
, si no se define la variable possibly-defined-variable
, esta política no generará ningún error.
<Remove>
Elimina los encabezados, los parámetros de consulta, los parámetros de formulario o la carga útil del mensaje. Una etiqueta <Remove>
vacía elimina todo el contenido del mensaje.
El mensaje afectado puede ser una solicitud o una respuesta. Para especificar en qué mensaje <Remove>
actúa, usa 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 habitual de <Remove>
es eliminar un parámetro de consulta o un encabezado que contenga información sensible del objeto de solicitud entrante para evitar que se envíe al servidor backend.
El elemento <Remove>
utiliza 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 ejemplo siguiente, se elimina 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 elimina el cuerpo de la respuesta y solo devuelve los encabezados HTTP al cliente.
Ejemplo 2
En el siguiente ejemplo se eliminan 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 elimina todo de un objeto de mensaje:
<AssignMessage name="AM-remove-3"> <Remove/> <AssignTo>request</AssignTo> </AssignMessage>
Normalmente, solo lo harías si fueras a usar el elemento <Set>
o el elemento <Copy>
para definir algunos valores de sustitución en el mensaje.
<FormParams>
(hijo de <Remove>
)
Quita los parámetros de formulario especificados de la solicitud. Este elemento no tiene ningún efecto en una respuesta.
Valor predeterminado | N/A |
¿Es obligatorio? | Opcional |
Tipo | Matriz de elementos <FormParam> o una matriz vacía |
Elemento principal |
<Remove>
|
Elementos secundarios |
<FormParam> |
El elemento <FormParams>
utiliza 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 ejemplo siguiente se eliminan tres parámetros de formulario 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 eliminan todos los parámetros de formulario 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, usa 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 eliminan f1
, f2
y el segundo valor de f3
. Si f3
solo tiene un valor, no se elimina.
Puedes usar <FormParams>
solo si se cumplen los siguientes criterios:
- Tipo de mensaje: solicitud
Content-Type
:application/x-www-form-urlencoded
<Headers>
(hijo de <Remove>
)
Elimina los encabezados HTTP especificados de la solicitud o la respuesta, que se indica en el elemento <AssignTo>
.
Valor predeterminado | N/A |
¿Es obligatorio? | Opcional |
Tipo | Matriz de elementos <Header> o una matriz vacía |
Elemento principal |
<Remove>
|
Elementos secundarios |
<Header> |
El elemento <Headers>
utiliza 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 elimina 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 eliminan 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, utiliza 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 eliminan h1
, h2
y el segundo valor de h3
de la solicitud. Si h3
solo tiene un valor, no se elimina.
<Payload>
(hijo de <Remove>
)
Determina si <Remove>
elimina la carga útil de la solicitud o la respuesta, que se especifica en el elemento <AssignTo>
. Asigna el valor true
para borrar la carga útil. De lo contrario, asigna el valor false
. El valor predeterminado es false
.
Valor predeterminado | Falso |
¿Es obligatorio? | Opcional |
Tipo | Booleano |
Elemento principal |
<Remove>
|
Elementos secundarios | Ninguno |
El elemento <Payload>
utiliza 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 asigna true
a <Payload>
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>
(hijo de <Remove>
)
Quita los parámetros de consulta especificados de la solicitud. Este elemento no tiene ningún efecto en una respuesta.
Valor predeterminado | N/A |
¿Es obligatorio? | Opcional |
Tipo | Matriz de elementos <QueryParam> o una matriz vacía |
Elemento principal |
<Remove>
|
Elementos secundarios |
<QueryParam> |
El elemento <QueryParams>
utiliza 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 ejemplo siguiente, se elimina el parámetro de consulta apikey
de la solicitud:
<AssignMessage name="AM-remove-query-param"> <Remove> <QueryParams> <QueryParam name="apikey"/> </QueryParams> </Remove> <AssignTo>request</AssignTo> </AssignMessage>
Ejemplo 2
En el siguiente ejemplo se eliminan todos los parámetros de consulta de la solicitud:
<AssignMessage name="AM-remove-queryparams-2"> <Remove> <QueryParams/> </Remove> <AssignTo>request</AssignTo> </AssignMessage>
Ejemplo 3
Si hay varios parámetros de consulta con el mismo nombre, utiliza 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 eliminan qp1
, qp2
y el segundo valor de qp3
de la solicitud. Si qp3
solo tiene un valor, no se elimina.
Puedes usar <QueryParams>
solo si se cumplen los siguientes criterios:
- Verbos HTTP:
GET
,POST
,PATCH
yDELETE
- Tipo de mensaje: solicitud
<Set>
Define la información en el mensaje de solicitud o respuesta, que se especifica mediante el elemento <AssignTo>
. <Set>
sobrescribe los encabezados o los parámetros de consulta o de formulario que ya existen en el mensaje original, o bien añade nuevos si no los hay.
Los encabezados y los parámetros de consulta y de formulario de un mensaje HTTP pueden contener varios valores. Para añadir valores adicionales a un encabezado o un parámetro, utilice el elemento <Add>
.
Valor predeterminado | N/A |
¿Es obligatorio? | Opcional |
Tipo | Tipo complejo |
Elemento principal |
<AssignMessage>
|
Elementos secundarios |
<Authentication> <FormParams> <Headers> <Payload> <Path> <QueryParams> <StatusCode> <Verb> <Version> |
El elemento <Set>
utiliza la siguiente sintaxis:
Sintaxis
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <Set> <Authentication> <HeaderName>HEADER_NAME</HeaderName> <!-- Use either GoogleAccessToken or GoogleIDToken --> <GoogleAccessToken> <Scopes> <Scope>SCOPE</Scope> ... </Scopes> </GoogleAccessToken> ----- or ----- <GoogleIDToken> <Audience ref='FLOW_VARIABLE_NAME>TARGET_URL</Scope> </GoogleAccessToken> </Authentication> <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 define un encabezado específico. Cuando esta política se adjunta en el flujo de solicitudes, permitirá que el sistema upstream reciba un encabezado adicional que no se haya incluido en la solicitud entrante 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 sobrescribe 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>
<Authentication> (subetiqueta de <Set>
)
Genera un token de acceso OAuth 2.0 de Google o un token de ID OpenID Connect emitido por Google y lo define en el encabezado Authorization
. Esto resulta útil cuando el proxy necesita hacer llamadas autenticadas a servicios de Google y servicios personalizados que se ejecutan en determinados productos de Google Cloud, como Cloud Functions y Cloud Run.
Para usar este elemento, debes seguir los pasos de configuración e implementación que se describen en el artículo Usar la autenticación de Google. Si la configuración es correcta, la política crea un token y lo añade al encabezado correspondiente de la solicitud.
Los elementos secundarios GoogleAccessToken
y GoogleIDToken
te permiten configurar la política para generar un token de OAuth de Google o de OpenID Connect. Selecciona uno de estos elementos secundarios en función de los requisitos del servicio al que quieras llamar.
Valor predeterminado | N/A |
¿Es obligatorio? | Opcional |
Tipo | Tipo complejo |
Elemento principal |
<Set>
|
Elementos secundarios |
<HeaderName> <GoogleAccessToken> <GoogleIdToken> |
El elemento Authentication
utiliza la siguiente sintaxis:
Sintaxis
<AssignMessage> ... <Set> <Authentication> <HeaderName>HEADER_NAME</HeaderName> --EITHER-- <GoogleAccessToken> <Scopes> <Scope>SCOPE</Scope> ... </Scopes> <GoogleAccessToken> --OR-- <GoogleIDToken> <Audience ref="FLOW_VARIABLE">TARGET_URL</Audience> </GoogleIDToken> </Authentication> </Set> ... </AssignMessage>
Usar un token de acceso
En el siguiente ejemplo se muestra el elemento GoogleAccessToken
:
<Authentication> <GoogleAccessToken> <Scopes> <Scope>https://www.googleapis.com/auth/cloud-platform</Scope> </Scopes> </GoogleAccessToken> </Authentication>
Usar el token de ID
En el siguiente ejemplo se muestra el elemento GoogleIDToken
:
<Authentication> <GoogleIDToken> <Audience>https://httpserver0-bar.run.app</Audience> </GoogleIDToken> </Authentication>
Usar HeaderName
En el siguiente ejemplo se muestra el elemento HeaderName
:
<Authentication> <HeaderName>Authorization</HeaderName> <GoogleAccessToken> <Scopes> <Scope>https://www.googleapis.com/auth/cloud-platform</Scopes> </Scopes> </GoogleAccessToken> </Authentication>
<HeaderName> (elemento secundario de <Authentication>
)
De forma predeterminada, cuando hay una configuración de autenticación, Apigee genera un token de portador y lo inserta en el encabezado Authorization
del mensaje enviado al sistema de destino.
El elemento HeaderName
le permite especificar el nombre de otro encabezado
para contener ese token de portador. El encabezado Authorization
, si está presente, no se modifica y también se envía en la solicitud.
Valor predeterminado | N/A |
¿Es obligatorio? | Opcional |
Tipo | Cadena |
Elemento principal |
<Authentication>
|
Elementos secundarios |
Ninguno |
El elemento HeaderName
utiliza la siguiente sintaxis:
Sintaxis
<AssignMessage> ... <Authentication> <HeaderName>HEADER_NAME</HeaderName> <GoogleAccessToken> ... </GoogleAccessToken> </Authentication> ... </AssignMessage>
Con una cadena estática
En este ejemplo, el token de portador generado se añade de forma predeterminada a un encabezado llamado Authorization
que se envía al sistema de destino. El encabezado Authorization
, si está presente, se deja sin modificar y también se envía en la solicitud.
<Authentication> <HeaderName>Authorization</HeaderName> <GoogleAccessToken> <Scopes> <Scope>https://www.googleapis.com/auth/cloud-platform</Scope> </Scopes> </GoogleAccessToken> </Authentication>
Con referencia variable
En este ejemplo, el token de portador generado se añade de forma predeterminada a un encabezado llamado Authorization
que se envía al sistema de destino. Si my-variable
tiene un valor, se usará ese valor en lugar de la cadena predeterminada. El encabezado Authorization
, si está presente, se deja sin modificar y también se envía en la solicitud.
<Authentication> <HeaderName ref='my-variable'>Authorization</HeaderName> <GoogleAccessToken> <Scopes> <Scopes>https://www.googleapis.com/auth/cloud-platform</Scopes> </Scopes> >/GoogleAccessToken> </Authentication>
<GoogleAccessToken> (elemento secundario de <Authentication>
)
Genera tokens de OAuth 2.0 de Google para hacer llamadas autenticadas a servicios de Google. Los tokens de OAuth de Google se pueden usar para llamar a muchos tipos de servicios de Google, como Cloud Logging y Secret Manager.
Valor predeterminado | N/A |
¿Es obligatorio? | Debe estar presente el elemento secundario GoogleAccessToken o GoogleIDToken . |
Tipo | Cadena |
Elemento principal |
<Authentication>
|
Elementos secundarios |
<Scopes> |
El elemento GoogleAccessToken
utiliza la siguiente sintaxis:
Sintaxis
<AssignMessage> ... <Authentication> <GoogleAccessToken> <Scopes> <Scope>SCOPE_1</Scope> ... </Scopes> >/GoogleAccessToken> </Authentication> ... </AssignMessage>
Ejemplo 1
En el siguiente ejemplo se muestra el elemento GoogleAccessToken
:
<Authentication> <GoogleAccessToken> <Scopes> <Scope>https://www.googleapis.com/auth/cloud-platform</Scopes> </Scopes> </GoogleAccessToken> </Authentication>
<Scopes> (subetiqueta de <GoogleAccessToken>
)
Identifica los ámbitos que se incluirán en el token de acceso de OAuth 2.0. Para obtener más información, consulta
Permisos de OAuth 2.0 para APIs de Google. Puede añadir uno o varios elementos secundarios <Scope>
a este elemento.
Valor predeterminado | N/A |
¿Es obligatorio? | Obligatorio |
Tipo | Cadena |
Elemento principal |
<GoogleAccessToken>
|
Elementos secundarios |
<Scope> |
El elemento Scopes
utiliza la siguiente sintaxis:
<Scopes> <Scope>SCOPE_1</Scope> <Scope>SCOPE_2</Scope> ... </Scopes>
<Scope> (elemento secundario de <Scopes>
)
Especifica un ámbito de API de Google válido. Para obtener más información, consulta Permisos de OAuth 2.0 para APIs de Google.
Valor predeterminado | N/A |
¿Es obligatorio? | Se necesita al menos un valor. |
Tipo | Cadena |
Elemento principal |
<Scopes>
|
Elementos secundarios |
Ninguno |
El elemento Scope
utiliza la siguiente sintaxis:
<Scope>SCOPE_1</Scope>
<GoogleIDToken> (subetiqueta de <GoogleAccessToken>
)
Genera tokens OpenID Connect emitidos por Google para hacer llamadas autenticadas a servicios de Google.
Valor predeterminado | N/A |
¿Es obligatorio? | Debe estar presente el elemento secundario GoogleAccessToken o GoogleIDToken . |
Tipo | Cadena |
Elemento principal |
<Authentication>
|
Elementos secundarios |
<Audience> |
El elemento GoogleIDToken
utiliza la siguiente sintaxis:
Sintaxis
<AssignMessage> ... <Authentication> <GoogleIDToken> <Audience ref="FLOW_VARIABLE_NAME">TARGET_URL</Audience> </GoogleIDToken> </Authentication> </AssignMessage>
Ejemplo 1
En el siguiente ejemplo se muestra el elemento GoogleIDToken
:
<Authentication> <GoogleIDToken> <Audience>https://httpserver0-bar.run.app</Audience> </GoogleIDToken> </Authentication>
<Audience> (elemento secundario de <GoogleAccessToken>
)
La audiencia del token de autenticación generado, como la API o la cuenta a la que el token concede acceso.
Si el valor de Audience
está vacío o la variable ref
no se resuelve en un valor válido y useTargetUrl
es true
, se usa la URL del destino (sin incluir ningún parámetro de consulta) como audiencia. De forma predeterminada, useTargetUrl
es false
.
Valor predeterminado | N/A |
¿Es obligatorio? | Obligatorio |
Tipo | Cadena |
Elemento principal | |
Elementos secundarios |
Ninguno |
El elemento Audience
utiliza la siguiente sintaxis:
<Audience>TARGET_URL</Audience> or: <Audience ref='FLOW_VARIABLE_NAME'/>
<FormParams>
(hijo de <Set>
)
Sobrescribe los parámetros de formulario de una solicitud y los sustituye por los nuevos valores que especifiques con este elemento. Este elemento no tiene ningún efecto en una respuesta.
Valor predeterminado | N/A |
¿Es obligatorio? | Opcional |
Tipo | Matriz de elementos <FormParam> |
Elemento principal |
<Set>
|
Elementos secundarios |
<FormParam> |
El elemento <FormParams>
utiliza 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 asigna el valor de la variable request.header.myparam
a un parámetro de formulario llamado myparam
en una solicitud personalizada nueva:
<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>
Puedes usar <FormParams>
solo si se cumplen los siguientes criterios:
- Verbo HTTP:
POST
- Tipo de mensaje: solicitud
Si define parámetros de formulario vacíos en su política (<Set><FormParams/></Set>
), la política no añade ningún parámetro de formulario. Es lo mismo que omitir <FormParams>
.
Cuando usas <Set>
con <FormParams>
, Apigee cambia el Content-Type
del mensaje a application/x-www-form-urlencoded
.
<Headers>
(hijo de <Set>
)
Sobrescribe los encabezados HTTP de la solicitud o la respuesta, que se especifican mediante el elemento <AssignTo>
.
Valor predeterminado | N/A |
¿Es obligatorio? | Opcional |
Tipo | Matriz de elementos <Header> |
Elemento principal |
<Set>
|
Elementos secundarios |
<Header> |
El elemento <Headers>
utiliza 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 asigna al encabezado x-ratelimit-remaining
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 define encabezados vacíos en su política (<Set><Headers/></Set>
), la política no definirá ningún encabezado. Esto tendrá el mismo efecto que omitir <Headers>
.
<Path>
(hijo de <Set>
)
<Payload>
(hijo de <Set>
)
Define el cuerpo del mensaje de una solicitud o una respuesta, que se especifica mediante el elemento <AssignTo>
. La carga útil puede ser de cualquier tipo de contenido válido, como texto sin formato, JSON o XML.
Valor predeterminado | cadena vacía |
¿Es obligatorio? | Opcional |
Tipo | Cadena |
Elemento principal |
<Set>
|
Elementos secundarios | Ninguno |
El elemento <Payload>
utiliza 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 define una carga útil de texto sin formato:
<AssignMessage name="AM-set-payload-1"> <Set> <Payload contentType="text/plain">42</Payload> </Set> </AssignMessage>
Ejemplo 2
En el siguiente ejemplo se define una carga útil de JSON:
<AssignMessage name="AM-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 variables en la carga útil. Para ello, se incluyen los nombres de las variables entre llaves:
<AssignMessage name="AM-set-payload-3"> <Set> <Payload contentType="application/json"> {"name":"foo", "type":"{variable_name}"} </Payload> </Set> </AssignMessage>
En versiones anteriores de Apigee (por ejemplo, antes de la versión 16.08.17 de la nube), no podías usar llaves para indicar referencias de variables en cargas útiles JSON. En esas versiones, tenías que usar los atributos variablePrefix
y variableSuffix
para especificar los caracteres delimitadores y usarlos para envolver los nombres de las variables, de la siguiente manera:
<AssignMessage name="AM-set-payload-3b"> <Set> <Payload contentType="application/json" variablePrefix="@" variableSuffix="#"> {"name":"foo", "type":"@variable_name#"} </Payload> </Set> </AssignMessage>
Esta sintaxis antigua sigue funcionando.
Ejemplo 4
El contenido de <Payload>
se trata como una plantilla de mensaje. Esto significa que la política AssignMessage sustituye las variables entre llaves por el valor de las variables referenciadas en el tiempo de ejecución.
En el siguiente ejemplo se usa la sintaxis de llaves para asignar parte de la carga útil al valor de una variable:
<AssignMessage name="AM-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 |
Opcional | Cadena |
variablePrefix |
Especifica de forma opcional el delimitador inicial de una variable de flujo. El valor predeterminado es "{". Para obtener más información, consulta la referencia de variables de flujo. | Opcional | Char |
variableSuffix |
Especifica de forma opcional el delimitador final de una variable de flujo. El valor predeterminado es "}". Para obtener más información, consulta la referencia de variables de flujo. | Opcional | Char |
<QueryParams>
(hijo de <Set>
)
Sobrescribe los parámetros de consulta de la solicitud con nuevos valores. Este elemento no tiene ningún efecto en una respuesta.
Valor predeterminado | N/A |
¿Es obligatorio? | Opcional |
Tipo | Matriz de elementos <QueryParam> |
Elemento principal |
<Set>
|
Elementos secundarios |
<QueryParam> |
El elemento <QueryParams>
utiliza 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 ejemplo siguiente, se asigna al parámetro de consulta address
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 <Set>
/<QueryParams>
cuando se cumplan los siguientes criterios:
- Verbos HTTP:
GET
,PUT
,POST
,PATCH
yDELETE
- Tipo de mensaje: solicitud
Si define parámetros de consulta vacíos en su política (<Set><QueryParams/></Set>
), la política no definirá ningún parámetro de consulta. Es lo mismo que omitir <QueryParams>
.
<StatusCode>
(hijo de <Set>
)
Asigna el código de estado a la respuesta. Este elemento no tiene ningún efecto en una solicitud.
Valor predeterminado | "200" (cuando el atributo createNew de <AssignTo> se define como "true") |
¿Es obligatorio? | Opcional |
Tipo | Cadena o VARIABLE |
Elemento principal |
<Set>
|
Elementos secundarios | Ninguno |
El elemento <StatusCode>
utiliza 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 define un código de estado sencillo:
<AssignMessage name="AM-set-statuscode-404"> <Set> <StatusCode>404</StatusCode> </Set> <AssignTo>response</AssignTo> </AssignMessage>
Ejemplo 2
El contenido de <StatusCode>
se trata como una plantilla de mensaje. Esto significa que el nombre de una variable entre llaves se sustituirá en tiempo 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 <Set>
/<StatusCode>
cuando se cumplan los siguientes criterios:
- Tipo de mensaje: Response
<Verb>
(hijo de <Set>
)
Define el verbo HTTP en la solicitud. Este elemento no tiene ningún efecto en una respuesta.
Valor predeterminado | N/A |
¿Es obligatorio? | Opcional |
Tipo | Cadena o VARIABLE |
Elemento principal |
<Set>
|
Elementos secundarios | Ninguno |
El elemento <Verb>
utiliza 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 define 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 trata como una plantilla de mensaje. Esto significa que un nombre de variable entre llaves se sustituirá en tiempo de ejecución por el valor de la variable a la que se hace referencia.
En el siguiente ejemplo se usa una variable para rellenar un verbo:
<AssignMessage name="AM-set-verb-to-dynamic-value"> <Set> <Verb>{my_variable}</Verb> </Set> <AssignTo>request</AssignTo> </AssignMessage>
Solo puedes usar <Set>
/<Verb>
cuando se cumplan los siguientes criterios:
- Tipo de mensaje: solicitud
<Version>
(hijo de <Set>
)
Define la versión HTTP de una solicitud. Este elemento no tiene ningún efecto en una respuesta.
Valor predeterminado | N/A |
¿Es obligatorio? | Opcional |
Tipo | Cadena o VARIABLE |
Elemento principal |
<Set>
|
Elementos secundarios | Ninguno |
El elemento <Version>
utiliza 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 asigna el número de versión 1.1
:
<AssignMessage name="AM-set-version-1"> <Set> <Version>1.1</Version> </Set> </AssignMessage>
Ejemplo 2
En el siguiente ejemplo se usa una variable entre llaves para definir 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 trata como una plantilla de mensaje. Esto significa que el nombre de una variable entre llaves se sustituirá en tiempo de ejecución por el valor de la variable a la que se hace referencia.
Solo puedes usar <Set>
/<Version>
cuando se cumplan los siguientes criterios:
- Tipo de mensaje: solicitud
Crear 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 siguientes formas:
- Acceder a sus variables en otras políticas
- Pasarlo a un servicio externo
Para crear un mensaje de solicitud personalizado, usa el elemento <AssignTo>
en tu política AssignMessage. Asigna el valor true
a createNew
y especifica el nombre del nuevo mensaje en el cuerpo del elemento, tal como se muestra en el siguiente ejemplo:
<AssignMessage name="assignto-2"> <AssignTo createNew="true" transport="http" type="request">MyRequestObject</AssignTo> ... </AssignMessage>
De forma predeterminada, Apigee no hace nada con el mensaje de solicitud personalizado. Después de crearlo, Apigee continuará con el flujo con la solicitud original. Para usar la solicitud personalizada, añade una política como la política ServiceCallout a tu proxy y haz referencia explícitamente al mensaje de solicitud recién creado en la configuración de esa política. De esta forma, podrás enviar la solicitud personalizada a un endpoint 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>
Este ejemplo:
- Crea un 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 nuevo mensaje. Como<Copy>
no especifica el atributosource
, Apigee usará el mensajerequest
como origen para copiar desde. - Asigna al parámetro de consulta
address
del mensaje personalizado el valor del parámetro de consultaaddy
de la solicitud entrante. - Define el verbo HTTP en
GET
.
- Copia el valor del encabezado HTTP
- Asigna el valor
false
a<IgnoreUnresolvedVariables>
. Cuando<IgnoreUnresolvedVariables>
esfalse
, si una de las variables a las que se hace referencia en la configuración de la política no existe, Apigee pasará al estado de error en el flujo de la API.
Ejemplo 2
A continuación, se muestra otro ejemplo de 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 llamada partner.request
. A continuación, define <Verb>
y <Payload>
en la nueva solicitud.
Puede acceder a las distintas propiedades de un mensaje personalizado en otra política 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 del 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 error y los mensajes de error que devuelve Apigee, así como las variables de error que define, cuando esta política activa un error. Es importante que conozcas esta información si vas a desarrollar reglas de errores para gestionarlos. Para obtener más información, consulta Qué debes saber sobre los errores de políticas y Cómo gestionar los fallos.
Errores de tiempo de ejecución
Estos errores pueden producirse cuando se ejecuta la política.
Código de fallo | Estado de HTTP | Causa | Solucionar |
---|---|---|---|
steps.assignmessage.SetVariableFailed |
500 |
La política no ha podido definir una variable. Consulta la cadena de errores para ver el nombre de la variable sin resolver. | |
steps.assignmessage.VariableOfNonMsgType |
500 |
Este error se produce si el atributo Las variables de tipo de mensaje representan solicitudes y respuestas HTTP completas. Las variables de flujo integradas de Apigee |
build |
steps.assignmessage.UnresolvedVariable |
500 |
Este error se produce si una variable especificada en la política AssignMessage es:
|
build |
Errores de implementación
Estos errores pueden producirse al implementar un proxy que contenga esta política.
Nombre del error | Causa | Solucionar |
---|---|---|
InvalidIndex |
Si el índice especificado en los elementos <Copy> o <Remove> de la política AssignMessage
es 0 o un número negativo, se producirá un error al implementar el proxy de API.
|
build |
InvalidVariableName |
Si el elemento secundario <Name> está vacío o no se especifica en el elemento <AssignVariable> ,
la implementación del proxy de API falla porque no hay ningún nombre de variable válido al que
asignar un valor. Es obligatorio indicar un nombre de variable válido.
|
build |
InvalidPayload |
Una carga útil especificada en la política no es válida. |
Variables de error
Estas variables se definen cuando esta política activa un error en el tiempo de ejecución. Para obtener más información, consulta Qué debes saber sobre los errores de las políticas.
Variables | Dónde | Ejemplo |
---|---|---|
fault.name="FAULT_NAME" |
FAULT_NAME es el nombre del fallo, tal como se indica en la tabla Errores de tiempo de ejecución de arriba. El nombre del error es la última parte del código de error. | fault.name Matches "UnresolvedVariable" |
assignmessage.POLICY_NAME.failed |
POLICY_NAME es el nombre de la política especificado por el usuario que ha provocado el error. | 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" } }
Regla de error de ejemplo
<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
Cada tipo de política se define mediante un esquema XML (.xsd
). Puedes consultar los esquemas de políticas en GitHub.
Temas relacionados
En los ejemplos de API Platform, se pueden consultar ejemplos de la política AssignMessage.
Para ver un ejemplo más avanzado de cómo anular el target.url
de ProxyEndpoint
, consulta este artículo de la comunidad de Apigee.
Para ver un set path en acción en una política ServiceCallout, consulta este ejemplo práctico en los ejemplos de GitHub de Apigee. Solo tienes que clonar el repositorio y seguir las instrucciones de ese tema. En el ejemplo se usa AssignMessage para definir una ruta de solicitud y, a continuación, se usa una política ServiceCallout
para enviar la solicitud a un servicio externo.