Esta página se aplica a Apigee y Apigee Hybrid.
Consulta la documentación de
Apigee Edge.
Qué
La política de GraphQL puede analizar cargas útiles de GraphQL en variables de flujo de mensajes, verificar solicitudes de GraphQL con un esquema o ambas cosas.
Puedes usar la política de GraphQL para lo siguiente:
- Asegúrate de que tus APIs solo procesen solicitudes que se ajusten al esquema que proporciones.
- Imponer restricciones en la carga útil definiendo un máximo en el número de fragmentos permitidos.
- Asocia GraphQL con productos de API.
- Aprovecha las funciones de las políticas Oauth2, VerifyAPIKey y Quota, al igual que en REST.
GraphQL admite los siguientes tipos de cargas útiles:
- POST de cargas útiles de GraphQL con
Content-Type : application/graphql
- POST de cargas útiles de GraphQL con
Content-Type: applcation/json
- GET de cargas útiles de GraphQL en las que la carga útil es un parámetro de consulta
Para obtener más información, consulta los siguientes recursos:
Esta política es una política estándar y se puede implementar en cualquier tipo de entorno. Para obtener información sobre los tipos de políticas y la disponibilidad de cada tipo de entorno, consulta Tipos de políticas.
Consulta un ejemplo de uso de esta política en la sección Usar GraphQL.
Elemento <GraphQL>
Define una política <GraphQL>
.
Valor predeterminado | Consulta la pestaña Política predeterminada que aparece más abajo. |
¿Es obligatorio? | Obligatorio |
Tipo | TIPO |
Elemento principal | n/a |
Elementos secundarios | <Action> <MaxDepth> <MaxCount> <MaxPayloadSizeInBytes> <OperationType> <Source> <ResourceURL> |
Sintaxis
El elemento <GraphQL>
utiliza la siguiente sintaxis:
<GraphQL continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <Source>request</Source> <OperationType>[query|mutuation|all]</OperationType> <MaxDepth>MAX_DEPTH</MaxDepth> <MaxCount>MAX_NUMBER_OF_QUERIES</MaxCount> // [Start maxpayloadsize] <MaxPayloadSizeInBytes>MAX_PAYLOAD_SIZE_IN_BYTES</MaxPayloadSizeInBytes> <Action>parse</Action> <ResourceURL>PATH/TO/SCHEMA.xsd</ResourceURL> </GraphQL>
Política predeterminada
En el siguiente ejemplo se muestran los ajustes predeterminados al añadir una política <GraphQL>
a tu flujo en la interfaz de usuario de Apigee:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <GraphQL name="GraphQLParser"> <Source>request</Source> <OperationType>query</OperationType> <MaxDepth>10</MaxDepth> <MaxCount>10</MaxCount> <MaxPayloadSizeInBytes></MaxPayloadSizeInBytes> <Action>parse</Action> <ResourceURL></ResourceURL> </GraphQL>
Este elemento tiene los siguientes atributos, que son comunes a todas las políticas:
Atributo | Predeterminado | ¿Es obligatorio? | Descripción |
---|---|---|---|
name |
N/A | Obligatorio |
El nombre interno de la política. El valor del atributo Opcionalmente, usa el elemento |
continueOnError |
falso | Opcional | Asigna el valor false para devolver un error cuando falle una política. Este es el comportamiento esperado de la mayoría de las políticas. Asigna el valor true para que la ejecución del flujo continúe incluso después de que falle una política. Consulta también:
|
enabled |
true | Opcional | Asigna el valor true para aplicar la política. Selecciona false para desactivar la política. La política no se aplicará aunque siga adjunta a un flujo. |
async |
falso | Obsoleto | Este atributo está obsoleto. |
En la siguiente tabla se ofrece una descripción general de los elementos secundarios de <GraphQL>
:
Elemento secundario | ¿Es obligatorio? | Descripción |
---|---|---|
Operaciones comunes | ||
<Action> |
Opcional | Especifica la acción que se debe llevar a cabo en una solicitud: parse , verify o parse_verify (ambas).
|
<MaxCount> |
Opcional | Número máximo de consultas o fragmentos que puede generar una solicitud de GraphQL. El valor predeterminado es 10. |
<MaxDepth> |
Opcional | Profundidad máxima del árbol de la consulta. El valor predeterminado es 4. |
<MaxPayloadSizeInBytes> |
Opcional | Tamaño máximo de una carga útil en kilobytes. |
<OperationType> |
Obligatorio | Especifica el tipo de solicitud que se puede analizar: query , mutation o query_mutation (cualquiera de los dos). |
<ResourceURL> |
Opcional | DESCRIPCIÓN. Ubicación del archivo de esquema de GraphQL. |
<Source> |
Obligatorio | request |
Cada uno de estos elementos secundarios se describe en las secciones que aparecen a continuación.
Referencia de elemento secundario
En esta sección se describen los elementos secundarios de <GraphQL>
.
<Action>
Action representa una de las siguientes acciones de GraphQL:
parse
: Apigee analiza la carga útil de GraphQL en variables de flujo de mensajes. Consulta Ejemplos de representaciones de variables de flujo de mensajes para ver una explicación de las variables que se definen cuandoAction
se define comoparse
. De esta forma, se puede ahorrar tiempo de CPU valioso en el backend. Ten en cuenta queverify
también analiza la carga útil.verify
: Apigee verifica que la carga útil de GraphQL se ajusta al esquema subido al proxy.parse_verify
: Apigee analiza y verifica la solicitud de GraphQL.
Valor predeterminado | parse |
¿Es obligatorio? | Optional |
Tipo | Cadena |
Elemento principal | <GraphQL> |
Elementos secundarios | ninguno |
El elemento <Action>
utiliza la siguiente sintaxis:
Sintaxis
<GraphQL continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <Action>parse</Action> </GraphQL>
<MaxCount>
Número máximo de fragmentos que puede haber en la carga útil. Puedes usar esta opción para evitar que el servidor backend de GraphQL del cliente ejecute consultas muy complejas, lo que obliga a los clientes a dividir su lógica en cargas útiles más pequeñas.
Valor predeterminado | 10 |
¿Es obligatorio? | Optional |
Tipo | Cadena |
Elemento principal | <GraphQL> |
Elementos secundarios | ninguno |
El elemento <MaxCount>
utiliza la siguiente sintaxis:
Sintaxis
<GraphQL continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <MaxCount>MAX_NUMBER_OF_QUERIES</MaxCount> </GraphQL>
<MaxDepth>
La profundidad máxima de la consulta, cuando se representa como un árbol.
MaxDepth
te permite bloquear consultas profundas en la carga útil, de modo que Apigee no tenga que crear variables de flujo muy grandes para contener los valores.
Sin embargo, la carga útil se envía tal cual, independientemente del valor de MaxDepth
.
El valor predeterminado es 10.
Valor predeterminado | 10 |
¿Es obligatorio? | Optional |
Tipo | Entero |
Elemento principal | <GraphQL> |
Elementos secundarios | ninguno |
El elemento <MaxDepth>
utiliza la siguiente sintaxis:
Sintaxis
<GraphQL continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <MaxDepth>MAX_DEPTH</MaxDepth> </GraphQL>
<MaxPayloadSizeInBytes>
Tamaño máximo de una carga útil en kilobytes. Puedes usarlo para limitar el tamaño de la carga útil y evitar problemas de rendimiento.
Nota: Si no se proporciona MaxPayloadSizeInByte
en la política,
no se aplicará ninguna restricción de tamaño.
Valor predeterminado | request |
¿Es obligatorio? | Optional |
Tipo | Cadena |
Elemento principal | <GraphQL> |
Elementos secundarios | ninguno |
El elemento <MaxPayloadSizeInBytes>
utiliza la siguiente sintaxis:
Sintaxis
<GraphQL continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <MaxPayloadSizeInBytes>MAX_PAYLOAD_SIZE_IN_BYTES</MaxPayloadSizeInBytes> </GraphQL>
<OperationType>
Indica el tipo de solicitud que se puede analizar:
query
: una consulta GraphQL.mutation
: una mutación de GraphQLquery_mutation
: una consulta o una mutación de GraphQL.
Si el ámbito es query
y se envía una solicitud de mutación, la solicitud falla
y devuelve un error 4xx
.
Valor predeterminado | query |
¿Es obligatorio? | Optional |
Tipo | Cadena |
Elemento principal | <GraphQL> |
Elementos secundarios | ninguno |
El elemento <OperationType>
utiliza la siguiente sintaxis:
Sintaxis
<GraphQL continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <OperationType>[query|mutation|query_mutation]</OperationType> </GraphQL>
<ResourceURL>
Ruta al archivo de esquema de GraphQL con el que la política de GraphQL verifica las solicitudes. Consulta el ejemplo para ver cómo subir un esquema GraphQL a Apigee.
Si el nombre del archivo de esquema que ha subido es my-schema.graphql
, el elemento <ResourceURL>
sería
<ResourceURL>graphql://my-schema.graphql</ResourceURL>
Valor predeterminado | n/a |
¿Es obligatorio? | Opcional |
Tipo | Cadena |
Elemento principal | <GraphQL> |
Elementos secundarios | ninguno |
El elemento ResourceURL
utiliza la siguiente sintaxis:
Sintaxis
<GraphQL continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <ResourceURL>PATH/TO/SCHEMA.graphql</ResourceURL> </GraphQL>
<Source>
Fuente en la que se ejecuta esta política.
Valor predeterminado | request |
¿Es obligatorio? | Optional |
Tipo | Cadena |
Elemento principal | <GraphQL> |
Elementos secundarios | ninguno |
El elemento <Source>
utiliza la siguiente sintaxis:
Sintaxis
<GraphQL continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <Source>request</Source> </GraphQL>
Analizador de GraphQL
El analizador de graphQL admite todas las funciones de una consulta graphQL y la representa como un gráfico en la notación punteada del flujo de mensajes. Una consulta puede constar de una definición de operación y, opcionalmente, de fragmentos identificados como definiciones de fragmentos. Consulta la especificación de GraphQL.
Anatomía de una solicitud de GraphQL
En el diagrama siguiente se muestra la anatomía de una solicitud de GraphQL.

Representación en el flujo de mensajes de las definiciones de operaciones
La implementación del analizador cubre todos los aspectos de la sintaxis de GraphQL, incluido el soporte para consultas y mutaciones. Consulta Variable de flujo message.
Las variables de flujo de mensajes siguen esta convención:
graphql.(root-index).(root definition)[(sub-indices).(child-definitions)…]
donde:
graphql
: prefijo estático que indica que se trata de variables de flujo de mensajes relacionadas con GraphQL.root-Index
: índice basado en 0 que indica el índice de definiciones de consulta de nivel raíz (hasta 4 por solicitud de forma predeterminada).root-definition
: cuerpo del mensaje de solicitud de GraphQL de nivel raíz, argumentos y sus valores.sub-indices
: índices secundarioschild-definitions
: definiciones de nivel de hoja que se corresponden con campos específicos y sus valores.
Representación en la variable de flujo de mensajes de las definiciones de operaciones
Campos del mensaje | Tipo | Descripción |
---|---|---|
name | Cadena | Nombre de la operación de GraphQL. Ten en cuenta que este nombre no está relacionado con el nombre del flujo de mensajes. |
definición | Cadena - Operación | Indica que contiene el cuerpo principal del mensaje de la solicitud de consulta. |
operationType | consulta o mutación | Tipo de operación que se está realizando. |
variableDefinition | Entero | Funcionan igual que las definiciones de argumentos de una función en un lenguaje tipado. Se muestran todas las variables, precedidas por el símbolo $, seguido de su tipo. |
directivas | Entero | @include y @skip son las dos directivas que se ofrecen actualmente y que pueden filtrar en función de los valores que se transfieran de forma dinámica. |
selectionSet | Entero | Agrupación lógica de un nivel de todos los atributos asociados a un objeto. |
Representación en el flujo de mensajes de las definiciones de fragmentos
Nombre de variable de flujo de mensajes | Tipo | Descripción |
---|---|---|
name | Cadena | Nombre del fragmento. |
definición | Fragmento de cadena | Indica que el cuerpo de la solicitud es un fragmento de la solicitud principal. |
typeCondition | Cadena | La condición en la que se invoca el fragmento. |
variableDefinition | Entero | La definición de las variables que se han pasado como argumentos al fragmento. |
Ejemplos de representaciones de variables de flujo de mensajes
En los siguientes ejemplos se muestran las representaciones de variables de flujo de mensajes para cargas útiles de solicitudes de ejemplo.
Consulta de ejemplo 1
En este ejemplo se muestra una consulta realizada con argumentos transferidos como entrada, que consulta tres atributos de los empleados.
{ employee(id: 123) { id firstName lastName } }
En la tabla se muestran las representaciones de las variables de flujo de mensajes correspondientes.
Variable de flujo message | Valor |
---|---|
graphql.operation.operationType |
QUERY |
graphql.fragment.count |
1 |
graphql.operation.selectionSet.count |
1 |
graphql.operation.variableDefinitions.count |
0 |
graphql.operation.selectionSet.1.name |
employee |
graphql.operation.selectionSet.1.argument.count |
1 |
graphql.operation.selectionSet.1.argument.1.name |
id |
graphql.operation.selectionSet.1.argument.1.value |
IntValue{value=123} |
graphql.operation.selectionSet.1.directive.count |
0 |
graphql.operation.selectionSet.1.selectionSet.count |
3 |
graphql.operation.selectionSet.1.selectionSet.1.name |
id |
graphql.operation.selectionSet.1.selectionSet.2.name |
firstName |
graphql.operation.selectionSet.1.selectionSet.3.name |
lastName |
Consulta de ejemplo 2
En este ejemplo se muestra una consulta realizada con argumentos transferidos como entrada, que consulta los nombres de amigos.
query Characters($episode: Episode, $withFriends: Boolean!) { friends @include(if: $withFriends) { friendsName } }
En la tabla siguiente se muestran las representaciones de las variables de flujo de mensajes correspondientes.
Variable de flujo message | Valor |
---|---|
graphql.operation.operationType |
QUERY |
graphql.operation.selectionSet.count |
1 |
graphql.operation.name |
Characters |
graphql.fragment.count |
0 |
graphql.operation.selectionSet.1.name |
friends |
graphql.operation.variableDefinitions.count |
2 |
graphql.operation.variableDefinitions.1.name |
episode |
graphql.operation.variableDefinitions.1.type |
TypeName{name='Episode'} |
graphql.operation.variableDefinitions.2.name |
withFriends |
graphql.operation.variableDefinitions.2.type |
NonNullType{type=TypeName{name='Boolean'}} |
graphql.operation.selectionSet.1.argument.count |
0 |
graphql.operation.selectionSet.1.selectionSet.count |
1 |
graphql.operation.selectionSet.1.selectionSet.1.name |
friendsName |
graphql.operation.selectionSet.1.directive.count |
1 |
graphql.operation.selectionSet.1.directive.1.argument.1.name |
if |
graphql.operation.selectionSet.1.directive.1.argument.1.value |
VariableReference{name='withFriends'} |
Consulta de ejemplo 3
En este ejemplo, se muestra una definición de variable con un alias.
query getUsers { admins: users(role: ADMIN) { lastName } accountants: users(role: ACCOUNTANT) { firstName } }
En la tabla siguiente se muestran las representaciones de las variables de flujo de mensajes correspondientes.
Variable de flujo message | Valor |
---|---|
graphql.operation.operationType |
QUERY |
graphql.operation.selectionSet.count |
2 |
graphql.operation.selectionSet.1.name |
users |
graphql.operation.selectionSet.1.alias |
admins |
graphql.operation.variableDefinitions.count |
0 |
graphql.operation.selectionSet.1.argument.count |
1 |
graphql.operation.selectionSet.1.argument.1.name |
role |
graphql.operation.selectionSet.1.argument.1.value |
EnumValue{name='ADMIN'} |
graphql.operation.selectionSet.1.argument.2.name |
null |
graphql.operation.selectionSet.1.argument.2.value |
null |
graphql.operation.selectionSet.1.selectionSet.count |
1 |
graphql.operation.selectionSet.1.selectionSet.count |
1 |
graphql.operation.selectionSet.1.selectionSet.1.name |
lastName |
graphql.operation.selectionSet.1.selectionSet.1.alias |
null |
graphql.operation.selectionSet.1.selectionSet.2.name |
null |
graphql.operation.selectionSet.1.selectionSet.2.alias |
null |
graphql.operation.selectionSet.1.directive.count |
0 |
graphql.operation.selectionSet.1.directive.1.argument.1.name |
null |
graphql.operation.selectionSet.1.directive.1.argument.1.value |
null |
graphql.operation.selectionSet.2.name |
users |
graphql.operation.selectionSet.2.alias |
accountants |
graphql.operation.selectionSet.2.argument.count |
1 |
graphql.operation.selectionSet.2.argument.1.name |
role |
graphql.operation.selectionSet.2.argument.1.value |
EnumValue{name='ACCOUNTANT'} |
graphql.operation.selectionSet.2.selectionSet.count |
1 |
graphql.operation.selectionSet.2.selectionSet.1.name |
firstName |
graphql.operation.selectionSet.2.directive.count |
0 |
graphql.operation.selectionSet.2.selectionSet.1.alias |
null |
graphql.operation.selectionSet.2.selectionSet.2.name |
null |
graphql.operation.selectionSet.2.selectionSet.2.alias |
null |
graphql.operation.selectionSet.2.directive.count |
0 |