Questa pagina si applica a Apigee e Apigee ibridi.
Visualizza documentazione di Apigee Edge.
Le condizioni consentono ai proxy API di comportarsi in modo dinamico in fase di runtime. Le condizioni definiscono le operazioni
basate su variabili, che vengono valutate
dalla pipeline di elaborazione Apigee. Istruzioni condizionali
sono booleani e restituiscono sempre true
o false
.
Panoramica delle condizioni
Questa sezione descrive come e dove utilizzare le istruzioni condizionali con Apigee. Inoltre, le sezioni seguenti descrivono la sintassi:
Struttura delle istruzioni condizionali
La struttura di base di un'istruzione condizionale è la seguente:
<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 restituiscono true
solo se l'URI della richiesta corrisponde
/statuses
e il verbo HTTP della richiesta è
GET
:
<Condition>(proxy.pathsuffix MatchesPath "/statuses") and (request.verb = "GET")</Condition>
Dove è possibile utilizzare le istruzioni condizionali
Puoi utilizzare le condizioni per controllare il comportamento nei seguenti casi:
Esecuzione dei criteri
Utilizzando le dichiarazioni condizionali, puoi controllare l'applicazione dei criteri. Un caso d'uso comune è la trasformazione condizionale dei messaggi di risposta, basata sull'intestazione HTTP o sui contenuti dei messaggi.
L'esempio seguente trasforma in modo condizionale il codice XML in JSON in base all'attributo Accept
intestazione:
<Step> <Condition>request.header.accept = "application/json"</Condition> <Name>XMLToJSON</Name> </Step>
Esecuzione del flusso
Utilizzando le istruzioni condizionali, puoi controllare l'esecuzione di flussi denominati in ProxyEndpoints
e TargetEndpoints
. Tieni presente che solo i flussi con nome possono essere eseguiti in modo condizionale. Preflussi e
postflows (sia di richiesta che di risposta) su ProxyEndpoints
e TargetEndpoints
vengono eseguiti ogni
transazione, offrendo quindi funzionalità di failsafe incondizionate.
Ad esempio, per eseguire un flusso di richieste condizionale basato sul verbo HTTP della richiesta e un flusso di risposta condizionale basato su un (potenziale) codice di stato HTTP che rappresenta 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 della route dell'endpoint di destinazione
Utilizzando le istruzioni condizionali, puoi controllare l'endpoint di destinazione richiamato dall'endpoint proxy configurazione. Una regola di route inoltra una richiesta a un determinato endpoint di destinazione. Quando più di un endpoint di destinazione è disponibile, la regola di route viene valutata per la sua condizione e, se true, viene inoltrata all'endpoint di destinazione denominato.
Ad esempio, per indirizzare i messaggi in modo condizionale agli endpoint di destinazione designati in base
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>
Consulta le sezioni Variabili di flusso e per ulteriori informazioni.
Espressioni percorso
Le espressioni di percorso vengono utilizzate per trovare corrispondenze per i percorsi URI, utilizzando *
per rappresentare un singolo elemento del percorso
e **
per rappresentare più livelli 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. La
pattern %{user%}
corrisponde a {user}
ma non
user
.
Variabili
Nelle istruzioni condizionali puoi utilizzare sia variabili di flusso integrate sia variabili personalizzate. Per ulteriori informazioni, vedi:
- Riferimento per le variabili di flusso: un elenco completo delle variabili integrate
- Criterio Takeout: istruzioni sull'impostazione delle variabili personalizzate.
Operatori
Quando utilizzi gli operatori, osserva le seguenti limitazioni:
- Non è possibile utilizzare gli operatori 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. - Java la precedenza viene utilizzata per gli operatori.
- Apigee si basa sulle espressioni regolari implementate
java.util.regex
.
Nella tabella seguente sono elencati gli operatori supportati. Puoi usare il simbolo o la parola nel espressioni:
Simbolo | Word | Descrizione |
---|---|---|
! |
Not , not |
Operatore unario (richiede 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 > al momento di definire la condizione nella UI di Apigee, convertito in >. |
>= o >= |
GreaterThanOrEquals |
Maggiore di o uguale a. Se usi >= quando definisci la condizione nella UI di Apigee, viene convertito in >=. |
< |
LesserThan |
Minore di. La UI di Apigee non supporta il valore letterale <. |
<= |
LesserThanOrEquals |
Minore di o uguale a. La UI 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 ) si chiude
li annotino. |
|
~~ |
JavaRegex |
Corrisponde a un'espressione regolare conforme a |
~ |
Matches , Like |
Corrisponde a un pattern di tipo glob utilizzando il carattere jolly * . La corrispondenza è
sensibile alle maiuscole. Per alcuni esempi, vedi
Corrispondenza di pattern. |
~/ |
MatchesPath , LikePath |
Corrisponde a un'espressione del percorso. La corrispondenza è sensibile alle maiuscole. Per alcuni esempi, vedi 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
, l'espressione response.status.code = "400"
e
response.status.code = 400
sono equivalenti.
Per gli operandi numerici, il tipo di dati viene interpretato come numero intero a meno che il valore non venga terminato come segue:
f
oF
(float
, ad esempio3.142f, 91.1F
)d
oD
(double
, ad esempio3.142d, 100.123D
)l
oL
(long
, ad esempio12321421312L
)
In questi casi, il sistema esegue gli adattamenti mostrati nella tabella seguente (dove RHS si riferisce a destra dell'equazione e a sinistra il lato sinistro):
A destra a sinistra | 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 nulli
La tabella seguente mostra se le condizioni restituiscono true
o
false
quando i valori sono nulli a sinistra (LHS) e/o a destra (RHS)
dell'operando mostrato:
Operatore | LHS null | RHS null | LHS e RHS null |
---|---|---|---|
= , == , := |
false | false | vero |
=| |
false | false | false |
!= |
vero | vero | false |
> o > |
vero | false | false |
>= o >= |
false | vero | vero |
< |
vero | false | false |
<= |
vero | false | vero |
~ |
false | N/A | false |
~~ |
false | N/A | false |
!~ |
vero | false | false |
~/ |
false | N/A | false |
Valori letterali
Oltre ai valori letterali numerici e stringa, puoi utilizzare i seguenti valori letterali in istruzioni 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>