Questa pagina si applica ad Apigee e Apigee hybrid.
Visualizza la documentazione di
Apigee Edge.
Cosa
Il criterio GraphQL può analizzare i payload GraphQL in variabili di flusso di messaggi, verificare le richieste GraphQL rispetto a uno schema o entrambe le cose.
Puoi utilizzare il criterio GraphQL per:
- Assicurati che le tue API elaborino solo le richieste conformi allo schema che fornisci.
- Impostare limitazioni sul payload impostando un numero massimo di frammenti consentiti.
- Associa GraphQL ai prodotti API.
- Utilizza le funzionalità Oauth2, VerifyAPIKey e Quota policy, come in REST.
GraphQL supporta i seguenti tipi di payload:
- POST di payload GraphQL con
Content-Type : application/graphql
- POST di payload GraphQL con
Content-Type: applcation/json
- GET dei payload GraphQL in cui il payload è un parametro di query
Per maggiori informazioni, consulta le seguenti risorse:
Questa policy è una policy standard e può essere implementata in qualsiasi tipo di ambiente. Per informazioni sui tipi di criteri e sulla disponibilità per ogni tipo di ambiente, consulta Tipi di criteri.
Per un esempio che utilizza questo criterio, vedi Utilizzo di GraphQL.
Elemento <GraphQL>
Definisce un criterio <GraphQL>
.
Valore predefinito | Consulta la scheda Policy predefinita di seguito. |
Obbligatorio? | Obbligatorio |
Tipo | TIPO |
Elemento principale | n/a |
Elementi secondari | <Action> <MaxDepth> <MaxCount> <MaxPayloadSizeInBytes> <OperationType> <Source> <ResourceURL> |
Sintassi
L'elemento <GraphQL>
utilizza la seguente sintassi:
<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>
Norme predefinite
L'esempio seguente mostra le impostazioni predefinite quando aggiungi un criterio <GraphQL>
al flusso nell'interfaccia utente 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>
Questo elemento ha i seguenti attributi comuni a tutti i criteri:
Attributo | Predefinito | Obbligatorio? | Descrizione |
---|---|---|---|
name |
N/D | Obbligatorio |
Il nome interno del criterio. Il valore dell'attributo Se vuoi, utilizza l'elemento |
continueOnError |
falso | Facoltativo | Imposta su false per restituire un errore quando un criterio non va a buon fine. Questo è un comportamento previsto per la maggior parte dei criteri. Imposta su true per continuare l'esecuzione del flusso anche dopo un fallimento del criterio. Vedi anche:
|
enabled |
true | Facoltativo | Imposta su true per applicare il criterio. Imposta su false per disattivare il
criterio. Il criterio non verrà applicato anche se rimane collegato a un flusso. |
async |
falso | Ritirato | Questo attributo è stato ritirato. |
La tabella seguente fornisce una descrizione generale degli elementi secondari di
<GraphQL>
:
Elemento secondario | Obbligatorio? | Descrizione |
---|---|---|
Operazioni comuni | ||
<Action> |
Facoltativo | Specifica l'azione da intraprendere per una richiesta: parse , verify o
parse_verify (entrambe).
|
<MaxCount> |
Facoltativo | Il numero massimo di query o frammenti che una richiesta GraphQL può generare. Il valore predefinito è 10. |
<MaxDepth> |
Facoltativo | La profondità massima dell'albero per la query. Il valore predefinito è 4. |
<MaxPayloadSizeInBytes> |
Facoltativo | La dimensione massima di un payload in kilobyte. |
<OperationType> |
Obbligatorio | Specifica il tipo di richiesta che può essere analizzata: query ,
mutation o query_mutation (uno dei due). |
<ResourceURL> |
Facoltativo | DESCRIZIONE. La posizione del file di schema GraphQL. |
<Source> |
Obbligatorio | request |
Ognuno di questi elementi secondari è descritto nelle sezioni seguenti.
Riferimento all'elemento secondario
Questa sezione descrive gli elementi secondari di <GraphQL>
.
<Action>
L'azione rappresenta una delle seguenti azioni GraphQL:
parse
: Apigee analizza il payload GraphQL in variabili di flusso di messaggi. Consulta Esempi di rappresentazioni delle variabili del flusso di messaggi per una spiegazione delle variabili impostate quandoAction
è impostato suparse
. In questo modo, puoi risparmiare tempo prezioso della CPU nel backend. Tieni presente cheverify
analizza anche il payload.verify
: Apigee verifica che il payload GraphQL sia conforme allo schema caricato nel proxy.parse_verify
: Apigee analizza e verifica la richiesta GraphQL.
Valore predefinito | parse |
Obbligatorio? | Optional |
Tipo | Stringa |
Elemento principale | <GraphQL> |
Elementi secondari | nessuno |
L'elemento <Action>
utilizza la seguente sintassi:
Sintassi
<GraphQL continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <Action>parse</Action> </GraphQL>
<MaxCount>
Il numero massimo di frammenti che possono essere presenti nel payload. Puoi utilizzare questo parametro per impedire al server di backend GraphQL del cliente di eseguire query molto complesse, costringendo i client a suddividere la logica in payload più piccoli.
Valore predefinito | 10 |
Obbligatorio? | Optional |
Tipo | Stringa |
Elemento principale | <GraphQL> |
Elementi secondari | nessuno |
L'elemento <MaxCount>
utilizza la seguente sintassi:
Sintassi
<GraphQL continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <MaxCount>MAX_NUMBER_OF_QUERIES</MaxCount> </GraphQL>
<MaxDepth>
La profondità massima della query, se rappresentata come un albero.
MaxDepth
ti consente di bloccare le query approfondite nel payload,
in modo che Apigee non debba creare variabili di flusso molto grandi per contenere i valori.
Tuttavia, il payload viene inviato così com'è, indipendentemente dal valore di MaxDepth
.
Il valore predefinito è 10.
Valore predefinito | 10 |
Obbligatorio? | Optional |
Tipo | Numero intero |
Elemento principale | <GraphQL> |
Elementi secondari | nessuno |
L'elemento <MaxDepth>
utilizza la seguente sintassi:
Sintassi
<GraphQL continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <MaxDepth>MAX_DEPTH</MaxDepth> </GraphQL>
<MaxPayloadSizeInBytes>
La dimensione massima di un payload in kilobyte. Puoi utilizzare questo parametro per limitare le dimensioni del payload ed evitare problemi di prestazioni.
Nota:se MaxPayloadSizeInByte
non viene fornito nelle norme,
non viene applicata alcuna limitazione di dimensione.
Valore predefinito | request |
Obbligatorio? | Optional |
Tipo | Stringa |
Elemento principale | <GraphQL> |
Elementi secondari | nessuno |
L'elemento <MaxPayloadSizeInBytes>
utilizza la seguente sintassi:
Sintassi
<GraphQL continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <MaxPayloadSizeInBytes>MAX_PAYLOAD_SIZE_IN_BYTES</MaxPayloadSizeInBytes> </GraphQL>
<OperationType>
Indica il tipo di richiesta che può essere analizzata:
query
: una query GraphQL.mutation
: una mutazione GraphQLquery_mutation
: una query o una mutazione GraphQL.
Se l'ambito è query
e viene trasmessa una richiesta di mutazione, la richiesta non va a buon fine
e viene restituito un errore 4xx
.
Valore predefinito | query |
Obbligatorio? | Optional |
Tipo | Stringa |
Elemento principale | <GraphQL> |
Elementi secondari | nessuno |
L'elemento <OperationType>
utilizza la seguente sintassi:
Sintassi
<GraphQL continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <OperationType>[query|mutation|query_mutation]</OperationType> </GraphQL>
<ResourceURL>
Il percorso del file dello schema GraphQL rispetto al quale il criterio GraphQL verifica le richieste. Consulta Esempio per un esempio di caricamento di uno schema GraphQL su Apigee.
Se il nome del file dello schema caricato è my-schema.graphql
, l'elemento
<ResourceURL>
sarà
<ResourceURL>graphql://my-schema.graphql</ResourceURL>
Valore predefinito | n/a |
Obbligatorio? | Facoltativo |
Tipo | Stringa |
Elemento principale | <GraphQL> |
Elementi secondari | nessuno |
L'elemento ResourceURL
utilizza la seguente sintassi:
Sintassi
<GraphQL continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <ResourceURL>PATH/TO/SCHEMA.graphql</ResourceURL> </GraphQL>
<Source>
Origine su cui viene eseguito questo criterio.
Valore predefinito | request |
Obbligatorio? | Optional |
Tipo | Stringa |
Elemento principale | <GraphQL> |
Elementi secondari | nessuno |
L'elemento <Source>
utilizza la seguente sintassi:
Sintassi
<GraphQL continueOnError="[false|true]" enabled="[true|false]" name="POLICY_NAME" > <Source>request</Source> </GraphQL>
Analizzatore sintattico GraphQL
Il parser GraphQL supporta tutte le funzionalità di una query GraphQL e la rappresenta come un grafico nella notazione punteggiata del flusso di messaggi. Una query può essere costituita da una definizione di operazione e, facoltativamente, da frammenti identificati come definizioni di frammenti. Consulta la specifica GraphQL.
Anatomia di una richiesta GraphQL
Il diagramma seguente mostra la struttura di una richiesta GraphQL.

Rappresentazione nel flusso di messaggi delle definizioni delle operazioni
L'implementazione del parser copre tutti gli aspetti della sintassi GraphQL, incluso il supporto per query e mutazioni. Vedi Variabile di flusso message.
Le variabili di flusso message seguono questa convenzione:
graphql.(root-index).(root definition)[(sub-indices).(child-definitions)…]
dove:
graphql
: prefisso statico che indica che si tratta di variabili di flusso di messaggi correlate a GraphQLroot-Index
: indice basato che indica l'indice delle definizioni di query a livello di radice (valore predefinito fino a 4 per richiesta)root-definition
: Corpo del messaggio della richiesta GraphQL di livello principale, argomenti e relativi valorisub-indices
: Indici secondarichild-definitions
: definizioni a livello di foglia che corrispondono a campi specifici e ai relativi valori
Rappresentazione nelle definizioni delle operazioni della variabile di flusso message
Campi nel messaggio | Tipo | Descrizione |
---|---|---|
nome | Stringa | Nome dell'operazione GraphQL. Tieni presente che questo nome non è correlato al nome nel flusso di messaggi. |
definizione | Stringa - Operazione | Indica che questo campo contiene il corpo principale del messaggio della richiesta di query |
operationType | query o mutazione | Il tipo di operazione eseguita. |
variableDefinition | Numero intero | Funzionano esattamente come le definizioni degli argomenti per una funzione in un linguaggio tipizzato. Elenca tutte le variabili, precedute dal simbolo $, seguito dal tipo. |
direttive | Numero intero | @include e @skip sono le due direttive attualmente offerte, che possono filtrare in base ai valori passati dinamicamente. |
selectionSet | Numero intero | Un raggruppamento logico di primo livello di tutti gli attributi associati a un oggetto. |
Rappresentazione nel flusso di messaggi delle definizioni dei frammenti
Nome variabile di flusso message | Tipo | Descrizione |
---|---|---|
nome | Stringa | Nome del frammento. |
definizione | Stringa - frammento | Indica che il corpo della richiesta è un frammento della richiesta principale. |
typeCondition | Stringa | La condizione in base alla quale viene richiamato il frammento. |
variableDefinition | Numero intero | La definizione delle variabili passate come argomenti al frammento. |
Esempi di rappresentazioni delle variabili di flusso message
Gli esempi seguenti mostrano le rappresentazioni delle variabili di flusso dei messaggi per i payload delle richieste di esempio.
Query di esempio 1
Questo esempio mostra una query eseguita con argomenti passati come input, che esegue query su tre attributi per i dipendenti.
{ employee(id: 123) { id firstName lastName } }
La tabella mostra le rappresentazioni delle variabili del flusso di messaggi corrispondenti.
Variabile di flusso message | Valore |
---|---|
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 |
Query di esempio 2
Questo esempio mostra una query eseguita con argomenti passati come input, che esegue query per i nomi degli amici.
query Characters($episode: Episode, $withFriends: Boolean!) { friends @include(if: $withFriends) { friendsName } }
La tabella seguente mostra le rappresentazioni delle variabili del flusso di messaggi corrispondenti.
Variabile di flusso message | Valore |
---|---|
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'} |
Query di esempio 3
Questo esempio contiene una definizione di variabile con alias.
query getUsers { admins: users(role: ADMIN) { lastName } accountants: users(role: ACCOUNTANT) { firstName } }
La tabella seguente mostra le rappresentazioni delle variabili del flusso di messaggi corrispondenti.
Variabile di flusso message | Valore |
---|---|
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 |