Política de GraphQL

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

Consulta la documentación de Apigee Edge.

Icono de política de GraphQL

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&lt/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 name puede contener letras, números, espacios, guiones, guiones bajos y puntos. Este valor no puede superar los 255 caracteres.

Opcionalmente, usa el elemento <DisplayName> para etiquetar la política en el editor de proxy de la interfaz de gestión con un nombre diferente en lenguaje natural.

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 cuando Action se define como parse. De esta forma, se puede ahorrar tiempo de CPU valioso en el backend. Ten en cuenta que verify 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 GraphQL
  • query_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.

Diagrama de consulta 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 secundarios
  • child-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

Temas relacionados

Usar GraphQL