Esta página se aplica a Apigee y Apigee Hybrid.
Consulta la documentación de
Apigee Edge.
Qué
La política ExtractVariables extrae contenido de una solicitud o una respuesta y asigna el valor de una variable a ese contenido. Puede extraer cualquier parte del mensaje, incluidos los encabezados, las rutas de URI, las cargas útiles JSON o XML, los parámetros de formulario y los parámetros de consulta. La política funciona aplicando un patrón de texto al contenido del mensaje y, cuando encuentra una coincidencia, asigna una variable con el contenido del mensaje especificado.
Aunque a menudo se usa ExtractVariables para extraer información de un mensaje de solicitud o respuesta, también se puede usar para extraer información de otras fuentes, incluidas las entidades creadas por la política AccessEntity, los objetos XML o los objetos JSON.
Después de extraer el contenido del mensaje especificado, puede hacer referencia a la variable en otras políticas como parte del procesamiento de una solicitud y una respuesta.
Esta política es una política extensible y su uso puede tener implicaciones en cuanto a costes o utilización, en función de tu licencia de Apigee. Para obtener información sobre los tipos de políticas y las implicaciones de uso, consulta Tipos de políticas.
Vídeos
Consulta los siguientes vídeos para obtener más información sobre la política ExtractVariables.
Vídeo | Descripción |
---|---|
Extraer variables de la carga útil XML | Extrae variables de una carga útil XML mediante la política Extraer variable. |
Extraer variables de la carga útil de JSON | Extrae variables de una carga útil de JSON mediante la política Extraer variable. |
Extraer variables de parámetros | Extraer variables de parámetros, como parámetros de consulta, de encabezado, de formulario o de URI. |
Extraer variables de parámetros con varios valores | Extrae variables de parámetros con varios valores. |
Ejemplos
Estos ejemplos de código de política muestran cómo extraer variables de los siguientes tipos de artefactos:
URIs
<ExtractVariables name="ExtractVariables-1"> <DisplayName>Extract a portion of the url path</DisplayName> <Source>request</Source> <URIPath> <Pattern ignoreCase="true">/accounts/{id}</Pattern> </URIPath> <VariablePrefix>urirequest</VariablePrefix> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> </ExtractVariables>
Consulta el código de política de ejemplo anterior. El elemento <URIPath>
indica a la política ExtractVariables que extraiga información de la ruta URI. El elemento <Pattern>
especifica el patrón que se debe aplicar a la ruta del URI. El patrón se trata como una plantilla sencilla, en la que las llaves indican la parte variable de la ruta del URI.
El nombre de la variable que se va a definir se determina mediante el valor especificado en el elemento <VariablePrefix>
, así como el valor incluido entre llaves {} en el elemento <Pattern>
. Los dos valores se unen mediante un punto, lo que da como resultado un nombre de variable como urirequest.id
. Si no hay ningún elemento <VariablePrefix>
, el nombre de la variable será el valor entre llaves.
Supongamos que el código de la política de ejemplo anterior funciona con la siguiente solicitud entrante:
GET http://example.com/svc1/accounts/12797282
Supongamos que la ruta base del proxy de API es /svc1
. Cuando Apigee aplica el código de la política ExtractVariables anterior a esta solicitud entrante, asigna el valor 12797282
a la variable urirequest.id
. Después de que Apigee ejecute la política, las políticas o el código posteriores del flujo de procesamiento pueden hacer referencia a la variable llamada urirequest.id
para obtener el valor de cadena 12797282
.
Por ejemplo, la siguiente política AssignMessage inserta el valor de esa variable en la carga útil de un nuevo mensaje de solicitud:
<AssignMessage async="false" continueOnError="false" enabled="true" name="AssignPayload"> <DisplayName>AssignPayload</DisplayName> <Set> <Payload contentType="text/xml"> <IdExtractedFromURI>{urirequest.id}</IdExtractedFromURI> </Payload> </Set> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="true" transport="http" type="request">newRequest</AssignTo> </AssignMessage>
Parámetros de consulta
<ExtractVariables name="ExtractVariables-2"> <DisplayName>Extract a value from a query parameter</DisplayName> <Source>request</Source> <QueryParam name="code"> <Pattern ignoreCase="true">DBN{dbncode}</Pattern> </QueryParam> <VariablePrefix>queryinfo</VariablePrefix> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> </ExtractVariables>
Supongamos que el código de la política de ejemplo anterior funciona con la siguiente solicitud entrante:
GET http://example.com/accounts/12797282?code=DBN88271
Cuando Apigee aplica el código de la política ExtractVariables anterior a esta solicitud entrante, asigna el valor 88271
a la variable queryinfo.dbncode
. Después de que Apigee ejecute la política, las políticas o el código posteriores del flujo de procesamiento pueden hacer referencia a la variable llamada queryinfo.dbncode
para obtener el valor de cadena 88271
.
Ahora puedes acceder a la variable queryinfo.dbncode
en tu proxy.
Por ejemplo, la siguiente política AssignMessage la copia en la carga útil de la solicitud:
<AssignMessage async="false" continueOnError="false" enabled="true" name="GetURIPath"> <DisplayName>GetQP</DisplayName> <Set> <Payload contentType="text/xml"> <ExtractQP>{queryinfo.dbncode}</ExtractQP> </Payload> </Set> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
Varios parámetros
<ExtractVariables name="ExtractVariables-2"> <DisplayName>Extract a value from a query parameter</DisplayName> <Source>request</Source> <QueryParam name="w"> <Pattern ignoreCase="true">{firstWeather}</Pattern> </QueryParam> <QueryParam name="w.2"> <Pattern ignoreCase="true">{secondWeather}</Pattern> </QueryParam> <VariablePrefix>queryinfo</VariablePrefix> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> </ExtractVariables>
Supongamos que el diseño de tu API te permite especificar varios parámetros de consulta con el mismo nombre. Puede usar una política ExtractVariables para extraer el valor de varias instancias del parámetro de consulta. Para hacer referencia a parámetros de consulta con el mismo nombre en la política, utilice índices. La primera instancia del parámetro de consulta no tiene índice, la segunda tiene el índice 2, la tercera tiene el índice 3 y así sucesivamente.
Supongamos que el código de la política de ejemplo anterior funciona con la siguiente solicitud entrante:
GET http://example.com/weather?w=Boston&w=Chicago
Cuando Apigee aplica el código de la política ExtractVariables anterior a esta solicitud entrante, asigna el valor Boston
a la variable queryinfo.firstWeather
y el valor Chicago
a la variable queryInfo.secondWeather
.
Ahora puedes acceder a las variables queryinfo.firstWeather
y queryinfo.secondWeather
en tu proxy. Por ejemplo, la siguiente política AssignMessage la copia en la carga útil de la solicitud:
<AssignMessage async="false" continueOnError="false" enabled="true" name="GetURIPath"> <DisplayName>GetQP</DisplayName> <Set> <Payload contentType="text/xml"> <ExtractQP1>{queryinfo.firstWeather}</ExtractQP1> <ExtractQP2>{queryinfo.secondWeather}</ExtractQP2> </Payload> </Set> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
Encabezados
<ExtractVariables name='ExtractVariable-OauthToken'> <Source>request</Source> <Header name="Authorization"> <Pattern ignoreCase="false">Bearer {oauthtoken}</Pattern> </Header> <VariablePrefix>clientrequest</VariablePrefix> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> </ExtractVariables>
Supongamos que tu API usa tokens de portador de OAuth 2.0. Supongamos que el código de la política de ejemplo anterior funciona con una solicitud que incluye un token de OAuth v2.0 con un encabezado como este:
Authorization: Bearer TU08xptfFfeM7aS0xHqlxTgEAdAM.
Como diseñador de la API, supongamos que quieres usar el valor del token (pero no todo el encabezado) como clave en una búsqueda en caché. Puedes usar el código de la política ExtractVariables anterior para extraer el token.
Cuando Apigee aplica el código de la política ExtractVariables anterior a este encabezado, asigna el valor TU08xptfFfeM7aS0xHqlxTgEAdAM
a la variable clientrequest.oauthtoken
.
Ahora puedes acceder a la variable clientrequest.oauthtoken
en tu proxy. Por ejemplo, la siguiente política AssignMessage la copia en la carga útil de la solicitud:
<AssignMessage async="false" continueOnError="false" enabled="true" name="GetURIPath"> <DisplayName>GetHeader</DisplayName> <Set> <Payload contentType="text/xml"> <ExtractHeader>{clientrequest.oauthtoken}</ExtractHeader> </Payload> </Set> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
JSON
<ExtractVariables name="ExtractVariables-3"> <Source>response</Source> <JSONPayload> <Variable name="latitude" type="float"> <JSONPath>$.results[0].geometry.location.lat</JSONPath> </Variable> <Variable name="longitude" type="float"> <JSONPath>$.results[0].geometry.location.lng</JSONPath> </Variable> </JSONPayload> <VariablePrefix>geocoderesponse</VariablePrefix> </ExtractVariables>
Considera la siguiente carga útil de respuesta JSON:
{ "results": [{ "geometry": { "location": { "lat": 37.42291810, "lng": -122.08542120 }, "location_type": "ROOFTOP", "viewport": { "northeast": { "lat": 37.42426708029149, "lng": -122.0840722197085 }, "southwest": { "lat": 37.42156911970850, "lng": -122.0867701802915 } } } }] }
Cuando Apigee aplica el código de la política ExtractVariables anterior a este mensaje JSON, se definen dos variables: geocoderesponse.latitude
y geocoderesponse.longitude
. Ambas variables usan el mismo prefijo de variable:
geocoderesponse
. El sufijo de estas variables se especifica explícitamente en el atributo name
del elemento <Variable>
.
La variable geocoderesponse.latitude
obtiene el valor
37.42291810
. La variable geocoderesponse.longitude
obtiene el valor
-122.08542120
.
Ahora puedes acceder a la variable geocoderesponse.latitude
en tu proxy. Por ejemplo, la siguiente política AssignMessage la copia en un encabezado llamado
latitude
en la respuesta:
<AssignMessage async="false" continueOnError="false" enabled="true" name="GetURIPath"> <DisplayName>GetJSONVar</DisplayName> <Add> <Headers> <Header name="latitude">{geocoderesponse.latitude}</Header> </Headers> </Add> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="response"/> </AssignMessage>
XML
<ExtractVariables name="ExtractVariables-4"> <Source>response</Source> <XMLPayload> <Namespaces> <Namespace prefix="dir">urn:43BFF88D-D204-4427-B6BA-140AF393142F</Namespace> </Namespaces> <Variable name="travelmode" type="string"> <XPath>/dir:Directions/dir:route/dir:leg/dir:step/@mode</XPath> </Variable> <Variable name="duration" type="string"> <XPath>/dir:Directions/dir:route/dir:leg/dir:step/dir:duration/dir:value</XPath> </Variable> <Variable name="timeunit" type="string"> <XPath>/dir:Directions/dir:route/dir:leg/dir:step/dir:duration/dir:text</XPath> </Variable> </XMLPayload> <VariablePrefix>directionsresponse</VariablePrefix> </ExtractVariables>
Considera la siguiente carga útil de respuesta XML:
<Directions xmlns="urn:43BFF88D-D204-4427-B6BA-140AF393142F"> <status>OK</status> <route> <summary>I-40 W</summary> <leg> <step mode="DRIVING"> <start_location> <lat>41.8507300</lat> <lng>-87.6512600</lng> </start_location> <end_location> <lat>41.8525800</lat> <lng>-87.6514100</lng> </end_location> <duration> <value>19</value> <text>minutes</text> </duration> </step> </leg> </route> </Directions>
Cuando Apigee aplica el código de la política ExtractVariables anterior a este mensaje XML, se definen tres variables:
directionsresponse.travelmode
: obtiene el valorDRIVING
directionsresponse.duration
: obtiene el valor19
directionsresponse.timeunit
: obtiene el valorminutes
Todas las variables usan el mismo prefijo de variable: directionsresponse
. El sufijo de estas variables se especifica explícitamente en el atributo name
del elemento <Variable>
.
Ahora puedes acceder a la variable directionresponse.travelmode
en tu proxy. Por ejemplo, la siguiente política AssignMessage la copia en un encabezado llamado
tmode
en la respuesta:
<AssignMessage async="false" continueOnError="false" enabled="true" name="GetURIPath"> <DisplayName>GetXMLVar</DisplayName> <Add> <Headers> <Header name="tmode">{directionsresponse.travelmode}</Header> </Headers> </Add> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
Acerca de la política ExtractVariables
Los desarrolladores de APIs crean proxies de APIs que se comportan de forma diferente en función del contenido de los mensajes, incluidos los encabezados, las rutas de URI, las cargas útiles y los parámetros de consulta. A menudo, el proxy extrae una parte de este contenido para usarla en una instrucción condicional. Para ello, usa la política ExtractVariables.
Al definir la política ExtractVariables, puedes elegir entre las siguientes opciones:
- Nombres de las variables que se van a definir.
- Fuente de las variables
- Número de variables que se van a extraer y definir
Cuando se ejecuta, la política aplica un patrón de texto al contenido y, al encontrar una coincidencia, asigna el valor del contenido a la variable designada. Otras políticas y código pueden usar esas variables para habilitar un comportamiento dinámico o para enviar datos empresariales a Apigee API Analytics.
Ámbito
Las variables definidas con la política ExtractVariables tienen un alcance global. Es decir, después de que la política ExtractVariables defina una nueva variable, puede acceder a ella desde cualquier política o código en cualquier fase del flujo (que se ejecute después de la política ExtractVariables). Esto incluye lo siguiente:
- PreFlow: ProxyEndpoint y TargetEndpoint (solicitud y respuesta)
- PostFlow: ProxyEndpoint y TargetEndpoint (solicitud y respuesta)
- PostClientFlow: ProxyEndpoint (solo respuesta, usando la política MessageLogging>)
- Flujos de errores
Acerca de la creación de variables y de la coincidencia
La política ExtractVariables extrae información de una solicitud o una respuesta y escribe esa información en una variable. Para cada tipo de información que puede extraer, como la ruta de URI o los datos XML, especifique el patrón que debe coincidir y el nombre de la variable que se usará para contener la información extraída.
Sin embargo, el funcionamiento de la coincidencia de patrones depende de la fuente de la extracción. En las siguientes secciones se describen las dos categorías básicas de información que puede extraer.
Coincidencia de rutas de URI, parámetros de consulta, encabezados, parámetros de formulario y variables
Cuando extrae información de una ruta de URI, parámetros de consulta, encabezados, parámetros de formulario y variables, utiliza la etiqueta <Pattern>
para especificar uno o varios patrones que coincidan. Por ejemplo, en la siguiente política se muestra un único patrón de coincidencia para la ruta de URI:
<ExtractVariables name="ExtractVariables-1"> <Source>request</Source> <URIPath> <Pattern ignoreCase="true">/a/{pathSeg}</Pattern> </URIPath> <VariablePrefix>urirequest</VariablePrefix> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> </ExtractVariables>
En este ejemplo, la variable urirequest.pathSeg
se asigna
a lo que aparece en proxy.pathsuffix después de /a/
. Por ejemplo, supongamos que la ruta base de tu proxy de API es /basepath/v1
. Con una solicitud entrante
a http://myCo.com/basepath/v1/a/b
, la
variable se define como b
.
Especificar varios patrones
Puedes especificar varios patrones que coincidan, correspondientes a etiquetas <Pattern>
, donde:
- Se comprueba si coinciden todos los patrones.
- Si no coincide ningún patrón, la política no hace nada y no se crea ninguna variable.
- Si coinciden varios patrones, se utiliza el patrón con los segmentos de ruta más largos para la extracción.
- Si dos patrones coincidentes tienen los mismos segmentos de ruta más largos, se usará el patrón especificado en primer lugar en la política para la extracción.
En el siguiente ejemplo, se crea una política que contiene tres patrones coincidentes para la ruta del URI:
<ExtractVariables name="ExtractVariables-1"> <Source>request</Source> <URIPath> <Pattern ignoreCase="true">/a/{pathSeg}</Pattern> <Pattern ignoreCase="true">/a/b/{pathSeg}</Pattern> <Pattern ignoreCase="true">/a/b/c/{pathSeg}</Pattern> </URIPath> <VariablePrefix>urirequest</VariablePrefix> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> </ExtractVariables>
Supongamos que, en un proxy de API con una ruta base /basepath/v1
, la URL de la solicitud entrante al proxy de API tiene este formato:
http://myCo.com/basepath/v1/a/b
En este ejemplo, el primer patrón coincide con el URI y la variable urirequest.pathSeg
se define como b
.
Si la URL de la solicitud es:
http://myCo.com/basepath/v1/a/b/c/d
...entonces se cumple el tercer patrón y la variable urirequest.pathSeg
se asigna a d
.
Especificar patrones con varias variables
Puede especificar varias variables en el patrón de coincidencia. Por ejemplo, especifica un patrón de coincidencia con dos variables:
<ExtractVariables name="ExtractVariables-1"> <Source>request</Source> <URIPath> <Pattern ignoreCase="true">/a/{pathSeg}</Pattern> <Pattern ignoreCase="true">/a/b/{pathSeg}</Pattern> <Pattern ignoreCase="true">/a/{pathSeg1}/c/{pathSeg2}</Pattern> </URIPath> <VariablePrefix>urirequest</VariablePrefix> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> </ExtractVariables>
Volvamos a suponer que hay un proxy de API con una ruta base /basepath/v1
. En el caso de la solicitud entrante
URL:
http://myCo.com/basepath/v1/a/b/c/d
...la variable urirequest.pathSeg1
se define como b
y la variable urirequest.pathSeg2
se define como d
.
Coincidir con varias instancias en el patrón
También puedes buscar patrones cuando haya varias instancias de un elemento con el mismo nombre. Por ejemplo, puede enviar una solicitud que contenga varios parámetros de consulta o varios encabezados con el mismo nombre. La siguiente solicitud contiene dos parámetros de consulta denominados "w":
http://myCo.com/basepath/v1/a/b/c/d?w=1&w=2
Para hacer referencia a estos parámetros de consulta en la política ExtractVariables, se usan índices. La primera instancia del parámetro de consulta no tiene índice, la segunda tiene el índice 2, la tercera el índice 3, etc. Por ejemplo, la siguiente política extrae el valor del segundo parámetro de consulta llamado "w" de la solicitud:
<ExtractVariables name="ExtractVariables-1"> <Source>request</Source> <QueryParam name="w.2"> <Pattern ignoreCase="true">{secondW}</Pattern> </QueryParam> <VariablePrefix>urirequest</VariablePrefix> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> </ExtractVariables>
La variable urirequest.secondW
se ha definido como "2". Si se omite el segundo parámetro de consulta en la solicitud, la variable urirequest.secondW
estará vacía. Usa la indexación siempre que haya varios elementos con el mismo nombre en la solicitud.
Usar caracteres especiales en el patrón
Cuando se buscan coincidencias con rutas de URIs, se pueden usar los caracteres comodín "*" y "**" en el patrón. donde:
- "*" coincide con cualquier segmento de la ruta
- "**" coincide con varios segmentos de la ruta
Por ejemplo, puedes especificar patrones en el elemento <URIPath>
como se muestra a continuación:
<URIPath> <Pattern ignoreCase="true">/a/*/{id}</Pattern> <Pattern ignoreCase="true">/a/**/{id}</Pattern> </URIPath>
El primer patrón coincide con las solicitudes con sufijos de ruta (la parte de la ruta de URI que va después de la ruta base), como "/a/b/c" o "/a/foo/bar". El segundo patrón coincide con cualquier número de segmentos de ruta después de "/a/", como "/a/foo/bar/baz/c", así como con "/a/b/c" y "/a/foo/bar".
Cuando se especifican patrones para parámetros de consulta, encabezados y parámetros de formulario, el carácter "*" indica que se debe buscar cualquier número de caracteres. Por ejemplo, al buscar una coincidencia en un encabezado, especifica el patrón de la siguiente manera:
*;charset={encoding}
Este patrón coincide con los valores "text/xml;charset=UTF-16" y "application/xml;charset=ASCII".
Si el valor transferido a la política ExtractVariables contiene un carácter especial, como "{", utiliza el carácter "%" para evitarlo. En el siguiente ejemplo se escapan los caracteres "{" y "}" de la plantilla porque se usan como caracteres literales en el valor del parámetro de consulta:
<QueryParam> <Pattern ignoreCase="true">%{user%} {name}</Pattern> </QueryParam>
En este ejemplo, el patrón coincide con el valor "{user} Steve", pero no con el valor "user Steve".
Coincidencia de JSON y XML
Cuando extrae datos de JSON y XML, especifica una o varias etiquetas <Variable>
en la política.
La etiqueta <Variable>
especifica el nombre de la variable de destino en la que se almacena la información extraída, así como el JsonPath (JSON) o el XPATH (XML) de la información extraída.
Se evalúan todas las etiquetas <Variable>
de la política
para que puedas rellenar varias variables a partir de una sola política. Si la etiqueta <Variable>
no se evalúa como un campo válido en el JSON o el XML, no se crea la variable correspondiente.
En el siguiente ejemplo se muestra una política ExtractVariables que rellena dos variables a partir del cuerpo JSON de una respuesta:
<ExtractVariables name="ExtractVariables-3"> <Source>response</Source> <JSONPayload> <Variable name="latitude" type="float"> <JSONPath>$.results[0].geometry.location.lat</JSONPath> </Variable> <Variable name="longitude" type="float"> <JSONPath>$.results[0].geometry.location.lng</JSONPath> </Variable> </JSONPayload> <VariablePrefix>geocoderesponse</VariablePrefix> </ExtractVariables>
Escribir en la misma variable en varios lugares
Ten cuidado al elegir los nombres de las variables que vas a definir. La política se ejecuta de forma secuencial desde el primer patrón de extracción hasta el último. Si la política escribe un valor en la misma variable desde varios lugares, el valor de la variable se determinará por la última escritura de la política. (Puede que sea lo que buscas).
Por ejemplo, supongamos que quiere extraer un valor de token que se pueda transferir en un parámetro de consulta o en un encabezado, como se muestra a continuación:
<!-- If token only in query param, the query param determines the value. If token is found in both the query param and header, header sets value. --> <QueryParam name="token"> <Pattern ignoreCase="true">{tokenValue}</Pattern> </QueryParam> <!-- Overwrite tokenValue even if it was found in query parameter. --> <Header name="Token"> <Pattern ignoreCase="true">{tokenValue}</Pattern> </Header>
Controlar lo que ocurre cuando no hay ninguna coincidencia
Si el patrón no coincide, no se crea la variable correspondiente. Por lo tanto, si otra política hace referencia a la variable, puede provocar un error.
Una opción es definir <IgnoreUnresolvedVariables>
como true en una política que haga referencia a la variable para configurar la política de forma que trate cualquier variable que no se pueda resolver como una cadena vacía (nula):
<IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
Referencia de elemento
En la referencia de elementos se describen los elementos y atributos de la política ExtractVariables.
<ExtractVariables async="false" continueOnError="false" enabled="true" name="Extract-Variables-1"> <DisplayName> 1</DisplayName> <Source clearPayload="true|false">request</Source> <VariablePrefix>myprefix</VariablePrefix> <IgnoreUnresolvedVariables>true|false</IgnoreUnresolvedVariables> <URIPath> <Pattern ignoreCase="false">/accounts/{id}</Pattern> </URIPath> <QueryParam name="code"> <Pattern ignoreCase="true">DBN{dbncode}</Pattern> </QueryParam> <Header name="Authorization"> <Pattern ignoreCase="false">Bearer {oauthtoken}</Pattern> </Header> <FormParam name="greeting"> <Pattern>hello {user}</Pattern> </FormParam> <Variable name="request.content"> <Pattern>hello {user}</Pattern> </Variable> <JSONPayload> <Variable name="name"> <JSONPath>{example}</JSONPath> </Variable> </JSONPayload> <XMLPayload stopPayloadProcessing="false"> <Namespaces/> <Variable name="name" type="boolean"> <XPath>/test/example</XPath> </Variable> </XMLPayload> </ExtractVariables>
Atributos de <ExtractVariables>
<ExtractVariables async="false" continueOnError="false" enabled="true" name="Extract-Variables-1">
En la siguiente tabla se describen los atributos que son comunes a todos los elementos superiores de la política:
Atributo | Descripción | Predeterminado | Presencia |
---|---|---|---|
name |
El nombre interno de la política. El valor del atributo Opcionalmente, usa el elemento |
N/A | Obligatorio |
continueOnError |
Asigna el valor Asigna el valor |
falso | Opcional |
enabled |
Asigna el valor Selecciona |
true | Opcional |
async |
Este atributo está obsoleto. |
falso | Obsoleto |
Elemento <DisplayName>
Úsalo junto con el atributo name
para etiquetar la política en el editor de proxy de la interfaz de gestión con un nombre diferente en lenguaje natural.
<DisplayName>Policy Display Name</DisplayName>
Predeterminado |
N/A Si omite este elemento, se usará el valor del atributo |
---|---|
Presencia | Opcional |
Tipo | Cadena |
Elemento <Source>
(Opcional) Especifica la variable que se va a analizar. El valor de <Source>
es message
de forma predeterminada. El valor de message
depende del contexto. En un flujo de solicitudes, message
se resuelve en el mensaje de solicitud. En un flujo de respuesta, message
se resuelve en el mensaje de respuesta.
Aunque esta política se suele usar para extraer información de un mensaje de solicitud o respuesta, también se puede usar para extraer información de cualquier variable. Por ejemplo, puedes usarla para extraer información de una entidad creada por la política AccessEntity, de datos devueltos por la política ServiceCallout o de un objeto XML o JSON.
Si <Source>
no se puede resolver o se resuelve en un tipo que no es de mensaje,
la política no responderá.
<Source clearPayload="true|false">request</Source>
Valor predeterminado: | mensaje |
Presencia: | Opcional |
Tipo: | Cadena |
Atributos
Atributo | Descripción | Predeterminado | Presencia | Tipo |
---|---|---|---|---|
clearPayload |
Asigna el valor true si quieres borrar la carga útil especificada en
Usa la opción |
falso |
Opcional | Booleano |
Elemento <VariablePrefix>
(Opcional) El nombre completo de la variable se crea combinando el <VariablePrefix>
, un punto y el nombre que definas entre {llaves} en el elemento <Pattern>
o en el elemento <Variable>
. Por ejemplo:
myprefix.id
, myprefix.dbncode
o myprefix.oauthtoken.
<VariablePrefix>myprefix</VariablePrefix>
Por ejemplo, supongamos que el valor de name es "user".
- Si no se especifica
<VariablePrefix>
, los valores extraídos se asignan a una variable llamadauser
. - Si
<VariablePrefix>
se especifica como mi_prefijo, los valores extraídos se asignan a una variable llamadamyprefix.user
.
Valor predeterminado: | N/A |
Presencia: | Opcional |
Tipo: | Cadena |
Elemento <IgnoreUnresolvedVariables>
(Opcional) Asigna el valor true
para tratar cualquier variable que no se pueda resolver como una cadena vacía (nula). Asigna el valor false
si quieres que la política genere un error cuando no se pueda resolver ninguna variable a la que se haga referencia.
<IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
Valor predeterminado: | Falso |
Presencia: | Opcional |
Tipo: | Booleano |
Elemento <URIPath>
(Opcional, pero consulta la fila Presencia de la tabla de abajo para obtener más información). Extrae un valor de proxy.pathsuffix de un mensaje de origen request
. La ruta aplicada al patrón es proxy.pathsuffix, que no incluye la ruta base del proxy de API. Si el mensaje de origen se resuelve en un tipo de mensaje response
, este elemento no hace nada.
<URIPath> <Pattern ignoreCase="false">/accounts/{id}</Pattern> </URIPath>
Es posible usar varios elementos <Pattern>
:
<URIPath> <Pattern ignoreCase="false">/accounts/{id}</Pattern> <Pattern ignoreCase="false">/accounts/{id}/transactions/{index}</Pattern> </URIPath>
Valor predeterminado: | N/A |
Presencia: | Opcional. Sin embargo, debes incluir al menos uno de los siguientes elementos:
<URIPath> , <QueryParam> , <Header> ,
<FormParam> , <JSONPayload> o
<XMLPayload>. . |
Tipo: | N/A |
Atributos
Atributo | Descripción | Predeterminado | Presencia | Tipo |
---|---|---|---|---|
ignoreCase | Especifica que no se distingue entre mayúsculas y minúsculas al buscar coincidencias con el patrón. |
falso |
Opcional | Booleano |
Elemento <QueryParam>
(Opcional, pero consulta la fila Presencia de la tabla de abajo para obtener más información). Extrae un valor
del parámetro de consulta especificado de un mensaje de origen request
. Si el mensaje de origen se resuelve en un tipo de mensaje response
, este elemento no hace nada.
<QueryParam name="code"> <Pattern ignoreCase="true">DBN{dbncode}</Pattern> </QueryParam>
Si varios parámetros de consulta tienen el mismo nombre, utilice índices para hacer referencia a los parámetros:
<QueryParam name="w.2"> <Pattern ignoreCase="true">{secondW}</Pattern> </QueryParam>
Valor predeterminado: | N/A |
Presencia: | Opcional. Sin embargo, debes incluir al menos uno de los siguientes elementos:
<URIPath> , <QueryParam> , <Header> ,
<FormParam> , <JSONPayload> o
<XMLPayload>. . |
Tipo: | N/A |
Atributos
Atributo | Descripción | Predeterminado | Presencia | Tipo |
---|---|---|---|---|
name | Especifica el nombre del parámetro de consulta. Si varios parámetros de consulta tienen el mismo nombre, utilice referencias indexadas. En este caso, la primera instancia del parámetro de consulta no tiene índice, la segunda tiene el índice 2, la tercera tiene el índice 3, etc. |
N/A |
Obligatorio | Cadena |
Elemento <Header>
(Opcional, pero consulta la fila Presencia de la tabla de abajo para obtener más información). Extrae un valor del encabezado HTTP especificado del mensaje request
o response
especificado. Si varios encabezados tienen el mismo nombre, sus valores se almacenan en una matriz.
<!-- The name is the actual header name. --> <Header name="Authorization"> <!-- Provide a name for your new custom variable here. --> <Pattern ignoreCase="false">Bearer {oauthtoken}</Pattern> </Header>
Si varios encabezados tienen el mismo nombre, utilice índices para hacer referencia a encabezados concretos en la matriz:
<Header name="myHeader.2"> <Pattern ignoreCase="true">{secondHeader}</Pattern> </Header>
O lo siguiente para enumerar todos los encabezados de la matriz:
<Header name="myHeader.values"> <Pattern ignoreCase="true">{myHeaders}</Pattern> </Header>
Valor predeterminado: | N/A |
Presencia: | Opcional. Sin embargo, debes incluir al menos uno de los siguientes elementos:
<URIPath> , <QueryParam> , <Header> ,
<FormParam> , <JSONPayload> o
<XMLPayload>. . |
Tipo: | N/A |
Atributos
Atributo | Descripción | Predeterminado | Presencia | Tipo |
---|---|---|---|---|
name | Especifica el nombre del encabezado del que se extraerá el valor. Si varios encabezados tienen el mismo nombre, usa referencias indexadas, donde la primera instancia del encabezado no tiene índice, la segunda tiene el índice 2, la tercera tiene el índice 3, etc. Usa .values para obtener todos los encabezados de la matriz. |
N/A |
Obligatorio | Cadena |
Elemento <FormParam>
(Opcional, pero consulta la fila Presencia de la tabla de abajo para obtener más información). Extrae un valor
del parámetro de formulario especificado del mensaje request
o response
especificado. Los parámetros de formulario solo se pueden extraer cuando el encabezado Content-Type
del mensaje especificado es application/x-www-form-urlencoded
.
<FormParam name="greeting"> <Pattern>hello {user}</Pattern> </FormParam>
Valor predeterminado: | N/A |
Presencia: | Opcional. Sin embargo, debes incluir al menos uno de los siguientes elementos:
<URIPath> , <QueryParam> , <Header> ,
<FormParam> , <JSONPayload> o
<XMLPayload>. . |
Tipo: | N/A |
Atributos
Atributo | Descripción | Predeterminado | Presencia | Tipo |
---|---|---|---|---|
name | Nombre del parámetro del formulario del que se extrae el valor. |
N/A |
Obligatorio | Cadena |
Elemento <Variable>
(Opcional, pero consulta la fila Presencia de la tabla de abajo para obtener más información). Especifica el nombre de una variable de la que se va a extraer un valor.
<Variable name="myVar"> <Pattern>hello {user}</Pattern> </Variable>
Para extraer dos valores de la variable, siga estos pasos:
<Variable name="myVar"> <Pattern>hello {firstName} {lastName}</Pattern> </Variable>
Valor predeterminado: | N/A |
Presencia: | Opcional. Sin embargo, debes incluir al menos uno de los siguientes elementos:
<URIPath> , <QueryParam> , <Header> ,
<FormParam> , <JSONPayload> o
<XMLPayload>. . |
Tipo: | N/A |
Atributos
Atributo | Descripción | Predeterminado | Presencia | Tipo |
---|---|---|---|---|
name | Nombre de la variable de la que se va a extraer el valor. |
N/A |
Obligatorio | Cadena |
Elemento <JSONPayload>
(Opcional, pero consulta la fila Presencia de la tabla de abajo para obtener más información). Especifica el mensaje en formato JSON del que se extraerá el valor de la variable. La extracción de JSON
solo se realiza cuando el encabezado Content-Type
del mensaje es
application/json
.
<JSONPayload> <Variable name="name" type="string"> <JSONPath>{example}</JSONPath> </Variable> </JSONPayload>
Valor predeterminado: | N/A |
Presencia: | Opcional. Sin embargo, debes incluir al menos uno de los siguientes elementos:
<URIPath> , <QueryParam> , <Header> ,
<FormParam> , <JSONPayload> o
<XMLPayload>. . |
Tipo: | N/A |
Elemento <JSONPayload>/<Variable>
(Obligatorio en el elemento JSONPayload). Especifica la variable a la que se asigna el valor extraído. Puedes incluir varias etiquetas <Variable>
en el elemento <JSONPayload>
para rellenar varias variables.
<Variable name="name" type="string"> <JSONPath>{example}</JSONPath> </Variable>
Valor predeterminado: | N/A |
Presencia: | Obligatorio en el elemento JSONPayload. |
Tipo: | N/A |
Atributos
Atributo | Descripción | Predeterminado | Presencia | Tipo |
---|---|---|---|---|
name |
Especifica el nombre de la variable a la que se asignará el valor extraído. |
name |
Obligatorio | Cadena |
tipo | Especifica el tipo de datos del valor de la variable. | N/A | Opcional |
Cadena. Elige entre:
|
Elemento <JSONPayload>/<Variable>/<JSONPath>
Obligatorio en el elemento JSONPayload:Variable. Especifica la ruta JSON que se usa para extraer un valor de un mensaje con formato JSON.
<Variable name="name"> <JSONPath>$.rss.channel.title</JSONPath> </Variable>
Valor predeterminado: | N/A |
Presencia: | Obligatorio |
Tipo: | Cadena |
Elemento <XMLPayload>
(Opcional, pero consulta la fila Presencia de la tabla de abajo para obtener más información). Especifica el mensaje con formato XML del que se extraerá el valor de la variable. Las cargas útiles XML se extraen solo cuando el encabezado Content-Type
del mensaje es text/xml
, application/xml
o application/*+xml
.
<XMLPayload stopPayloadProcessing="false"> <Namespaces> <Namespace prefix="apigee">http://www.apigee.com</Namespace> <Namespace prefix="gmail">http://mail.google.com</Namespace> </Namespaces> <Variable name="name" type="boolean"> <XPath>/apigee:test/apigee:example</XPath> </Variable> </XMLPayload>
Valor predeterminado: | N/A |
Presencia: | Opcional. Sin embargo, debes incluir al menos uno de los siguientes elementos:
<URIPath> , <QueryParam> , <Header> ,
<FormParam> , <JSONPayload> o
<XMLPayload>. . |
Tipo: | N/A |
Atributos
Atributo | Descripción | Predeterminado | Presencia | Tipo |
---|---|---|---|---|
stopPayloadProcessing |
Asigna el valor |
falso |
Opcional | Booleano |
Elemento <XMLPayload>/<Namespaces>
(Opcional) Especifica el espacio de nombres que se va a usar en la evaluación de XPath. Si utilizas espacios de nombres en tus expresiones XPath, debes declararlos aquí, como se muestra en el siguiente ejemplo.
<XMLPayload stopPayloadProcessing="false"> <Namespaces> <Namespace prefix="apigee">http://www.apigee.com</Namespace> <Namespace prefix="gmail">http://mail.google.com</Namespace> </Namespaces> <Variable name="legName" type="string"> <XPath>/apigee:Directions/apigee:route/apigee:leg/apigee:name</XPath> </Variable> </XMLPayload>
Si no utilizas espacios de nombres en tus expresiones XPath, puedes omitir o comentar el elemento <Namespaces>
, como se muestra en el siguiente ejemplo:
<XMLPayload stopPayloadProcessing="false"> <!-- <Namespaces/> --> <Variable name="legName" type="string"> <XPath>/Directions/route/leg/name</XPath> </Variable> </XMLPayload>
Valor predeterminado: | N/A |
Presencia: | Opcional |
Tipo: | Cadena |
Atributos
Atributo | Descripción | Predeterminado | Presencia | Tipo |
---|---|---|---|---|
prefix |
El prefijo del espacio de nombres. |
N/A |
Obligatorio | Cadena |
Elemento <XMLPayload>/<Variable>
(Opcional) Especifica la variable a la que se asignará el valor extraído.
<Variable name="name" type="boolean"> <XPath>/test/example</XPath> </Variable>
Valor predeterminado: | N/A |
Presencia: | Opcional |
Tipo: | N/A |
Atributos
Atributo | Descripción | Predeterminado | Presencia | Tipo |
---|---|---|---|---|
name |
Especifica el nombre de la variable a la que se asignará el valor extraído. |
name |
Obligatorio | Cadena |
tipo | Especifica el tipo de datos del valor de la variable. | Booleano | Opcional |
Cadena. Elige entre:
|
Elemento <XMLPayload>/<Variable>/<XPath>
Obligatorio en el elemento XMLPayload:Variable. Especifica el XPath definido para la variable. variable. Solo se admiten expresiones XPath 1.0.
<Variable name="name" type="boolean"> <XPath>/test/example</XPath> </Variable>
Ejemplo con un espacio de nombres. Si usas espacios de nombres en tus expresiones XPath, debes declararlos en la sección <XMLPayload><Namespaces>
de la política.
<Variable name="name" type="boolean"> <XPath>/foo:test/foo:example</XPath> </Variable>
Valor predeterminado: | N/A |
Presencia: | Obligatorio |
Tipo: | Cadena |
Referencia de errores
En esta sección se describen los códigos de error y los mensajes de error que devuelve Apigee, así como las variables de error que define, cuando esta política activa un error. Es importante que conozcas esta información si vas a desarrollar reglas de errores para gestionarlos. Para obtener más información, consulta Qué debes saber sobre los errores de políticas y Cómo gestionar los fallos.
Errores de tiempo de ejecución
Estos errores pueden producirse cuando se ejecuta la política.
Código de fallo | Estado de HTTP | Causa | Solucionar |
---|---|---|---|
steps.extractvariables.ExecutionFailed |
500 |
Este error se produce cuando:
|
build |
steps.extractvariables.ImmutableVariable |
500 |
Una variable usada en la política es inmutable. La política no ha podido definir esta variable. | N/A |
steps.extractvariables.InvalidJSONPath |
500 |
Este error se produce si se usa una ruta JSON no válida en el elemento JSONPath de la política. Por ejemplo, si una carga útil JSON no tiene el objeto Name , pero especificas Name como ruta en la política, se producirá este error. |
build |
steps.extractvariables.JsonPathParsingFailure |
500 |
Este error se produce cuando la política no puede analizar una ruta JSON y
extraer datos de la variable de flujo especificada en el elemento Source . Normalmente, esto ocurre si la variable de flujo especificada en el elemento Source no existe en el flujo actual. |
build |
steps.extractvariables.SetVariableFailed |
500 |
Este error se produce si la política no ha podido asignar el valor a una variable. El error suele producirse si intentas asignar valores a varias variables cuyos nombres empiezan por las mismas palabras en un formato anidado separado por puntos. | build |
steps.extractvariables.SourceMessageNotAvailable |
500 |
Este error se produce si la variable message
especificada en el elemento Source de la política
es una de las siguientes:
|
build |
steps.extractvariables.UnableToCast |
500 |
Este error se produce si la política no ha podido convertir el valor extraído en una variable. Normalmente, esto ocurre si intentas asignar el valor de un tipo de datos a una variable de otro tipo de datos. | build |
Errores de implementación
Estos errores pueden producirse al implementar un proxy que contenga esta política.
Nombre del error | Causa | Solucionar |
---|---|---|
NothingToExtract |
Si la política no tiene ninguno de los elementos URIPath , QueryParam , Header , FormParam , XMLPayload o JSONPayload , la implementación del proxy de API falla porque no hay nada que extraer. |
build |
NONEmptyPrefixMappedToEmptyURI |
Este error se produce si la política tiene un prefijo definido en el elemento Namespace del elemento XMLPayload , pero no se ha definido ningún URI. |
build |
DuplicatePrefix |
Este error se produce si la política tiene el mismo prefijo definido más de una vez en el elemento Namespace del elemento XMLPayload . |
build |
NoXPathsToEvaluate |
Si la política no tiene el elemento XPath dentro del elemento XMLPayload , la implementación del proxy de API fallará y se mostrará este error.
|
build |
EmptyXPathExpression |
Si la política tiene una expresión XPath vacía en el elemento XMLPayload , se producirá un error al desplegar el proxy de API. |
build |
NoJSONPathsToEvaluate |
Si la política no tiene el elemento JSONPath dentro del elemento JSONPayload , la implementación del proxy de API fallará y se mostrará este error. |
build |
EmptyJSONPathExpression |
Si la política tiene una expresión XPath vacía en el elemento
XMLPayload , se producirá un error al desplegar el proxy de API. |
build |
MissingName |
Si la política no tiene el atributo name en ninguno de los elementos de la política, como QueryParam , Header , FormParam o Variable , donde es obligatorio, se producirá un error al implementar el proxy de API. |
build |
PatternWithoutVariable |
Si la política no tiene ninguna variable especificada en el elemento Pattern ,
se producirá un error al implementar el proxy de API. El elemento Pattern requiere el nombre de la variable en la que se almacenarán los datos extraídos. |
build |
CannotBeConvertedToNodeset |
Si la política tiene una expresión XPath en la que el tipo Variable se define como nodeset, pero la expresión no se puede convertir en nodeset, se produce un error al desplegar el proxy de API. |
build |
JSONPathCompilationFailed |
La política no ha podido compilar una ruta JSON especificada. | N/A |
InstantiationFailed |
No se ha podido crear una instancia de la política. | N/A |
XPathCompilationFailed |
Si el prefijo o el valor utilizado en el elemento XPath no forma parte de ninguno de los espacios de nombres declarados en la política, se producirá un error al implementar el proxy de API. |
build |
InvalidPattern |
Si la definición del elemento Pattern no es válida en ninguno de los elementos, como URIPath ,
QueryParam , Header , FormParam , XMLPayload
o JSONPayload , de la política, se producirá un error al implementar el
proxy de API.
|
build |
Variables de error
Estas variables se definen cuando esta política activa un error en el tiempo de ejecución. Para obtener más información, consulta Qué debes saber sobre los errores de las políticas.
Variables | Dónde | Ejemplo |
---|---|---|
fault.name="fault_name" |
fault_name es el nombre del fallo, tal como se indica en la tabla Errores de tiempo de ejecución de arriba. El nombre del error es la última parte del código de error. | fault.name = "SourceMessageNotAvailable" |
extractvariables.policy_name.failed |
policy_name es el nombre de la política especificado por el usuario que ha provocado el error. | extractvariables.EV-ParseJsonResponse.failed = true |
Ejemplo de respuesta de error
{ "fault":{ "detail":{ "errorcode":"steps.extractvariables.SourceMessageNotAvailable" }, "faultstring":"request message is not available for ExtractVariable: EV-ParseJsonResponse" } }
Regla de fallo de ejemplo
<FaultRule name="Extract Variable Faults"> <Step> <Name>AM-CustomErrorMessage</Name> <Condition>(fault.name = "SourceMessageNotAvailable") </Condition> </Step> <Condition>(extractvariables.EM-ParseJsonResponse.failed = true) </Condition> </FaultRule>
Esquemas
Temas relacionados
Referencia de variables de flujo