Estás viendo la documentación de Apigee Edge.
Ve a la
Documentación de Apigee X. información
Qué
La política AssignMessage cambia o crea nuevos mensajes de solicitud y respuesta durante el flujo del proxy de API. La política te permite realizar las siguientes acciones en esos mensajes:
- Agregar nuevos parámetros de formulario, encabezados o parámetros de búsqueda a un mensaje
- Copiar las propiedades existentes de un mensaje a otro
- Quitar encabezados, parámetros de consulta, parámetros de formulario o mensaje cargas útiles de un mensaje
- Establecer el valor de las propiedades existentes en un mensaje
Con la política AssignMessage, por lo general, puedes agregar, cambiar o quitar propiedades del solicitud o respuesta. Sin embargo, también puedes usar la políticaAssignMessage para crear una de solicitud o respuesta y pasarlo a un destino alternativo, como se describe en Crea mensajes de solicitud personalizados.
La política AssignMessage puede crear o cambiar variables de flujo con los siguientes elementos secundarios:
Elemento <AssignMessage>
Define una política de AssignMessage.
Valor predeterminado | Consulta la pestaña Política predeterminada, a continuación |
¿Es obligatorio? | Obligatorio |
Tipo | Objeto complejo |
Elemento principal | n/a |
Elementos secundarios |
<Add> <AssignTo> <AssignVariable> <Copy> <DisplayName> <IgnoreUnresolvedVariables> <Remove> <Set> |
El elemento <AssignMessage>
usa la siguiente sintaxis:
Sintaxis
El elemento <AssignMessage>
usa la siguiente sintaxis:
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <!-- All AssignMessage child elements are optional --> <Add> <FormParams> <FormParam name="formparam_name">formparam_value</FormParam> ... </FormParams> <Headers> <Header name="header_name">header_value</Header> ... </Headers> <QueryParams> <QueryParam name="queryparam_name">queryparam_value</QueryParam> ... </QueryParams> </Add> <AssignTo createNew="[true|false]" transport="http" type="[request|response]">destination_variable_name</AssignTo> <AssignVariable> <Name>variable_name</Name> <Ref>source_variable</Ref> <Template>message_template</Template> or <Template ref='template_variable'></Template> <Value>variable_value</Value> </AssignVariable> <Copy source="[request|response]"> <!-- Can also be an empty array (<FormParams/>) --> <FormParams> <FormParam name="formparam_name">formparam_value</FormParam> ... </FormParams> <!-- Can also be an empty array (<Headers/>) --> <Headers> <Header name="header_name">header_value</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> <ReasonPhrase>[false|true]</ReasonPhrase> <StatusCode>[false|true]</StatusCode> <Verb>[false|true]</Verb> <Version>[false|true]</Version> </Copy> <DisplayName>policy_display_name</DisplayName> <IgnoreUnresolvedVariables>[true|false]</IgnoreUnresolvedVariables> <Remove> <!-- Can also be an empty array (<FormParams/>) --> <FormParams> <FormParam name="formparam_name">formparam_value</FormParam> ... </FormParams> <!-- Can also be an empty array (<Headers/>) --> <Headers> <Header name="header_name">header_value</Header> ... </Headers> <Payload>[false|true]</Payload> <!-- Can also be an empty array (<QueryParams/>) --> <QueryParams> <QueryParam name="queryparam_name">queryparam_value</QueryParam> ... </QueryParams> </Remove> <Set> <FormParams> <FormParam name="formparam_name">formparam_value</FormParam> ... </FormParams> <Headers> <Header name="header_name">header_value</Header> ... </Headers> <Path>path</Path> <Payload contentType="content_type" variablePrefix="prefix" variableSuffix="suffix">new_payload</Payload> <QueryParams> <QueryParam name="queryparam_name">queryparam_value</QueryParam> ... </QueryParams> <ReasonPhrase>reason_for_error or {variable}</ReasonPhrase> <StatusCode>HTTP_status_code or {variable}</StatusCode> <Verb>[GET|POST|PUT|PATCH|DELETE|{variable}]</Verb> <Version>[1.0|1.1|{variable}]</Verb> </Set> </AssignMessage>
Política predeterminada
En el siguiente ejemplo, se muestra la configuración predeterminada cuando se agrega una políticaAssignMessage a tu flujo en la IU de Edge:
<AssignMessage continueOnError="false" enabled="true" name="assign-message-default"> <DisplayName>Assign Message-1</DisplayName> <Properties/> <Copy source="request"> <Headers/> <QueryParams/> <FormParams/> <Payload/> <Verb/> <StatusCode/> <ReasonPhrase/> <Path/> </Copy> <Remove> <Headers> <Header name="h1"/> </Headers> <QueryParams> <QueryParam name="q1"/> </QueryParams> <FormParams> <FormParam name="f1"/> </FormParams> <Payload/> </Remove> <Add> <Headers/> <QueryParams/> <FormParams/> </Add> <Set> <Headers/> <QueryParams/> <FormParams/> <!-- <Verb>GET</Verb> --> <Path/> </Set> <AssignVariable> <Name>name</Name> <Value/> <Ref/> </AssignVariable> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
Cuando insertas una nueva política deAssignMessage en la IU de Edge, la plantilla contiene stubs para todos
posibles operaciones. Por lo general, tú seleccionas qué operaciones deseas realizar con esta política
y quita el resto de los elementos secundarios. Por ejemplo, si deseas realizar una operación de copia, usa el elemento <Copy>
y quita <Add>
, <Remove>
y otros elementos secundarios de la política para que sea más legible.
This element has the following attributes that are common to all policies:
Attribute | Default | Required? | Description |
---|---|---|---|
name |
N/A | Required |
The internal name of the policy. The value of the Optionally, use the |
continueOnError |
false | Optional | Set to "false" to return an error when a policy fails. This is expected behavior for most policies. Set to "true" to have flow execution continue even after a policy fails. |
enabled |
true | Optional | Set to "true" to enforce the policy. Set to "false" to "turn off" the policy. The policy will not be enforced even if it remains attached to a flow. |
async |
false | Deprecated | This attribute is deprecated. |
En la siguiente tabla, se proporciona una descripción de alto nivel de los elementos secundarios de <AssignMessage>
.
Elemento secundario | ¿Es obligatorio? | Descripción |
---|---|---|
Operaciones comunes | ||
<Add> |
Opcional | Agrega información al el objeto de mensaje que especifica el elemento <AssignTo> .
|
<Copy> |
Opcional | Copia información del mensaje especificado por el atributo source al objeto de mensaje especificado por el elemento <AssignTo> . |
<Remove> |
Opcional | Borra los elementos especificados de la variable de mensaje especificada en el elemento <AssignTo> . |
<Set> |
Opcional | Reemplaza los valores de las propiedades existentes en la solicitud o respuesta, que se especifica con el elemento <AssignTo> .
|
Otros elementos secundarios | ||
<AssignTo> |
Opcional | Especifica en qué mensaje opera la política AssignMessage. Puede ser la solicitud o la respuesta estándar, o puede ser un mensaje personalizado nuevo. |
<AssignVariable> |
Opcional | Asigna un valor a una variable de flujo. Si la variable no existe, <AssignVariable> la crea. |
<IgnoreUnresolvedVariables> |
Opcional | Determina si el procesamiento se detiene cuando se encuentra una variable sin resolver. |
Cada uno de estos elementos secundarios se describe en las siguientes secciones.
Ejemplos
En los siguientes ejemplos, se muestran algunas de las formas en las que puedes usar la políticaAssignMessage política:
1: Agrega encabezados
En el siguiente ejemplo, se agrega un encabezado a la solicitud con el elemento <Add>
:
<AssignMessage continueOnError="false" enabled="true" name="add-headers-1"> <Add> <Headers> <Header name="user-agent">{request.user.agent}</Header> </Headers> </Add> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
2: Quita la carga útil
En el siguiente ejemplo, se borra la carga útil de la respuesta con el elemento <Remove>
:
<AssignMessage continueOnError="false" enabled="true" name="remove-1"> <DisplayName>remove-1</DisplayName> <Remove> <Payload>true</Payload> </Remove> <AssignTo createNew="false" transport="http" type="response"/> </AssignMessage>
3: Modifica la respuesta
En el siguiente ejemplo, se modifica un objeto de respuesta existente cuando se le agrega un encabezado:
<AssignMessage name="modify-response"> <Set> <Headers> <Header name="Cache-Hit">{lookupcache.LookupCache-1.cachehit}</Header> </Headers> </Set> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> <AssignTo createNew="false" type="response"></AssignTo> </AssignMessage>
En este ejemplo, no se crea un mensaje nuevo. En su lugar, modifica un mensaje de respuesta existente mediante la adición de un encabezado HTTP.
Debido a que este ejemplo omite un nombre de variable en el elemento <AssignTo>
y especifica type
como "respuesta", esta política modifica el objeto de respuesta que muestra el servidor de destino.
El encabezado HTTP que esta política agrega al mensaje de respuesta se deriva de una variable propagado por la política LookupCache. Por lo tanto, el mensaje de respuesta modificado por La política de asignación de mensajes contiene un encabezado HTTP que indica si los resultados se extraída de la caché o no. Configurar encabezados en la respuesta puede ser útil para depurar y y la solución de problemas.
4: Configura el contenido dinámico
Puedes usar la asignación de mensajes para incorporar contenido dinámico en la carga útil de los mensajes de respuesta y solicitud.
Para incorporar variables de flujo perimetral en una carga útil XML, encierra la variable designada entre llaves, como en este ejemplo: {prefix.name}
.
En el siguiente ejemplo, se incorpora el valor de la variable de flujo del encabezado HTTP user-agent
en un elemento XML llamado User-agent
:
<AssignMessage name="set-dynamic-content"> <AssignTo createNew="false" type="response"></AssignTo> <Set> <Payload contentType="text/xml"> <User-agent>{request.header.user-agent}</User-agent> </Payload> </Set> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> </AssignMessage>
Para las cargas útiles JSON, puedes insertar variables usando los atributos variablePrefix
y variableSuffix
con caracteres delimitadores, como se muestra en el siguiente ejemplo:
<AssignMessage name="set-payload"> <Payload contentType="application/json" variablePrefix="@" variableSuffix="#"> { "user-agent": "@request.header.user-agent#" } </Payload> </AssignMessage>
Para obtener una lista completa de las variables de flujo, consulta Referencia de las variables de flujo.
A partir de la versión 16.08.17 de la nube, también puedes usar llaves para insertar variables.
5: Quita parámetros de búsqueda
En el siguiente ejemplo, se quita el parámetro de búsqueda apikey
de la solicitud:
<AssignMessage name="remove-query-param"> <Remove> <QueryParams> <QueryParam name="apikey"/> </QueryParams> </Remove> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
Se recomienda quitar el parámetro de consulta apikey
de la solicitud
cuando usas la política VerifyAPIKey para la autenticación de usuarios. Haces esto para evitar
información de clave sensible para evitar que se pase al destino del backend.
6: Obtén o configura variables
En el siguiente ejemplo, se usan tres políticas de asignación de mensajes:
- 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 en el flujo de solicitudes.
- Los establece en la carga útil de la respuesta.
<!-- Policy #1: Set variables in the request --> <AssignMessage continueOnError="false" enabled="true" name="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> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
En la primera política, el elemento <AssignVariable>
crea y establece tres variables en la solicitud. Cada elemento <Name>
especifica un nombre de variable, y <Value>
especifica el valor.
La segunda política usa el elemento <AssignVariable>
para leer los valores y crea tres variables nuevas:
<!-- Policy #2: Get variables from the request --> <AssignMessage continueOnError="false" enabled="true" name="get-variables"> <AssignTo createNew="false" transport="http" type="request"/> <!-- Get the value of myAppSecret and create a new variable, secret --> <AssignVariable> <Name>secret</Name> <Ref>myAppSecret</Ref> <Value>0</Value> </AssignVariable> <!-- Get the value of config.environment and create a new variable, environment --> <AssignVariable> <Name>environment</Name> <Ref>config.environment</Ref> <Value>default</Value> </AssignVariable> <!-- Get the value of config.protocol and create a new variable, protocol --> <AssignVariable> <Name>protocol</Name> <Ref>config.protocol</Ref> <Value>default</Value> </AssignVariable> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> </AssignMessage>
En la segunda política, el elemento <Ref>
hace referencia a la variable de origen y los elementos <Name>
especifican los nombres de las variables nuevas. Si la variable a la que hace referencia el elemento <Ref>
no es accesible, puedes usar el valor especificado por el elemento <Value>
.
Para probar este conjunto de políticas, haga lo siguiente:
- Agrega las políticas número 1 y 2 al flujo de solicitud. Asegúrate de poner la política número 1 antes de la política número 2.
- Agrega la tercera política en el flujo de respuesta.
- La tercera política usa el elemento
<Set>
para agregar las variables a la respuesta. El En el siguiente ejemplo, se construye una carga útil de XML en la respuesta que Edge le muestra al cliente:<!-- Policy #3: Add variables to the response --> <AssignMessage continueOnError="false" enabled="true" name="put-em-in-the-payload"> <DisplayName>put-em-in-the-payload</DisplayName> <Set> <Payload contentType="application/xml"> <wrapper> <secret>{secret}</secret> <config> <environment>{environment}</environment> <protocol>{protocol}</protocol> </config> </wrapper> </Payload> </Set> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="response"/> </AssignMessage>
Ten en cuenta que la sintaxis para acceder a las variables de flujo en
<Set>
es colocarlas entre llaves.Asegúrate de configurar el atributo
contentType
del elemento<Payload>
como "application/xml". - Envía una solicitud a tu proxy de API. por ejemplo:
curl -vL https://ahamilton-eval-test.apigee.net/myproxy
De manera opcional, puedes canalizar los resultados a través de una utilidad como
xmllint
, de modo que el XML se muestre en una estructura con formato adecuado:curl -vL https://ahamilton-eval-test.apigee.net/myproxy | xmllint --format -
El cuerpo de la respuesta debe verse de la siguiente manera:
<wrapper> <secret>42</secret> <config> <environment>test</environment> <protocol>gopher</protocol> </config> </wrapper>
7: Obtén encabezados de respuesta de texto destacado de servicios
En el siguiente ejemplo, supongamos que una política ServiceCallout está en la solicitud del proxy de API y la respuesta de texto destacado contiene varios encabezados con el mismo nombre (Set-Cookie
). Suponiendo que la variable de respuesta del texto destacado del servicio es la calloutResponse
predeterminada, la siguiente política obtiene el segundo valor de encabezado Set-Cookie
.
<AssignMessage continueOnError="false" enabled="true" name="get-header"> <Set> <Payload contentType="application/json"> {"Cookies from Service Callout":" {calloutResponse.header.Set-Cookie.2}"} </Payload> </Set> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
Para enumerar todos los valores de encabezado, usa la siguiente variable en su lugar:
{calloutResponse.header.Set-Cookie.values}
Cada elemento secundario en esta referencia tiene ejemplos adicionales. Para obtener aún más ejemplos, consulta el ejemplo de AssignMessage en GitHub.
Referencia del elemento secundario
En esta sección, se describen los elementos secundarios de <AssignMessage>
.
<Add>
Agrega información a la solicitud o respuesta, que se especifica mediante el elemento <AssignTo>
.
El elemento <Add>
agrega propiedades nuevas en el mensaje que no existe en el mensaje original. Para cambiar los valores de las propiedades existentes, usa el elemento <Set>
.
Valor predeterminado | N/A |
¿Es obligatorio? | Opcional |
Tipo | Tipo complejo |
Elemento principal |
<AssignMessage>
|
Elementos secundarios |
<FormParams> <Headers> <QueryParams> |
El elemento <Add>
usa la siguiente sintaxis:
Sintaxis
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <Add> <FormParams> <FormParam name="formparam_name">formparam_value</FormParam> ... </FormParams> <Headers> <Header name="header_name">header_value</Header> ... </Headers> <QueryParams> <QueryParam name="queryparam_name">queryparam_value</QueryParam> ... </QueryParams> </Add> </AssignMessage>
Ejemplo 1
En el ejemplo siguiente, se usa el elemento <FormParams>
para obtener los valores de tres parámetros de string de consulta de la solicitud inicial y configurarlos como parámetros de forma en la solicitud de extremo de destino:
<AssignMessage continueOnError="false" enabled="true" name="add-formparams-3"> <Add> <FormParams> <FormParam name="name">{request.queryparam.name}</FormParam> <FormParam name="zip">{request.queryparam.zipCode}</FormParam> <FormParam name="lang">{request.queryparam.lang}</FormParam> </FormParams> </Add> <AssignTo transport="http" type="request"/> </AssignMessage>
Ejemplo 2
En el siguiente ejemplo, se usa el elemento <Headers>
para agregar el encabezado User-Agent
a la solicitud de extremo de destino:
<AssignMessage continueOnError="false" enabled="true" name="add-headers-1"> <Add> <Headers> <Header name="user-agent">{request.user.agent}</Header> </Headers> </Add> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
Ejemplo 3
En el siguiente ejemplo, se usa el elemento <QueryParams>
para agregar un solo parámetro de búsqueda con un valor estático a la solicitud:
<AssignMessage continueOnError="false" enabled="true" name="add-queryparams-1"> <Add> <QueryParams> <QueryParam name="myParam">42</QueryParam> </QueryParams> </Add> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
En este ejemplo, se usa <Add>
en el flujo previo de la solicitud. Si observas los resultados
como la herramienta de seguimiento, la solicitud a "http://httpbin.org/get" se convierte en
"http://httpbin.org/get?myParam=42".
Los elementos secundarios de <Add>
admiten la reemplazo de strings dinámicas, conocida como plantilla de mensajes.
<FormParams>
(secundario de <Add>
)
Agrega parámetros nuevos del formulario al mensaje de la solicitud. Este elemento no tiene efecto en un mensaje de respuesta.
Valor predeterminado | N/A |
¿Es obligatorio? | Opcional |
Tipo | Arreglo de elementos <FormParam> |
Elemento principal |
<Add>
|
Elementos secundarios |
<FormParam> |
El elemento <FormParams>
usa la siguiente sintaxis:
Sintaxis
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <Add> <FormParams> <FormParam name="formparam_name">formparam_value</FormParam> ... </FormParams> <AssignTo createNew="[true|false]" transport="http" type="[request|response]">destination_variable_name</AssignTo> </Add> </AssignMessage>
Ejemplo 1
En el ejemplo siguiente se agrega un solo parámetro de forma (“respuesta”) y un valor estático (“42”) a la solicitud:
<AssignMessage continueOnError="false" enabled="true" name="add-formparams-1"> <Add> <FormParams> <FormParam name="answer">42</FormParam> </FormParams> </Add> <AssignTo transport="http" type="request"></AssignTo> </AssignMessage>
Ejemplo 2
En el siguiente ejemplo, se obtiene el valor del parámetro de string de consulta name
y se agrega a la solicitud como un parámetro de formulario:
<AssignMessage continueOnError="false" enabled="true" name="add-formparams-2"> <Add> <FormParam name="name">{request.queryparam.name}</FormParam> </Add> </AssignMessage>
Ten en cuenta que en este ejemplo no se especifica un objetivo con <AssignTo>
. Esta política solo agrega el parámetro a la solicitud.
Ejemplo 3
En el siguiente ejemplo, se agregan varios parámetros de formulario a la solicitud:
<AssignMessage continueOnError="false" enabled="true" name="add-formparams-3"> <Add> <FormParams> <FormParam name="name">{request.queryparam.name}</FormParam> <FormParam name="zip">{request.queryparam.zipCode}</FormParam> <FormParam name="lang">{request.queryparam.lang}</FormParam> </FormParams> </Add> <AssignTo transport="http" type="request"/> </AssignMessage>
En este ejemplo, se obtienen los parámetros de la string de consulta de la solicitud original y se los agrega como parámetros a la solicitud enviada al extremo de destino.
Puedes usar la herramienta de seguimiento para ver el flujo. Verás que el cuerpo de la solicitud contiene los datos del formulario con codificación URL, que se pasaron originalmente como parámetros de string de consulta:
%7Busername%7D=nick&%7Bzip_code%7D=90210&%7Bdefault_language%7D=en
Solo puedes usar <FormParams>
cuando se cumplan los siguientes criterios:
- Verbo HTTP: POST
- Tipo de mensaje: solicitud
- Uno (o ambos) de los siguientes elementos:
- Datos del formulario: establecidos en algún valor o "" (la string está vacía). Por ejemplo, con
curl
, agrega-d ""
a tu solicitud. - Encabezado
Content-Length
: Se establece en 0 (si no hay datos en la solicitud original; de lo contrario, la longitud actual, en bytes). Por ejemplo, concurl
, agrega-H "Content-Length: 0"
a tu solicitud.
- Datos del formulario: establecidos en algún valor o "" (la string está 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 agregas <FormParams>
, Edge establece el encabezado Content-Type
de la solicitud en
"application/x-www-form-urlencoded" antes de enviar el mensaje al servicio de destino.
<Headers>
(secundario de <Add>
)
Agrega encabezados nuevos a la solicitud o respuesta especificadas, que se especifica mediante el elemento <AssignTo>
.
Valor predeterminado | N/A |
¿Es obligatorio? | Opcional |
Tipo | Arreglo de elementos <Header> |
Elemento principal |
<Add>
|
Elementos secundarios |
<Header> |
El elemento <Headers>
usa la siguiente sintaxis:
Sintaxis
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <Add> <Headers> <Header name="header_name">header_value</Header> ... </Headers> </Add> </AssignMessage>
Ejemplo 1
En el siguiente ejemplo, se agrega el encabezado user-agent
al mensaje de solicitud y se asigna el valor de la variable de flujo request.user.agent
a ese encabezado.
<AssignMessage continueOnError="false" enabled="true" name="add-headers-1"> <Add> <Headers> <Header name="user-agent">{request.user.agent}</Header> </Headers> </Add> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
<QueryParams>
(secundario de <Add>
)
Agrega nuevos parámetros de búsqueda a la solicitud. Este elemento no tiene efecto en una respuesta.
Valor predeterminado | N/A |
¿Es obligatorio? | Opcional |
Tipo | Arreglo de elementos <QueryParam> |
Elemento principal |
<Add>
|
Elementos secundarios |
<QueryParam> |
El elemento <QueryParams>
usa la siguiente sintaxis:
Sintaxis
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <Add> <QueryParams> <QueryParam name="queryparam_name">queryparam_value</QueryParam> ... </QueryParams> </Add> </AssignMessage>
Ejemplo 1
En el siguiente ejemplo, se agrega el parámetro de búsqueda "myParam" a la solicitud y se le asigna el valor "42":
<AssignMessage continueOnError="false" enabled="true" name="add-queryparams-1"> <Add> <QueryParams> <QueryParam name="myParam">42</QueryParam> </QueryParams> </Add> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
Solo puedes usar <QueryParams>
cuando se cumplan los siguientes criterios:
- Verbo HTTP: GET
- Tipo de mensaje: solicitud
Además, solo puedes establecer parámetros de búsqueda cuando el atributo type
del elemento <AssignTo>
es un mensaje de solicitud. Configurarlos en la respuesta no causa ningún efecto.
Si defines un arreglo vacío de parámetros de búsqueda en tu política (<Add><QueryParams/></Add>
), la política no agrega ningún parámetro de búsqueda. Esto es lo mismo que omitir <QueryParams>
.
<AssignTo>
Determina en qué objeto funciona la política de AssignMessage. Las opciones son las siguientes:
- Mensaje de la solicitud: La
request
que recibe el proxy de API - Mensaje de respuesta: La
response
que muestra el servidor de destino - Mensaje personalizado: Un objeto de solicitud o respuesta personalizado
Ten en cuenta que, en algunos casos, no puedes cambiar el objeto en el que actúa la política de AssignMessage.
Por ejemplo, no puedes usar <Add>
o <Set>
para agregar o cambiar parámetros de búsqueda (<QueryParams>
) o parámetros de formulario (<FormParams>
) en la respuesta. Solo puedes manipular parámetros de búsqueda y parámetros de formulario en la solicitud.
Valor predeterminado | N/A |
¿Es obligatorio? | Opcional |
Tipo | String |
Elemento principal |
<AssignMessage>
|
Elementos secundarios | Ninguno |
Si no especificas <AssignTo>
, la política actúa en la solicitud o respuesta predeterminada, que se basa en la ubicación donde se ejecuta la política. Si la política se ejecuta en el flujo de la solicitud, afecta el mensaje de la solicitud. Si se ejecuta en el flujo de respuesta, la política afecta la respuesta de forma predeterminada.
El elemento <AssignTo>
usa la siguiente sintaxis:
Sintaxis
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <AssignTo createNew="[true|false]" transport="http" type="[request|response]">destination_variable_name</AssignTo> </AssignMessage>
Ejemplo 1
En el siguiente ejemplo, se especifica que el destino es la solicitud original que se enviará al extremo de destino:
<AssignMessage name="assignto-1"> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
Al configurar createNew
como "falso" (el valor predeterminado), este ejemplo no crea una solicitud nueva. Todas las operaciones de esta política afectan la solicitud original.
Ejemplo 2
En el siguiente ejemplo, se crea un objeto de solicitud nuevo:
<AssignMessage name="assignto-2"> <AssignTo createNew="true" transport="http" type="request"/> </AssignMessage>
Cuando creas una solicitud o un objeto de respuesta nuevos, los demás elementos de la políticaAssignMessage
política (como <Add>
, <Set>
y <Set>
) actuarán según ese nuevo
request.
Puedes acceder al nuevo objeto de solicitud en otras políticas más adelante en el flujo o enviar el objeto de solicitud nuevo a un servicio externo con una política ServiceCallout.
Ejemplo 3
En el ejemplo siguiente, se crea un objeto de solicitud nuevo llamado "MyRequestObject":
<AssignMessage name="assignto-2"> <AssignTo createNew="true" transport="http" type="request">MyRequestObject</AssignTo> </AssignMessage>
Cuando creas una solicitud o un objeto de respuesta nuevos, los demás elementos de la políticaAssignMessage
política (como <Add>
, <Set>
y <Set>
) actuarán según ese nuevo
request.
Puedes acceder al nuevo objeto de solicitud en otras políticas más adelante en el flujo o enviar el objeto de solicitud nuevo a un servicio externo con una política ServiceCallout.
En la siguiente tabla, se describen los atributos de <AssignTo>
:
Atributo | Descripción | ¿Es obligatorio? | Tipo |
---|---|---|---|
createNew |
Determina si esta política crea un mensaje nuevo cuando asigna valores. Si es "true", la política crea una nueva variable del tipo
especificadas por Si es "false", la política responde de dos maneras:
Si no se especifica
|
Opcional | Booleano |
transport |
Especifica el tipo de transporte del tipo de mensaje de solicitud o respuesta. El valor predeterminado es "http" (el único valor admitido). |
Opcional | String |
type |
Especifica el tipo de mensaje nuevo, cuando createNew es "true". Los valores válidos son “solicitud” o “respuesta”.
El valor predeterminado es "request". Si omites este atributo, Edge creará una solicitud o una respuesta, según en qué parte del flujo se ejecute esta política. |
Opcional | String |
<AssignVariable>
Asigna un valor a una variable de flujo de destino (p.ej., una variable cuyo valor lo establece el
la política deAssignMessage). Si la variable de flujo no existe, <AssignVariable>
la crea.
Valor predeterminado | N/A |
¿Es obligatorio? | Opcional |
Tipo | Tipo complejo |
Elemento principal |
<AssignMessage>
|
Elementos secundarios |
<Name> (obligatorio)<Ref> <Template> <Value> |
El valor que asignes a la variable de flujo de destino puede ser uno de los siguientes:
- String literal: usa el elemento secundario
<Value>
para especificar un valor de string literal para la variable de flujo de destino. - Variable de flujo: Usa el elemento secundario
<Ref>
a fin de especificar el valor de una variable de flujo existente para la variable de flujo de destino. Para obtener una lista completa de las variables de flujo que se pueden usar como fuente, consulta Referencia de variables de flujo. - Plantilla de mensaje: Usa el elemento secundario
<Template>
para especificar una plantilla de mensajes para la variable de flujo de destino.
El elemento <AssignVariable>
usa la siguiente sintaxis:
Sintaxis
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <AssignVariable> <Name>variable_name</Name> <Ref>source_variable</Ref> <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 el botón
No se puede acceder a la variable a la que hace referencia <Ref>
, Edge usa el valor
especificadas por el elemento <Value>
. Si defines <Template>
, tiene prioridad sobre los otros elementos secundarios.
Ejemplo 1
En el siguiente ejemplo, se establece el valor de una nueva variable, myvar
, en el valor literal "42":
<AssignMessage name="assignvariable-1"> <AssignVariable> <Name>myvar</Name> <Value>42</Value> </AssignVariable> </AssignMessage>
Ejemplo 2
En el siguiente ejemplo, se asigna el valor de la variable de flujo request.header.user-agent
a la variable de flujo de destino myvar
y el valor del parámetro de búsqueda country
a la variable de flujo de destino Country
:
<AssignMessage name="assignvariable-2"> <AssignVariable> <Name>myvar</Name> <Ref>request.header.user-agent</Ref> <Value>ErrorOnCopy</Value> </AssignVariable> <AssignVariable> <Name>Country</Name> <Ref>request.queryparam.country</Ref> <Value>ErrorOnCopy</Value> </AssignVariable> </AssignMessage>
Si falla alguna de las asignaciones, Edge le asigna el valor "ErrorOnCopy" en su lugar. a la variable del flujo de destino.
Si las variables de flujo myvar
o Country
no existen, <AssignVariable>
las crea.
Ejemplo 3
En el siguiente ejemplo, se usa el elemento secundario <Template>
para concatenar dos variables de contexto con una string literal (un guion) entre ellas:
<AssignMessage name='template-1'> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> <AssignVariable> <Name>my_destination_variable</Name> <Value>BADDBEEF</Value> <Template>{system.uuid}-{messageid}</Template> </AssignVariable> </AssignMessage>
Un uso común de <AssignVariable>
es establecer un valor predeterminado para un parámetro de búsqueda, un encabezado o cualquier otro valor que se pueda pasar con la solicitud. Puedes hacerlo con una combinación de los elementos secundarios <Ref>
y <Value>
. Para obtener más información, consulta los ejemplos de <Ref>
.
<Name>
(secundario de <AssignVariable>
)
Especifica el nombre de la variable de flujo de destino (p.ej., la variable cuyo valor lo establece
la política deAssignMessage). Si la variable con un nombre asignado en <AssignVariable>
no existe, la política crea una con ese nombre.
Valor predeterminado | N/A |
¿Es obligatorio? | Obligatorio |
Tipo | String |
Elemento principal |
<AssignVariable>
|
Elementos secundarios | Ninguna |
El elemento <Name>
usa la siguiente sintaxis:
Sintaxis
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <AssignVariable> <Name>variable_name</Name> </AssignVariable> </AssignMessage>
Ejemplo 1
En el siguiente ejemplo, se especifica la variable de destino como myvar
y se establece en el valor literal “42”:
<AssignMessage name="assignvariable-1"> <AssignVariable> <Name>myvar</Name> <Value>42</Value> </AssignVariable> </AssignMessage>
Si myvar
no existe, <AssignVariable>
lo crea.
<Ref>
(secundario de <AssignVariable>
)
Especifica el origen de la asignación como una variable de flujo. La variable de flujo puede ser una de las variables de flujo predefinidas (como se indica en la referencia de variables de flujo) o una variable de flujo personalizada que creaste.
El valor de <Ref>
siempre se interpreta como una variable de flujo. No puedes especificar una string literal como valor. Para asignar un valor de string literal, usa el elemento <Value>
en su lugar.
Valor predeterminado | N/A |
¿Es obligatorio? | Opcional |
Tipo | String |
Elemento principal |
<AssignVariable>
|
Elementos secundarios | Ninguno |
Cuando especificas una variable de flujo con <Ref>
, omite los corchetes "{}" que normalmente usarías para hacer referencia a una variable de flujo. Por ejemplo, para configurar el valor de tu variable nueva con el valor de la variable de flujo client.host
:
Do this (no brackets): <Ref>client.host</Ref> Do NOT do this (brackets): <Ref>{client.host}</Ref>
Si quieres definir un valor predeterminado para la variable de flujo de destino, usa <Value>
en combinación con <Ref>
. Si la variable de flujo especificada por
<Ref>
no existe, no se puede leer o es nulo, por lo que Edge le asigna el valor.
de <Value>
a la variable del flujo de destino.
El elemento <Ref>
usa la siguiente sintaxis:
Sintaxis
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <AssignVariable> <Name>variable_name</Name> <Ref>source_variable</Ref> </AssignVariable> </AssignMessage>
Ejemplo 1
En el siguiente ejemplo, se asigna el valor de la variable de flujo request.header.user-agent
a la variable de flujo de destino myvar
y el valor del parámetro de búsqueda country
a la variable Country
:
<AssignMessage name="assignvariable-4"> <AssignVariable> <Name>myvar</Name> <Ref>request.header.user-agent</Ref> </AssignVariable> <AssignVariable> <Name>Country</Name> <Ref>request.queryparam.country</Ref> </AssignVariable> </AssignMessage>
En este ejemplo, Edge no tiene un valor predeterminado (o de resguardo) especificado para asignación.
Ejemplo 2
En el siguiente ejemplo, se asigna el valor de la variable de flujo request.header.user-agent
a la variable de flujo de destino myvar
y el valor del parámetro de búsqueda country
a la variable Country
:
<AssignMessage name="assignvariable-2"> <AssignVariable> <Name>myvar</Name> <Ref>request.header.user-agent</Ref> <Value>ErrorOnCopy</Value> </AssignVariable> <AssignVariable> <Name>Country</Name> <Ref>request.queryparam.country</Ref> <Value>ErrorOnCopy</Value> </AssignVariable> </AssignMessage>
En este ejemplo, si los valores de la variable de flujo request.header.user-agent
o los parámetros de consulta Country
son nulos, ilegibles o tienen errores de formato, Edge asigna
el valor "ErrorOnCopy" a las nuevas variables.
Ejemplo 3
Un caso de uso común para <AssignVariable>
es establecer el valor predeterminado de un parámetro de consulta, un encabezado o cualquier otro valor que se pueda pasar con la solicitud. Por ejemplo, puedes crear
un proxy de la API del clima en el que la solicitud toma un parámetro de consulta único llamado "w". Este parámetro contiene el ID de la ciudad para la que deseas obtener el clima. La URL de la solicitud tiene el siguiente formato:
http://myCO.com/v1/weather/forecastrss?w=city_ID
Para definir un valor predeterminado para "w", crea una política deAssignMessage como lo siguiente:
<AssignMessage continueOnError="false" enabled="true" name="assignvariable-3"> <AssignTo createNew="false" transport="http" type="request"/> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignVariable> <Name>request.queryparam.w</Name> <Ref>request.queryparam.w</Ref> <Value>12797282</Value> </AssignVariable> </AssignMessage>
En este ejemplo, <AssignVariable>
obtiene el valor de request.queryparam.w
y lo asigna a sí mismo. Si la variable de flujo es nula, es decir, la “w” el parámetro de consulta era
omitido de la solicitud, en este ejemplo se usa el valor predeterminado de la
elemento <Value>
. Por lo tanto, puedes realizar una solicitud a esta API
proxy que omite la "w" Parámetro de consulta:
http://myCO.com/v1/weather/forecastrss
…y aún el proxy de API mostrará un resultado válido.
A diferencia del uso del <Value>
, el valor de<Ref>
debe ser una variable de flujo, como una propiedad de un objeto request
, response
o target
. El valor también puede ser una variable de flujo personalizada que creaste.
Si especificas una variable de flujo que no existe para el valor de <Ref>
,
Si el valor de <IgnoreUnresolvedVariables>
es "true", Edge arroja un error.
<Template>
(secundario de <AssignVariable>
)
Especifica una plantilla de mensaje. Una plantilla de mensaje te permite realizar sustituciones de strings variables cuando se ejecuta la política y puedes combinar strings literales con nombres de variables entre llaves. Además, las plantillas de mensajes admiten funciones, como el escape y la conversión de casos.
Usa el atributo ref
para especificar una variable de flujo en la que el valor de la variable sea una plantilla de mensaje. Por ejemplo, podrías almacenar una plantilla de mensaje como
atributo personalizado
en una app de desarrollador. Cuando Edge identifica la app de desarrollador después de verificar la clave de API
o un token de seguridad (mediante una política adicional), el <AssignVariable>
puede usar la plantilla de mensaje del atributo personalizado de la app, que está disponible
como una variable de flujo de la política de seguridad. En el siguiente ejemplo, suponemos que la plantilla de mensaje está disponible en un atributo de cliente llamado message_template
en la app para desarrolladores y realiza la llamada a la API, en el que la Política de VerifyAPIKey se usó para verificar la clave de API de la app:
<AssignVariable ref='verifyapikey.myVerifyAPIKeyPolicy.app.name.message_template'/>
Valor predeterminado | N/A |
¿Es obligatorio? | Opcional |
Tipo | String |
Elemento principal |
<AssignVariable>
|
Elementos secundarios | Ninguna |
El elemento <Template>
usa la siguiente sintaxis:
Sintaxis
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <AssignVariable> <Template>message_template</Template> or <Template ref='template_variable'></Template> </AssignVariable> </AssignMessage>
Ejemplo 1
En el ejemplo siguiente, se usa la sintaxis de plantillas de mensajes para concatenar dos variables de contexto con una string literal (un guion) entre ellas:
<AssignMessage name='template-1'> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> <AssignVariable> <Name>my_destination_variable</Name> <Value>BADDBEEF</Value> <Template>{system.uuid}-{messageid}</Template> </AssignVariable> </AssignMessage>
Ejemplo 2
En el siguiente ejemplo, se especifica una variable de flujo, en la que el valor de la variable es una plantilla de mensaje predefinida. Usa esta opción si deseas incorporar una plantilla predefinida en el entorno de ejecución sin tener que modificar la política:
<AssignMessage name='template-2'> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> <AssignVariable> <Name>my_destination_variable</Name> <Value>BADDBEEF</Value> <Template ref='my_template_variable'/> </AssignVariable> </AssignMessage>
Ejemplo 3
En el siguiente ejemplo, se especifica una variable de flujo y un valor de texto. En este caso, si la variable a la que se hace referencia no es nula, ese valor se usa como plantilla. Si el valor al que se hace referencia es nulo, se usa el valor de texto (en este caso, {system.uuid}-{messageid}
) como plantilla. Este patrón es útil para proporcionar un valor de valor, en el que
En algunos casos, es conveniente anular la plantilla predeterminada (la parte de texto) con valores
que se configuran dinámicamente. Por ejemplo, una instrucción condicional puede obtener un valor de un mapa de clave-valor y establecer la variable a la que se hace referencia en ese valor:
<AssignMessage name='template-2'> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> <AssignVariable> <Name>my_destination_variable</Name> <Value>BADDBEEF</Value> <Template ref='my_variable'>{system.uuid}-{messageid}</Template> </AssignVariable> </AssignMessage>
<Value>
(secundario de <AssignVariable>
)
Define el valor de la variable de flujo de destino establecida con <AssignVariable>
. El valor siempre se interpreta como una string literal. No puedes usar una variable de flujo como valor, incluso si encierras el valor entre corchetes ("{}"). Para usar una variable de flujo, usa <Ref>
en su lugar.
Valor predeterminado | N/A |
¿Es obligatorio? | Opcional |
Tipo | String |
Elemento principal |
<AssignVariable>
|
Elementos secundarios | Ninguno |
Cuando se usa en combinación con el elemento <Ref>
, <Value>
actúa como el valor predeterminado (o de resguardo). Si no se especifica <Ref>
, no se puede resolver o es nulo, se usará el valor de <Value>
.
El elemento <Value>
usa la siguiente sintaxis:
Sintaxis
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <AssignVariable> <Name>variable_name</Name> <Value>variable_value</Value> </AssignVariable> </AssignMessage>
Ejemplo 1
En el siguiente ejemplo, se establece el valor de la variable del flujo de destino, myvar
,
al valor literal “42”:
<AssignMessage name="assignvariable-1"> <AssignVariable> <Name>myvar</Name> <Value>42</Value> </AssignVariable> </AssignMessage>
Ejemplo 2
En el siguiente ejemplo, se asigna el valor de la variable de flujo request.header.user-agent
a la variable de flujo myvar
y el valor del parámetro de búsqueda country
a la variable Country
:
<AssignMessage name="assignvariable-2"> <AssignVariable> <Name>myvar</Name> <Ref>request.header.user-agent</Ref> <Value>ErrorOnCopy</Value> </AssignVariable> <AssignVariable> <Name>Country</Name> <Ref>request.queryparam.country</Ref> <Value>ErrorOnCopy</Value> </AssignVariable> </AssignMessage>
Si alguna de las asignaciones falla, <AssignVariable>
asigna el valor “ErrorOnCopy” a la variable de flujo de destino.
<Copy>
Copia valores desde el mensaje especificado por el atributo source
en el mensaje especificado por el elemento <AssignTo>
. Si no especificas un destino con <AssignTo>
, esta política copia los valores en la solicitud o la respuesta, según en qué parte del flujo se ejecute esta política.
Valor predeterminado | N/A |
¿Es obligatorio? | Opcional |
Tipo | String |
Elemento principal |
<AssignMessage>
|
Elementos secundarios |
<FormParams> <Headers> <Path> <Payload> <QueryParams> <ReasonPhrase> <StatusCode> <Verb> <Version> |
El elemento <Copy>
usa la siguiente sintaxis:
Sintaxis
<AssignMessage
continueOnError="[false|true]"
enabled="[true|false]"
name="policy_name" >
<Copy source="[request|response]">
<!-- Can also be an empty array (<FormParams/>) -->
<FormParams>
<FormParam name="formparam_name">formparam_value</FormParam>
...
</FormParams>
<!-- Can also be an empty array (<Headers/>) -->
<Headers>
<Header name="header_name">header_value</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>
<ReasonPhrase>[false|true]</ReasonPhrase>
<StatusCode>[false|true]</StatusCode>
<Verb>[false|true]</Verb>
<Version>[false|true]</Version>
</Copy>
<!-- Used as the destination for the <Copy>
values -->
<AssignTo createNew="[true|false]" transport="http"
type="[request|response]">destination_variable_name</AssignTo>
</AssignMessage>
Ejemplo 1
En el siguiente ejemplo, se copia un encabezado, tres parámetros de formulario, la ruta y todos los parámetros de búsqueda desde la solicitud a una nueva solicitud personalizada:
<AssignMessage continueOnError="false" enabled="true" name="copy-1"> <Copy source="request"> <Headers> <Header name="Header_Name_1">Header value 1</Header> </Headers> <FormParams> <FormParam name="Form_Param_Name_1">Form param value 1</FormParam> <FormParam name="Form_Param_Name_2">Form param value 1</FormParam> <FormParam name="Form_Param_Name_3">Form param value 1</FormParam> </FormParams> <Payload>false</Payload> <Path>true</Path> <QueryParams/> <ReasonPhrase>false</ReasonPhrase> <StatusCode>false</StatusCode> <Verb>false</Verb> <Version>false</Version> </Copy> <AssignTo createNew="true" transport="http" type="request"/> </AssignMessage>
El elemento <Copy>
tiene los siguientes atributos:
Atributo | Descripción | ¿Es obligatorio? | Tipo |
---|---|---|---|
origen |
Especifica el objeto de origen de la copia.
|
Opcional | String |
<FormParams>
(secundario de <Copy>
)
Copia los parámetros del formulario de la solicitud especificada por el atributo source
del elemento <Copy>
en la solicitud especificada por el elemento <AssignTo>
. Este elemento no causa ningún efecto en una respuesta.
Valor predeterminado | N/A |
¿Es obligatorio? | Opcional |
Tipo | Arreglo de elementos <FormParam> o un arreglo vacío |
Elemento principal |
<Copy>
|
Elementos secundarios |
<FormParam> |
El elemento <FormParams>
usa la siguiente sintaxis:
Sintaxis
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <Copy source="[request|response]"> <!-- 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="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="copy-formparams-2"> <Copy source="request"> <FormParams/> </Copy> <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo> </AssignMessage>
Ejemplo 3
En el siguiente ejemplo, se copian tres parámetros de formulario en la solicitud personalizada “MyCustomRequest”:
<AssignMessage name="copy-formparams-3"> <Copy source="request"> <FormParams> <FormParam name="paramName1"/> <FormParam name="paramName2"/> <FormParam name="paramName3"/> </FormParams> </Copy> <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo> </AssignMessage>
Ejemplo 4
Si hay varios parámetros de formulario con el mismo nombre, utiliza la siguiente sintaxis:
<AssignMessage name="copy-formparams-4"> <Copy source="request"> <FormParams> <FormParam name="f1"/> <FormParam name="f2"/> <FormParam name="f3.2"/> </FormParams> </Copy> <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo> </AssignMessage>
En este ejemplo, se copia "f1", "f2" y el segundo valor de "f3". Si "f3" tiene un solo valor, no se copia.
Solo puedes usar <FormParams>
cuando se cumplan los siguientes criterios:
- Verbo HTTP: POST
- Tipo de mensaje: Respuesta
- Uno (o ambos) de los siguientes elementos:
- Datos del formulario: establecidos en algún valor o "" (la string está vacía). Por ejemplo, con
curl
, agrega-d ""
a tu solicitud. - Encabezado
Content-Length
: Se establece en 0 (si no hay datos en la solicitud original; de lo contrario, la longitud actual). Por ejemplo, concurl
, agrega-H "Content-Length: 0"
a tu solicitud.
- Datos del formulario: establecidos en algún valor o "" (la string está vacía). Por ejemplo, con
Cuando copias <FormParams>
, <Copy>
establece el Content-Type
del mensaje en "application/x-www-form-urlencoded" antes de enviar el mensaje al servicio de destino.
<Headers>
(secundario de <Copy>
)
Copia encabezados HTTP de del mensaje de respuesta o solicitud que especifica el atributo source
del elemento <Copy>
en el mensaje de respuesta o solicitud que especifica el elemento <AssignTo>
.
Valor predeterminado | N/A |
¿Es obligatorio? | Opcional |
Tipo | Un arreglo de elementos <Header> o un arreglo vacío |
Elemento principal |
<Copy>
|
Elementos secundarios |
<Header> |
El elemento <Headers>
usa la siguiente sintaxis:
Sintaxis
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <Copy source="[request|response]"> <!-- Can also be an empty array (<Headers/>) --> <Headers> <Header name="header_name">header_value</Header> ... </Headers> </Copy> </AssignMessage>
Ejemplo 1
En el siguiente ejemplo, se copia el encabezado user-agent
de la solicitud en el objeto de solicitud nuevo:
<AssignMessage name="copy-headers-1"> <Copy source="request"> <Headers> <Header name="user-agent"/> </Headers> </Copy> <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo> </AssignMessage>
Ejemplo 2
Para copiar todos los encabezados, usa un elemento <Headers>
vacío, como se muestra en el siguiente ejemplo:
<AssignMessage name="copy-headers-2"> <Copy source="request"> <Headers/> </Copy> <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo> </AssignMessage>
Ejemplo 3
Si hay varios encabezados con el mismo nombre, usa la siguiente sintaxis:
<AssignMessage name="copy-headers-3"> <Copy source="request"> <Headers> <Header name="h1"/> <Header name="h2"/> <Header name="h3.2"/> </Headers> </Copy> <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo> </AssignMessage>
En este ejemplo, se copia "h1", "h2" y el segundo valor de "h3". Si "h3" tiene solo un valor, no se copia.
<Path>
(secundario de <Copy>
)
Determina si la ruta se debe copiar desde la solicitud de origen a la solicitud de destino. Este elemento no tiene efecto en una respuesta.
Si se configura como "true", esta política copia la ruta de acceso desde el mensaje de solicitud especificado por el atributo source
del elemento <Copy>
en el mensaje de solicitud especificado por el elemento <AssignTo>
.
Valor predeterminado | Falso |
¿Es obligatorio? | Opcional |
Tipo | Booleano |
Elemento principal |
<Copy>
|
Elementos secundarios | Ninguna |
El elemento <Path>
usa la siguiente sintaxis:
Sintaxis
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <Copy source="[request|response]"> <Path>[false|true]</Path> </Copy> </AssignMessage>
Ejemplo 1
En el siguiente ejemplo, se indica que la políticaAssignMessage debe copiar la ruta de acceso desde la fuente solicitud 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 <Path>
cuando se cumplan los siguientes criterios:
- Tipo de mensaje: solicitud
<Payload>
(secundario de <Copy>
)
Determina si la carga útil se debe copiar de la fuente al destino. El origen y el destino pueden ser solicitudes o respuestas.
Si es "true", esta política copia la carga útil desde el mensaje especificado por el atributo source
del elemento <Copy>
al mensaje especificado por el elemento <AssignTo>
.
Valor predeterminado | Falso |
¿Es obligatorio? | Opcional |
Tipo | Booleano |
Elemento principal |
<Copy>
|
Elementos secundarios | Ninguna |
El elemento <Payload>
usa la siguiente sintaxis:
Sintaxis
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <Copy source="[request|response]"> <Payload>[false|true]</Payload> </Copy> </AssignMessage>
Ejemplo 1
En el siguiente ejemplo, se configura <Payload>
como “verdadero”. para que la carga útil de la solicitud sea
copiado de la solicitud a la respuesta:
<AssignMessage name="copy-payload-1"> <Copy source="request"> <Payload>true</Payload> </Copy> <AssignTo createNew="true" transport="http" type="response"/> </AssignMessage>
<QueryParams>
(secundario de <Copy>
)
Copia los parámetros del formulario de la solicitud especificada por el atributo source
del elemento <Copy>
a la solicitud especificada por el elemento <AssignTo>
. Este elemento no tiene efecto en una respuesta.
Valor predeterminado | N/A |
¿Es obligatorio? | Opcional |
Tipo | Un arreglo de elementos <QueryParam> o un arreglo vacío |
Elemento principal |
<QueryParam>
|
Elementos secundarios | Ninguna |
El elemento <QueryParams>
usa la siguiente sintaxis:
Sintaxis
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <Copy source="[request|response]"> <!-- Can also be an empty array (<QueryParams/>) --> <QueryParams> <QueryParam name="queryparam_name">queryparam_value</QueryParam> ... </QueryParams> </Copy> </AssignMessage>
Ejemplo 1
En el siguiente ejemplo, se copia el parámetro de búsqueda "my_param" de la solicitud a 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 siguiente ejemplo, se copian todos los parámetros de búsqueda de la solicitud en un nuevo objeto de solicitud personalizado:
<AssignMessage name="copy-queryparams-2"> <Copy source="request"> <QueryParams/> </Copy> <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo> </AssignMessage>
Ejemplo 3
Si hay varios parámetros de búsqueda con el mismo nombre, usa la siguiente sintaxis:
<AssignMessage name="copy-queryparams-3"> <Copy source="request"> <QueryParams> <QueryParam name="qp1"/> <QueryParam name="qp2"/> <QueryParam name="qp3.2"/> </QueryParams> </Copy> <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo> </AssignMessage>
En este ejemplo, se copia "qp1", "qp2" y el segundo valor de "qp3". Si "qp3" tiene un solo valor, no se copia.
Solo puedes usar <QueryParams>
cuando se cumplan los siguientes criterios:
- Verbo HTTP: GET
- Tipo de mensaje: solicitud
<ReasonPhrase>
(secundario de <Copy>
)
Determina si la frase de motivo se debe copiar de la respuesta de origen a la respuesta de destino. Este elemento no causa ningún efecto en una solicitud.
Si es "true", esta política copia el ReasonPhrase
de la respuesta especificada por el atributo source
del elemento <Copy>
en la respuesta especificada por el elemento <AssignTo>
.
Valor predeterminado | Falso |
¿Es obligatorio? | Opcional |
Tipo | Booleano |
Elemento principal |
<Copy>
|
Elementos secundarios | Ninguna |
El elemento <ReasonPhrase>
usa la siguiente sintaxis:
Sintaxis
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <Copy source="[request|response]"> <ReasonPhrase>[false|true]</ReasonPhrase> </Copy> </AssignMessage>
Ejemplo 1
En el siguiente ejemplo, se establece <ReasonPhrase>
en “true”, lo que hace que <Copy>
copie la frase de la razón de la respuesta predeterminada en un objeto de respuesta personalizado:
<AssignMessage name="copy-reasonphrase-1"> <Copy source="response"> <ReasonPhrase>true</ReasonPhrase> </Copy> <AssignTo createNew="trie" transport="http" type="response">MyCustomResponse</AssignTo> </AssignMessage>
Solo puedes usar <ReasonPhrase>
cuando se cumplan los siguientes criterios:
- Tipo de mensaje: Respuesta
<StatusCode>
(secundario de <Copy>
)
Determina si el código de estado se copia de la respuesta de origen a la respuesta de destino. Este elemento no causa ningún efecto en una solicitud.
Si es "true", esta política copia el código de estado del mensaje de respuesta especificado por el atributo source
del elemento <Copy>
en el mensaje de respuesta especificado por el elemento <AssignTo>
.
Valor predeterminado | Falso |
¿Es obligatorio? | Opcional |
Tipo | Booleano |
Elemento principal |
<Copy>
|
Elementos secundarios | Ninguna |
El elemento <StatusCode>
usa la siguiente sintaxis:
Sintaxis
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <Copy source="[request|response]"> <StatusCode>[false|true]</StatusCode> </Copy> </AssignMessage>
Ejemplo 1
En el siguiente ejemplo, se configura <StatusCode>
como “verdadero”, que copia el código de estado.
del objeto de respuesta predeterminado a un nuevo 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 se cumplan los siguientes criterios:
- Tipo de mensaje: Respuesta
Un uso común de <StatusCode>
es garantizar que la respuesta del proxy tenga el mismo estado que la respuesta recibida del destino cuando el atributo createNew
de <AssignTo>
se establece en "true".
<Verb>
(secundario de <Copy>
)
Determina si el verbo HTTP se copia de la solicitud de origen a la solicitud de destino. Este elemento no tiene efecto en una respuesta.
Si es "true", copia el verbo encontrado en el atributo source
del elemento <Copy>
a la solicitud especificada en el elemento <AssignTo>
.
Valor predeterminado | Falso |
¿Es obligatorio? | Opcional |
Tipo | Booleano |
Elemento principal |
<Copy>
|
Elementos secundarios | Ninguna |
El elemento <Verb>
usa la siguiente sintaxis:
Sintaxis
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <Copy source="[request|response]"> <Verb>[false|true]</Verb> </Copy> </AssignMessage>
Ejemplo 1
En el siguiente ejemplo, se configura <Verb>
como “true”, que copia el verbo desde la solicitud predeterminada a una nueva solicitud personalizada:
<AssignMessage name="copy-verb-1"> <Copy source="request"> <Verb>true</Verb> </Copy> <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo> </AssignMessage>
Solo puedes usar <Verb>
cuando se cumplan los siguientes criterios:
- Tipo de mensaje: solicitud
<Version>
(secundario de <Copy>
)
Determina si la versión HTTP se copia de la solicitud de origen a la solicitud de destino. Este elemento no tiene efecto en una respuesta.
Si es "true", copia la versión HTTP que se encuentra en el atributo source
del elemento <Copy>
al objeto especificado por el elemento <AssignTo>
.
Valor predeterminado | Falso |
¿Es obligatorio? | Opcional |
Tipo | Booleano |
Elemento principal |
<Copy>
|
Elementos secundarios | Ninguna |
El elemento <Version>
usa la siguiente sintaxis:
Sintaxis
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <Copy source="[request|response]"> <Version>[false|true]</Version> </Copy> </AssignMessage>
Ejemplo 1
En el siguiente ejemplo, se configura <Version>
como “true” en la solicitud, lo que copia la versión del objeto de solicitud predeterminado a 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 <Version>
cuando se cumplan los siguientes criterios:
- Tipo de mensaje: solicitud
<DisplayName>
Use in addition to the name
attribute to label the policy in the
management UI proxy editor with a different, more natural-sounding name.
The <DisplayName>
element is common to all policies.
Default Value | n/a |
Required? | Optional. If you omit <DisplayName> , the value of the
policy's name attribute is used |
Type | String |
Parent Element | <PolicyElement> |
Child Elements | None |
The <DisplayName>
element uses the following syntax:
Syntax
<PolicyElement> <DisplayName>policy_display_name</DisplayName> ... </PolicyElement>
Example
<PolicyElement> <DisplayName>My Validation Policy</DisplayName> </PolicyElement>
The <DisplayName>
element has no attributes or child elements.
<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 | Ninguna |
Configúralo como true
para ignorar las variables sin resolver y continuar con el procesamiento, de lo contrario, false
. El valor predeterminado es false
.
Establecer <IgnoreUnresolvedVariables>
como true
no es lo mismo que establecer
continueOnError
de <AssignMessage>
a true
, ya que es específico de
establecer y obtener valores de variables. Si configuras continueOnError
como
true
, Edge ignorará todos los errores, no solo los que encuentres.
variables.
El elemento <IgnoreUnresolvedVariables>
usa la siguiente sintaxis:
Sintaxis
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <IgnoreUnresolvedVariables>[true|false]</IgnoreUnresolvedVariables> </AssignMessage>
Ejemplo 1
En el siguiente ejemplo, se configura <IgnoreUnresolvedVariables>
como “verdadero”:
<AssignMessage name="ignoreunresolvedvariables"> <Copy source="response"> ... <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> </Copy> </AssignMessage>
<Remove>
Quita los encabezados, los parámetros de búsqueda de la consulta, los parámetros de formulario y/o la carga útil del mensaje de un mensaje. El mensaje puede ser una solicitud o una respuesta. Especifica en qué mensaje actúa <Remove>
mediante el elemento <AssignTo>
.
Valor predeterminado | N/A |
¿Es obligatorio? | Opcional |
Tipo | Tipo complejo |
Elemento principal |
<AssignMessage>
|
Elementos secundarios |
<FormParams> <Headers> <Payload> <QueryParams> |
Un caso de uso común para <Remove>
es borrar un parámetro de búsqueda que contiene información sensible del objeto de solicitud entrante para evitar pasarlo al servidor de backend.
El elemento <Remove>
usa la siguiente sintaxis:
Sintaxis
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <Remove> <!-- Can also be an empty array (<FormParams/>) --> <FormParams> <FormParam name="formparam_name">formparam_value</FormParam> ... </FormParams> <!-- Can also be an empty array (<Headers/>) --> <Headers> <Header name="header_name">header_value</Header> ... </Headers> <Payload>[false|true]</Payload> <!-- Can also be an empty array (<QueryParams/>) --> <QueryParams> <QueryParam name="queryparam_name">queryparam_value</QueryParam> ... </QueryParams> </Remove> </AssignMessage>
Ejemplo 1
En el siguiente ejemplo, se quita el cuerpo del mensaje de la respuesta:
<AssignMessage continueOnError="false" enabled="true" name="remove-1"> <DisplayName>remove-1</DisplayName> <Remove> <Payload>true</Payload> </Remove> <AssignTo createNew="false" transport="http" type="response"/> </AssignMessage>
En el flujo de respuesta, esta política quita el cuerpo de la respuesta y muestra solo los encabezados HTTP al cliente.
Ejemplo 2
En el siguiente ejemplo, se quitan todos los parámetros de formulario y un parámetros de búsqueda de la solicitud entrante:
<AssignMessage continueOnError="false" enabled="true" name="remove-2"> <Remove> <!-- Empty (<FormParams/>) removes all form parameters --> <FormParams/> <QueryParams> <QueryParam name="qp1"/> </QueryParams> </Remove> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
<FormParams>
(secundario de <Remove>
)
Quita los parámetros de búsqueda especificados de la solicitud. Este elemento no causa ningún efecto en una respuesta.
Valor predeterminado | N/A |
¿Es obligatorio? | Opcional |
Tipo | Arreglo de elementos <FormParam> o un arreglo vacío |
Elemento principal |
<Remove>
|
Elementos secundarios |
<FormParam> |
El elemento <FormParams>
usa la siguiente sintaxis:
Sintaxis
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <Remove> <!-- Can also be an empty array (<FormParams/>) --> <FormParams> <FormParam name="formparam_name">formparam_value</FormParam> ... </FormParams> </Remove> </AssignMessage>
Ejemplo 1
En el siguiente ejemplo, se quitan tres parámetros de búsqueda de la solicitud:
<AssignMessage name="remove-formparams-1"> <Remove> <FormParams> <FormParam name="form_param_1"/> <FormParam name="form_param_2"/> <FormParam name="form_param_3"/> </FormParams> </Remove> <AssignTo createNew="false" transport="http" type="application/x-www-form-urlencoded"/> </AssignMessage>
Ejemplo 2
En el siguiente ejemplo, se quitan todos los parámetros de búsqueda de la solicitud:
<AssignMessage name="remove-formparams-2"> <Remove> <FormParams/> </Remove> <AssignTo createNew="false" transport="http" type="application/x-www-form-urlencoded"/> </AssignMessage>
Ejemplo 3
Si hay varios parámetros de formulario con el mismo nombre, utiliza la siguiente sintaxis:
<AssignMessage name="remove-formparams-3"> <Remove> <FormParams> <FormParam name="f1"/> <FormParam name="f2"/> <FormParam name="f3.2"/> </FormParams> </Remove> <AssignTo createNew="false" transport="http" type="application/x-www-form-urlencoded"/> </AssignMessage>
En este ejemplo, se copia "f1", "f2" y el segundo valor de "f3". Si “h3” tiene solo un valor, no se quita.
Solo puedes usar <FormParams>
cuando se cumplan los siguientes criterios:
- Tipo de mensaje: solicitud
Content-Type
: "application/x-www-form-urlencoded"
<Headers>
(secundario de <Remove>
)
Quita los encabezados HTTP especificados de la solicitud o respuesta, que se especifica mediante el elemento <AssignTo>
.
Valor predeterminado | N/A |
¿Es obligatorio? | Opcional |
Tipo | Arreglo de elementos <Header> o un arreglo vacío |
Elemento principal |
<Remove>
|
Elementos secundarios |
<Header> |
El elemento <Headers>
usa la siguiente sintaxis:
Sintaxis
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <Remove> <!-- Can also be an empty array (<Headers/>) --> <Headers> <Header name="header_name">header_value</Header> ... </Headers> </Remove> </AssignMessage>
Ejemplo 1
En el siguiente ejemplo, se quita el encabezado user-agent
de la solicitud:
<AssignMessage name="remove-headers-1"> <Remove> <Headers> <Header name="user-agent"/> </Headers> </Remove> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
Ejemplo 2
En el siguiente ejemplo, se quitan todos los encabezados de la solicitud:
<AssignMessage name="remove-headers-2"> <Remove> <Headers/> </Remove> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
Ejemplo 3
Si hay varios encabezados con el mismo nombre, usa la siguiente sintaxis:
<AssignMessage name="remove-headers-3"> <Remove> <Headers> <Header name="h1"/> <Header name="h2"/> <Header name="h3.2"/> </Headers> </Remove> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
En este ejemplo, se quita "h1", "h2" y el segundo valor de "h3". de la solicitud. Si es "h3" tiene un solo valor, entonces no se quita.
<Payload>
(secundario de <Remove>
)
Determina si <Remove>
borra la carga útil en la solicitud o respuesta, que se especifica mediante el elemento <AssignTo>
. Definido como "verdadero" a
borrar la carga útil; de lo contrario, será “false”. El valor predeterminado es "false".
Valor predeterminado | Falso |
¿Es obligatorio? | Opcional |
Tipo | Booleano |
Elemento principal |
<Remove>
|
Elementos secundarios | Ninguna |
El elemento <Payload>
usa la siguiente sintaxis:
Sintaxis
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <Remove> <Payload>[false|true]</Payload> </Remove> </AssignMessage>
Ejemplo 1
En el siguiente ejemplo, se configura <Payload>
como “verdadero”. para que la carga útil de la solicitud sea
borrado:
<AssignMessage name="remove-payload-1"> <Remove> <Payload>true</Payload> </Remove> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
<QueryParams>
(secundario de <Remove>
)
Quita los parámetros de búsqueda especificados de la solicitud. Este elemento no causa ningún efecto en una respuesta.
Valor predeterminado | N/A |
¿Es obligatorio? | Opcional |
Tipo | Arreglo de elementos <QueryParam> o un arreglo vacío |
Elemento principal |
<Remove>
|
Elementos secundarios |
<QueryParam> |
El elemento <QueryParams>
usa la siguiente sintaxis:
Sintaxis
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <Remove> <!-- Can also be an empty array (<QueryParams/>) --> <QueryParams> <QueryParam name="queryparam_name">queryparam_value</QueryParam> ... </QueryParams> </Remove> </AssignMessage>
Ejemplo 1
En el siguiente ejemplo, se quita un solo parámetro de búsqueda de la solicitud:
<AssignMessage name="remove-queryparams-1"> <Remove> <QueryParams> <QueryParam name="qp1"/> </QueryParams> </Remove> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
Ejemplo 2
En el siguiente ejemplo, se quitan todos los parámetros de búsqueda de la solicitud:
<AssignMessage name="remove-queryparams-2"> <Remove> <QueryParams/> </Remove> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
Ejemplo 3
Si hay varios parámetros de búsqueda con el mismo nombre, usa la siguiente sintaxis:
<AssignMessage name="remove-queryparams-3"> <Remove> <QueryParams> <QueryParam name="qp1"/> <QueryParam name="qp2"/> <QueryParam name="qp3.2"/> </QueryParams> </Remove> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
En este ejemplo, se quita “qp1”, “qp2” y el segundo valor de “qp3”. de la solicitud. Si “qp3” tiene un solo valor, entonces no se quita.
Ejemplo 4
En el siguiente ejemplo, se quita el parámetro de búsqueda apikey
de la solicitud:
<AssignMessage name="remove-query-param"> <Remove> <QueryParams> <QueryParam name="apikey"/> </QueryParams> </Remove> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
Solo puedes usar <QueryParams>
cuando se cumplan los siguientes criterios:
- Verbo HTTP: GET
- Tipo de mensaje: solicitud
<Set>
Establece la información en la solicitud o mensaje de respuesta, que se especifica mediante el elemento <AssignTo>
. <Set>
reemplaza los encabezados o parámetros que ya existen en el mensaje original. Para crear un nuevo encabezado o parámetro, en su lugar, usa el elemento <Add>
.
Valor predeterminado | N/A |
¿Es obligatorio? | Opcional |
Tipo | Tipo complejo |
Elemento principal |
<AssignMessage>
|
Elementos secundarios |
<FormParams> <Headers> <Payload> <Path> <QueryParams> <ReasonPhrase> <StatusCode> <Verb> <Version> |
El elemento <Set>
usa la siguiente sintaxis:
Sintaxis
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <Set> <FormParams> <FormParam name="formparam_name">formparam_value</FormParam> ... </FormParams> <Headers> <Header name="header_name">header_value</Header> ... </Headers> <Path>path</Path> <Payload contentType="content_type" variablePrefix="prefix" variableSuffix="suffix">new_payload</Payload> <QueryParams> <QueryParam name="queryparam_name">queryparam_value</QueryParam> ... </QueryParams> <ReasonPhrase>reason_for_error or {variable}</ReasonPhrase> <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 muestra el elemento <Set>
:
<AssignMessage continueOnError="false" enabled="true" name="set-1"> <Set> <FormParams> <FormParam name="myparam">{request.header.myparam}</FormParam> </FormParams> <Headers> <Header name="user-agent">{request.header.user-agent}</Header> </Headers> <QueryParams> <QueryParam name="name">{request.header.name}</QueryParam> <QueryParam name="address">{request.header.address}</QueryParam> </QueryParams> <!-- <Verb>GET</Verb> --> <Payload contentType="text/plain">42</Payload> <Path/> <ReasonPhrase>Bad request</ReasonPhrase> <StatusCode>400</StatusCode> <Verb>POST</Verb> <Verb>{my_variable}</Verb> <Version>1.1</Version> </Set> <AssignTo createNew="false" transport="http" type="response"/> </AssignMessage>
<FormParams>
(secundario de <Set>
)
Reemplaza los parámetros de formulario existentes en una solicitud y los reemplaza por los nuevos valores que especificas con este elemento. Este elemento no tiene efecto en una respuesta.
Valor predeterminado | N/A |
¿Es obligatorio? | Opcional |
Tipo | Arreglo de elementos <FormParam> |
Elemento principal |
<Set>
|
Elementos secundarios |
<FormParam> |
El elemento <FormParams>
usa la siguiente sintaxis:
Sintaxis
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <Set> <FormParams> <FormParam name="formparam_name">formparam_value</FormParam> ... </FormParams> </Set> </AssignMessage>
Ejemplo 1
En el siguiente ejemplo, se configura un parámetro de formulario llamado “myparam” al valor de la
La variable request.header.myparam
en una solicitud personalizada nueva:
<AssignMessage name="set-formparams-1"> <Set> <FormParams> <FormParam name="myparam">{request.header.myparam}</FormParam> </FormParams> </Set> <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo> </AssignMessage>
Solo puedes usar <FormParams>
cuando se cumplan los siguientes criterios:
- Verbo HTTP: POST
- Tipo de mensaje: solicitud
Si defines parámetros de formulario vacíos en tu política (<Add><FormParams/></Add>
), la política no agregará ningún parámetro de formulario. Esto es lo mismo que omitir <FormParams>
.
<Set>
cambia el Content-Type
del mensaje a "application/x-www-form-urlencoded" antes de enviarlo al extremo objetivo.
<Headers>
(secundario de <Set>
)
Reemplaza los encabezados HTTP existentes en la solicitud o respuesta, que se especifica mediante el elemento <AssignTo>
.
Valor predeterminado | N/A |
¿Es obligatorio? | Opcional |
Tipo | Arreglo de elementos <Header> |
Elemento principal |
<Set>
|
Elementos secundarios |
<Header> |
El elemento <Headers>
usa la siguiente sintaxis:
Sintaxis
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <Set> <Headers> <Header name="header_name">header_value</Header> ... </Headers> </Set> </AssignMessage>
Ejemplo 1
En el siguiente ejemplo, se establece el encabezado user-agent
en el valor de la variable request.header.user-agent
:
<AssignMessage name="set-headers-1"> <Set> <Headers> <Header name="user-agent">{request.header.user-agent}</Header> </Headers> </Set> <AssignTo createNew="true" transport="http" type="response"/> </AssignMessage>
Si defines encabezados vacíos en tu política (<Add><Headers/></Add>
), la política no agregará encabezados. Esto es lo mismo que omitir <Headers>
.
<Path>
(secundario de <Set>
)
<Payload>
(secundario de <Set>
)
Define el cuerpo del mensaje de una solicitud o respuesta, que se especifica mediante el elemento <AssignTo>
. La carga útil puede ser cualquier tipo de contenido válido, como texto sin formato, JSON o XML.
Valor predeterminado | (string vacía) |
¿Es obligatorio? | Opcional |
Tipo | String |
Elemento principal |
<Set>
|
Elementos secundarios | Ninguna |
El elemento <Payload>
usa la siguiente sintaxis:
Sintaxis
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <Set> <Payload contentType="content_type" variablePrefix="prefix" variableSuffix="suffix">new_payload</Payload> </Set> </AssignMessage>
Ejemplo 1
En el siguiente ejemplo, se configura una carga útil de texto sin formato:
<AssignMessage name="set-payload-1"> <Set> <Payload contentType="text/plain">42</Payload> </Set> </AssignMessage>
Ejemplo 2
En el siguiente ejemplo, se configura una carga útil de JSON:
<AssignMessage name="set-payload-2"> <Set> <Payload contentType="application/json"> {"name":"foo", "type":"bar"} </Payload> </Set> </AssignMessage>
Ejemplo 3
En el siguiente ejemplo, se insertan valores de variable en la carga útil mediante la inserción de nombres de variables entre llaves:
<AssignMessage name="set-payload-3"> <Set> <Payload contentType="application/json"> {"name":"foo", "type":"{variable_name}"} </Payload> </Set> </AssignMessage>
En versiones anteriores de Apigee Edge, por ejemplo, en versiones anteriores a la versión 16.08.17 en la nube, podrías
no uses llaves para denotar referencias variables dentro de las cargas útiles de JSON. En esas versiones, necesitabas usar los atributos variablePrefix
y variableSuffix
para especificar los caracteres delimitadores y usarlos a fin de encerrar los nombres de las variables de la siguiente manera:
<AssignMessage name="set-payload-3b"> <Set> <Payload contentType="application/json" variablePrefix="@" variableSuffix="#"> {"name":"foo", "type":"@variable_name#"} </Payload> </Set> </AssignMessage>
Esta sintaxis anterior sigue funcionando.
Ejemplo 4
El contenido de <Payload>
se considera una plantilla de mensaje. Esto significa que la política AssignMessage reemplaza las variables entre llaves con el valor de las variables a las que se hace referencia en el entorno de ejecución.
En el siguiente ejemplo, se usa la sintaxis de llaves para configurar parte de la carga útil en un valor de variable:
<AssignMessage name="set-payload-4"> <Set> <Payload contentType="text/xml"> <root> <e1>sunday</e1> <e2>funday</e2> <e3>{var1}</e3> </root> </Payload> </Set> </AssignMessage>
En la siguiente tabla, se describen los atributos de <Payload>
:
Atributo | Descripción | Presencia | Tipo |
---|---|---|---|
contentType |
Si se especifica, el valor de |
Opcional | String |
variablePrefix |
Especifica de manera opcional el delimitador principal en una variable de flujo. La configuración predeterminada es “{”. Para obtener más información, consulta Referencia de variables de flujo. | Opcional | Caracteres |
variableSuffix |
De manera opcional, especifica el delimitador final en una variable de flujo. La configuración predeterminada es "}". Para obtener más información, consulta Referencia de variables de flujo. | Opcional | Caracteres |
<QueryParams>
(secundario de <Set>
)
Reemplaza los parámetros de búsqueda existentes en la solicitud con valores nuevos. Este elemento no causa ningún efecto en una respuesta.
Valor predeterminado | N/A |
¿Es obligatorio? | Opcional |
Tipo | Arreglo de elementos <QueryParam> |
Elemento principal |
<Set>
|
Elementos secundarios |
<QueryParam> |
El elemento <QueryParams>
usa la siguiente sintaxis:
Sintaxis
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <Set> <QueryParams> <QueryParam name="queryparam_name">queryparam_value</QueryParam> ... </QueryParams> </Set> </AssignMessage>
Ejemplo 1
En el siguiente ejemplo, se configura el parámetro de búsqueda "address" en el valor de la variable request.header.address
:
<AssignMessage continueOnError="false" enabled="true" name="set-queryparams-1"> <Set> <QueryParams> <QueryParam name="address">{request.header.address}</QueryParam> </QueryParams> </Set> </AssignMessage>
Solo puedes usar <QueryParams>
cuando se cumplan los siguientes criterios:
- Verbo HTTP: GET
- Tipo de mensaje: solicitud
Si defines parámetros de búsqueda vacíos en tu política (<Set><QueryParams/></Set>
), la política no establece ningún parámetro de consulta. Esto es lo mismo que omitir <QueryParams>
.
<ReasonPhrase>
(secundario de <Set>
)
Establece la frase de motivo en la respuesta. Por lo general, esto se hace para depurar en combinación con <StatusCode>
. Este elemento no causa ningún efecto en una solicitud.
Valor predeterminado | N/A |
¿Es obligatorio? | Opcional |
Tipo | String |
Elemento principal |
<Set>
|
Elementos secundarios | Ninguna |
El elemento <ReasonPhrase>
usa la siguiente sintaxis:
Sintaxis
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <Set> <ReasonPhrase>reason_for_error or {variable}</ReasonPhrase> </Set> </AssignMessage>
Ejemplo 1
En el siguiente ejemplo, se define una frase de motivo simple:
<AssignMessage name="set-reasonphrase-1"> <Set> <ReasonPhrase>Bad medicine</ReasonPhrase> </Set> <AssignTo createNew="true" transport="http" type="response"/> </AssignMessage>
Ejemplo 2
El contenido de <ReasonPhrase>
se considera una plantilla de mensaje. Esto significa que se reemplazará en el entorno de ejecución un nombre de variable entre llaves por el valor de la variable a la que se hace referencia, como se muestra en el siguiente ejemplo:
<AssignMessage name="set-reasonphrase-2"> <Set> <ReasonPhrase>{calloutresponse.reason.phrase}</ReasonPhrase> </Set> <AssignTo createNew="true" transport="http" type="response"/> </AssignMessage>
Solo puedes usar <ReasonPhrase>
cuando se cumplan los siguientes criterios:
- Tipo de mensaje: Respuesta
<StatusCode>
(secundario de <Set>
)
Establece el código de estado en la respuesta. Este elemento no causa ningún efecto en una solicitud.
Valor predeterminado | “200” (cuando el atributo createNew de <AssignTo> se configura como “true”) |
¿Es obligatorio? | Opcional |
Tipo | String o variable |
Elemento principal |
<Set>
|
Elementos secundarios | Ninguna |
El elemento <StatusCode>
usa la siguiente sintaxis:
Sintaxis
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <Set> <StatusCode>HTTP_status_code or {variable}</StatusCode> </Set> </AssignMessage>
Ejemplo 1
En el siguiente ejemplo, se configura un código de estado simple:
<AssignMessage name="set-statuscode-1"> <Set> <StatusCode>404</StatusCode> </Set> <AssignTo createNew="true" transport="http" type="response"/> </AssignMessage>
Ejemplo 2
El contenido de <StatusCode>
se considera una plantilla de mensaje. Esto significa que un nombre de variable entre llaves se reemplazará en el entorno de ejecución por el valor de la variable a la que se hace referencia, como se muestra en el siguiente ejemplo:
<AssignMessage name="set-statuscode-2"> <Set> <StatusCode>{calloutresponse.status.code}</StatusCode> </Set> <AssignTo createNew="true" transport="http" type="response"/> </AssignMessage>
Solo puedes usar <StatusCode>
cuando se cumplan los siguientes criterios:
- Tipo de mensaje: Respuesta
<Verb>
(secundario de <Set>
)
Establece el verbo HTTP en la solicitud. Este elemento no tiene efecto en una respuesta.
Valor predeterminado | N/A |
¿Es obligatorio? | Opcional |
Tipo | String o variable |
Elemento principal |
<Set>
|
Elementos secundarios | Ninguna |
El elemento <Verb>
usa la siguiente sintaxis:
Sintaxis
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <Set> <Verb>[GET|POST|PUT|PATCH|DELETE|{variable}]</Verb> </Set> </AssignMessage>
Ejemplo 1
En el siguiente ejemplo, se configura un verbo simple en la solicitud:
<AssignMessage name="set-verb-1"> <Set> <Verb>POST</Verb> </Set> <AssignTo createNew="true" transport="http" type="request"/> </AssignMessage>
Ejemplo 2
El contenido de <Verb>
se considera una plantilla de mensaje. Esto significa que un nombre de variable entre llaves se reemplazará en el entorno de ejecución por el valor de la variable a la que se hace referencia.
En el siguiente ejemplo, se usa una variable para propagar un verbo:
<AssignMessage name="set-verb-2"> <Set> <Verb>{my_variable}</Verb> </Set> <AssignTo createNew="true" transport="http" type="request"/> </AssignMessage>
Solo puedes usar <Verb>
cuando se cumplan los siguientes criterios:
- Tipo de mensaje: solicitud
<Version>
(secundario de <Set>
)
Establece la versión HTTP en una solicitud. Este elemento no tiene efecto en una respuesta.
Valor predeterminado | N/A |
¿Es obligatorio? | Opcional |
Tipo | String o variable |
Elemento principal |
<Set>
|
Elementos secundarios | Ninguna |
El elemento <Version>
usa la siguiente sintaxis:
Sintaxis
<AssignMessage continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <Set> <Version>[1.0|1.1|{variable}]</Verb> </Set> </AssignMessage>
Ejemplo 1
En el siguiente ejemplo, se establece el número de versión en “1.1”:
<AssignMessage name="set-version-1"> <Set> <Version>1.1</Version> </Set> <AssignTo createNew="true" transport="http" type="request"/> </AssignMessage>
Ejemplo 2
El siguiente comando usa una variable entre llaves para establecer el número de versión:
<AssignMessage name="set-version-2"> <Set> <Version>{my_version}</Version> </Set> <AssignTo createNew="true" transport="http" type="request"/> </AssignMessage>
El contenido de <Version>
se considera una plantilla de mensaje. Esto significa que un nombre de variable entre llaves se reemplazará en el entorno de ejecución por el valor de la variable a la que se hace referencia.
Solo puedes usar <Version>
cuando se cumplan los siguientes criterios:
- Tipo de mensaje: solicitud
Crea mensajes de solicitud personalizados
Puedes usar la políticaAssignMessage para crear un mensaje de solicitud personalizado. Después de crear una solicitud personalizada, puedes usarla de las maneras siguientes:
- Accede a sus variables en otras políticas
- Pásalo a un servicio externo
Para crear un mensaje de solicitud personalizado, usa el elemento <AssignTo>
en tu política deAssignMessage
. Establece createNew
como "verdadero" y especifica el nombre del mensaje nuevo en el cuerpo
del elemento, como se muestra en el siguiente ejemplo:
<AssignMessage name="assignto-2"> <AssignTo createNew="true" transport="http" type="request"/> </AssignMessage>
De forma predeterminada, Edge no hace nada con el mensaje de solicitud personalizado. Después de crearla, Edge continuar el flujo con la solicitud original. Para usar la solicitud personalizada, agrega una política como la política ServiceCallout a tu proxy que pueda pasar la solicitud personalizada a un 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 un mensaje de asignación:
<AssignMessage name="AssignMessage-3"> <AssignTo createNew="true" type="request">MyCustomRequest</AssignTo> <Copy> <Headers> <Header name="user-agent"/> </Headers> </Copy> <Set> <QueryParams> <QueryParam name="address">{request.queryparam.addy}</QueryParam> </QueryParams> <Verb>GET</Verb> </Set> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> </AssignMessage>
En este ejemplo, se dan las siguientes situaciones:
- Crea un nuevo objeto de mensaje de solicitud llamado "MyCustomRequest".
- En MyCustomRequest, esta política:
- Copia el valor del encabezado HTTP
user-agent
del encabezado al mensaje nuevo. Dado que<Copy>
usa una referencia absoluta al elemento de flujouser-agent
, no hay debes especificar el atributosource
en<Copy>
. - Configura el parámetro de búsqueda
address
en el mensaje personalizado con el valor del parámetro de búsquedaaddy
de la solicitud entrante. - Establece el verbo HTTP como
GET
.
- Copia el valor del encabezado HTTP
- Establece
<IgnoreUnresolvedVariables>
como "false". Cuando<IgnoreUnresolvedVariables>
tiene el valor “false”. Si una de las variables que intenta agregar la política no existe, Edge se detendrá el procesamiento en el flujo de la API.
Ejemplo 2
A continuación, se muestra otro ejemplo en el que se muestra cómo crear un objeto de solicitud personalizado con Asigna Mensaje:
<AssignMessage name="AssignMessage-2"> <AssignTo createNew="true" type="request">partner.request</AssignTo> <Set> <Verb>POST</Verb> <Payload contentType="text/xml"> <request><operation>105</operation></request> </Payload> </Set> </AssignMessage>
En este ejemplo, se crea una solicitud personalizada nueva llamada “partner.request”. Luego, establece
<Verb>
y <Payload>
en la nueva solicitud.
Puedes acceder a un mensaje de solicitud personalizado en otra política de AssignMessage que se genera más adelante en el flujo. En el siguiente ejemplo, se obtiene el valor del encabezado user-agent
del mensaje de solicitud personalizado:
<AssignMessage name="custom-request-1-access"> <DisplayName>custom-request-1-access</DisplayName> <AssignTo createNew="false" type="request"></AssignTo> <Set> <Headers> <Header name="user-agentCopyCustomRequest">{MyCustomRequest.header.user-agent}</Header> </Headers> </Set> </AssignMessage>
Videos
Mira los siguientes videos para obtener más información acerca de la política de AssignMessage.
Video | Descripción |
---|---|
¿Por qué usar la política de asignación de mensajes? | Obtén información sobre los beneficios de usar la política de AssignMessage para modificar la solicitud o la respuesta a la API sin modificar el código de backend. |
Copia los elementos de la API mediante la política de AssignMessage | Copia elementos desde una solicitud o respuesta de la API y crea un objeto de solicitud o respuesta nuevo con la política de AssignMessage. |
Quitar elementos de la API con la política de AssignMessage | Quita los elementos de la API y modifícala antes de que alcance el backend de destino mediante la política de AssignMessage. |
Agrega y establece elementos de API con la política de AssignMessage | Para cambiar la solicitud o respuesta de la API, agrega parámetros de búsqueda, encabezados, parámetros de formulario o cargas útiles con la política de AssignMessage. |
Cómo crear variables personalizadas con la política AssignMessage | Establece variables de flujo personalizadas mediante la política de AssignMessage y aprovecha las variables en otras políticas en el proxy de API. |
Crea objetos de solicitud o respuesta nuevos mediante la política de AssignMessage | Crea objetos de solicitud o respuesta a la API nuevos mediante la política de AssignMessage en el entorno de ejecución de la API. |
Crea una API de prueba con la política de AssignMessage | Para crear una API de REST simple, agrega la política de AssignMessage en el flujo de respuesta. |
Establece o modifica la carga útil con la política de AssignMessage | Convertir la solicitud de REST en una solicitud de SOAP mediante la configuración de la carga útil de SOAP con la políticaAssignMessage en el entorno de ejecución de la API. |
Códigos de error
This section describes the fault codes and error messages that are returned and fault variables that are set by Edge when this policy triggers an error. This information is important to know if you are developing fault rules to handle faults. To learn more, see What you need to know about policy errors and Handling faults.
Runtime errors
These errors can occur when the policy executes.
Fault code | HTTP status | Cause | Fix |
---|---|---|---|
steps.assignmessage.SetVariableFailed |
500 | The policy was not able to set a variable. See the fault string for the name of the unresolved variable. | |
steps.assignmessage.VariableOfNonMsgType |
500 |
This error occurs if the Message type variables represent entire HTTP requests and responses. The built-in Edge
flow variables |
build |
steps.assignmessage.UnresolvedVariable |
500 |
This error occurs if a variable specified in the Assign Message policy is either:
|
build |
Deployment errors
These errors can occur when you deploy a proxy containing this policy.
Error name | Cause | Fix |
---|---|---|
InvalidIndex |
If the index specified in the <Copy> and/or <Remove> elements of the Assign Message
policy is 0 or a negative number, then deployment of the API Proxy fails.
|
build |
InvalidVariableName |
If the child element <Name> is empty or not specified in the <AssignVariable> element,
then the deployment of the API proxy fails because there is no valid variable name to
which to assign a value. A valid variable name is required.
|
build |
InvalidPayload |
A payload specified in the policy is invalid. |
Fault variables
These variables are set when this policy triggers an error at runtime. For more information, see What you need to know about policy errors.
Variables | Where | Example |
---|---|---|
fault.name="fault_name" |
fault_name is the name of the fault, as listed in the Runtime errors table above. The fault name is the last part of the fault code. | fault.name Matches "UnresolvedVariable" |
assignmessage.policy_name.failed |
policy_name is the user-specified name of the policy that threw the fault. | assignmessage.AM-SetResponse.failed = true |
Example error response
{ "fault":{ "detail":{ "errorcode":"steps.assignmessage.VariableOfNonMsgType" }, "faultstring":"AssignMessage[AM-SetResponse]: value of variable is not of type Message" } }
Example fault rule
<faultrule name="VariableOfNonMsgType"></faultrule><FaultRule name="Assign Message Faults"> <Step> <Name>AM-CustomNonMessageTypeErrorResponse</Name> <Condition>(fault.name Matches "VariableOfNonMsgType") </Condition> </Step> <Step> <Name>AM-CustomSetVariableErrorResponse</Name> <Condition>(fault.name = "SetVariableFailed")</Condition> </Step> <Condition>(assignmessage.failed = true) </Condition> </FaultRule>
Esquemas
Un esquema XML (.xsd
) define cada tipo de política. Como referencia, los esquemas de políticas están disponibles en GitHub.
Temas relacionados
En las muestras de la plataforma de API, están disponibles ejemplos de cómo trabajar de la política AssignMessage.
Para ver un ejemplo más avanzado de cómo anular target.url
del ProxyEndpoint, consulta este artículo de la comunidad de Apigee.
Para ver una "ruta de acceso" en acción en una política ServiceCallout, consulta este ejemplo de cómo hacerlo en las muestras de GitHub de Apigee. Solo clona el repositorio y sigue las instrucciones en ese tema. En el ejemplo, se usa la política AssignMessage para establecer una ruta de solicitud. y, luego, utiliza una política de texto destacado de servicios para realizar la solicitud a un servicio externo.