Questa pagina si applica ad Apigee e Apigee hybrid.
Visualizza la documentazione di Apigee Edge.
Le condizioni consentono ai proxy API di comportarsi in modo dinamico in fase di esecuzione. Le condizioni definiscono operazioni su variabili, che vengono valutate dalla pipeline di elaborazione di Apigee. Le istruzioni condizionali
sono booleane e restituiscono sempre true
o false
.
Panoramica delle condizioni
Questa sezione descrive come e dove utilizzare le istruzioni condizionali con Apigee. Inoltre, le seguenti sezioni descrivono la sintassi:
Struttura delle istruzioni condizionali
La struttura di base di un'istruzione condizionale è:
<Condition>variable.name operator "value"</Condition>
Ad esempio:
<Condition>request.verb = "GET"</Condition>
Puoi combinare le condizioni con AND
per applicarne più di una alla volta. Ad esempio, le seguenti condizioni valutano true
solo se l'URI della richiesta corrisponde a /statuses
e il verbo HTTP della richiesta è GET
:
<Condition>(proxy.pathsuffix MatchesPath "/statuses") and (request.verb = "GET")</Condition>
Dove puoi utilizzare le istruzioni condizionali
Puoi utilizzare le condizioni per controllare il comportamento nei seguenti casi:
Esecuzione delle norme
Utilizzando le istruzioni condizionali, puoi controllare l'applicazione dei criteri. Un caso d'uso comune è la trasformazione condizionale dei messaggi di risposta in base all'intestazione HTTP o ai contenuti del messaggio.
L'esempio seguente trasforma condizionalmente XML in JSON in base all'intestazione Accept
:
<Step> <Condition>request.header.accept = "application/json"</Condition> <Name>XMLToJSON</Name> </Step>
Esecuzione del flusso
Utilizzando le istruzioni condizionali, puoi controllare l'esecuzione dei flussi denominati in ProxyEndpoints
e TargetEndpoints
. Tieni presente che solo i flussi nominati possono essere eseguiti in modo condizionale. I preflow e i postflow (sia di richiesta che di risposta) su ProxyEndpoints
e TargetEndpoints
vengono eseguiti per ogni transazione e, di conseguenza, forniscono funzionalità di failsafe incondizionali.
Ad esempio, per eseguire un flusso di richieste condizionali in base al verbo HTTP del messaggio di richiesta e un flusso di risposta condizionale in base a un (potenziale) codice di stato HTTP che rappresenta un errore:
<Flow name="GetRequests"> <Condition>request.verb = "GET"</Condition> <Request> <Step> <Condition>request.path MatchesPath "/statuses/**"</Condition> <Name>StatusesRequestPolicy</Name> </Step> </Request> <Response> <Step> <Condition>(response.status.code = 503) or (response.status.code = 400)</Condition> <Name>MaintenancePolicy</Name> </Step> </Response> </Flow>
Selezione del percorso dell'endpoint di destinazione
Utilizzando le istruzioni condizionali, puoi controllare l'endpoint target invocato dalla configurazione dell'endpoint proxy. Una regola di route inoltra una richiesta a un determinato endpoint di destinazione. Quando è disponibile più di un endpoint di destinazione, la regola di routing viene valutata per la relativa condizione e, se è vera, la richiesta viene inoltrata all'endpoint di destinazione denominato.
Ad esempio, per instradare i messaggi in modo condizionale a endpoint target designati in base a Content-Type
:
<RouteRule name="default">
<!--this routing executes if the header indicates that this is an XML call. If true, the call is routed to the endpoint XMLTargetEndpoint-->
<Condition>request.header.Content-Type = "text/xml"</Condition>
<TargetEndpoint>XmlTargetEndpoint</TargetEndpoint>
</RouteRule>
Per ulteriori informazioni, consulta la sezione Variabili e condizioni.
Espressioni di percorso
Le espressioni di percorso vengono utilizzate per abbinare i percorsi URI, utilizzando *
per rappresentare un singolo elemento del percorso
e **
per rappresentare più livelli di URI.
Ad esempio:
Pattern | Percorsi URI di esempio corrispondenti |
---|---|
/*/a/ |
/x/a/ o /y/a/ |
/*/a/* |
/x/a/b o /y/a/foo |
/*/a/** |
/x/a/b/c/d |
/*/a/*/feed/ |
/x/a/b/feed/ o /y/a/foo/feed/ |
/a/**/feed/** |
/a/b/feed/rss/1234 |
%
viene considerato un carattere di escape. Il
pattern %{user%}
corrisponde a {user}
, ma non
a user
.
Variabili
Negli statement condizionali puoi utilizzare sia le variabili di flusso integrate sia quelle personalizzate. Per ulteriori informazioni, vedi:
- Riferimento alle variabili di flusso: un elenco completo delle variabili integrate
- Norma ExtractVariables: istruzioni per l'impostazione delle variabili personalizzate
Operatori
Quando utilizzi gli operatori, rispetta le seguenti limitazioni:
- Gli operatori non possono essere utilizzati come nomi di variabili.
- È necessario uno spazio prima e dopo un operatore.
- Per includere un operatore in una variabile, il nome della variabile deve essere racchiuso tra virgolette singole.
Ad esempio,
'request.header.help!me'
. - Gli operatori aritmetici (
+ * - / %
) non sono supportati. - Per gli operatori viene utilizzata la precedenza Java.
- Apigee si basa sulle espressioni regolari implementate in
java.util.regex
.
Nella tabella seguente sono elencati gli operatori supportati. Puoi utilizzare il simbolo o la parola nelle tue espressioni:
Simbolo | Word | Descrizione |
---|---|---|
! |
Not , not |
Operatore unario (accetta un singolo input) |
= |
Equals , Is |
È uguale a (sensibile alle maiuscole) |
!= |
NotEquals , IsNot |
È diverso da (sensibile alle maiuscole) |
:= |
EqualsCaseInsensitive |
È uguale a, ma non fa distinzione tra maiuscole e minuscole |
> o > |
GreaterThan |
Maggiore di. Se utilizzi > per definire la condizione nell'interfaccia utente di Apigee, il valore viene convertito in >. |
>= o >= |
GreaterThanOrEquals |
Maggiore o uguale a. Se utilizzi >= per definire la condizione nell'interfaccia utente di Apigee, viene convertito in >=. |
< |
LesserThan |
Minore di. L'interfaccia utente di Apigee non supporta il valore letterale <. |
<= |
LesserThanOrEquals |
Minore o uguale a. L'interfaccia utente di Apigee non supporta il valore letterale <=. |
&& |
And , and |
E |
|| |
Or |
L'operatore OR non è sensibile alle maiuscole. Ad esempio, OR , Or e or sono tutti validi. |
() |
Raggruppa un'espressione. ( apre l'espressione e ) la chiude. |
|
~~ |
JavaRegex |
Corrisponde a un'espressione regolare conforme a |
~ |
Matches , Like |
Corrisponde a un pattern in stile glob utilizzando il carattere jolly * . La corrispondenza è
sensibile alle maiuscole. Per alcuni esempi, consulta
Corrispondenza di pattern. |
~/ |
MatchesPath , LikePath |
Corrisponde a un'espressione di percorso. La corrispondenza è sensibile alle maiuscole. Per alcuni esempi, consulta Corrispondenza di pattern. |
=| |
StartsWith |
Corrisponde ai primi caratteri di una stringa. La corrispondenza è sensibile alle maiuscole. |
Operandi
Apigee adatta gli operandi a un tipo di dati comune prima di confrontarli. Ad esempio, se il codice di stato della risposta è 404
, le espressioni response.status.code = "400"
e response.status.code = 400
sono equivalenti.
Per gli operandi numerici, il tipo di dati viene interpretato come intero, a meno che il valore non sia terminato come segue:
f
oF
(float
, ad esempio,3.142f, 91.1F
)d
oD
(double
, ad esempio,3.142d, 100.123D
)l
oL
(long
, ad esempio,12321421312L
)
In questi casi, il sistema esegue le adattamenti riportati nella tabella seguente (dove RHS si riferisce al lato destro dell'equazione e LHS al lato sinistro):
RHS LHS | Booleano | Numero intero | Lungo | Numero in virgola mobile | Doppio | Stringa | Paragonabile | Oggetto |
---|---|---|---|---|---|---|---|---|
Booleano | Booleano | Numero intero | Lungo | Numero in virgola mobile | Doppio | Stringa | - | |
Numero intero | Numero intero | Numero intero | Lungo | Numero in virgola mobile | Doppio | Stringa | Paragonabile | - |
Lungo | Lungo | Lungo | Lungo | Numero in virgola mobile | Doppio | Stringa | Paragonabile | - |
Numero in virgola mobile | Numero in virgola mobile | Numero in virgola mobile | Numero in virgola mobile | Numero in virgola mobile | Doppio | Stringa | Paragonabile | - |
Doppio | Doppio | Doppio | Doppio | Doppio | Doppio | Stringa | Paragonabile | - |
Stringa | Stringa | Stringa | Stringa | Stringa | Stringa | Stringa | Paragonabile | - |
Paragonabile | Paragonabile | Paragonabile | Paragonabile | Paragonabile | Paragonabile | Paragonabile | Paragonabile | - |
Oggetto | - | - | - | - | - | - | - | - |
Operandi null
La tabella seguente mostra se le condizioni hanno come risultato true
o
false
quando i valori sono nulli sul lato sinistro (LS) e/o sul lato destro (RS)
dell'operando mostrato:
Operatore | LHS null | RHS null | LHS e RHS null |
---|---|---|---|
= , == , := |
false | false | true |
=| |
false | false | false |
!= |
true | true | false |
> o > |
true | false | false |
>= o >= |
false | true | true |
< |
true | false | false |
<= |
true | false | true |
~ |
false | N/A | false |
~~ |
false | N/A | false |
!~ |
true | false | false |
~/ |
false | N/A | false |
Valori letterali
Oltre ai valori letterali di stringa e numerici, puoi utilizzare i seguenti valori letterali nelle affermazioni condizionali:
null
true
false
Ad esempio:
request.header.host is null
flow.cachehit is true
Esempi
<RouteRule name="default"> <Condition>request.header.content-type = "text/xml"</Condition> <TargetEndpoint>XmlTargetEndpoint</TargetEndpoint> </RouteRule>
<Step> <Condition>response.status.code = 503</Condition> <Name>MaintenancePolicy</Name> </Step>
<Flow name="GetRequests"> <Condition>response.verb="GET"</Condition> <Request> <Step> <Condition>request.path ~ "/statuses/**"</Condition> <Name>StatusesRequestPolicy</Name> </Step> </Request> <Response> <Step> <Condition>(response.status.code = 503) or (response.status.code = 400)</Condition> <Name>MaintenancePolicy</Name> </Step> </Response> </Flow>