Stai visualizzando la documentazione di Apigee Edge.
Vai alla
documentazione di Apigee X. informazioni
Le condizioni consentono ai proxy API di comportarsi in modo dinamico in fase di runtime. Le condizioni definiscono le operazioni sulle variabili, che vengono valutate dalla pipeline di elaborazione di Apigee Edge. Le istruzioni condizionali sono booleane e vengono sempre valutate come true
o false
.
Panoramica delle condizioni
Questa sezione descrive come e dove utilizzare le istruzioni condizionali con Edge. 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 condizioni con AND per applicarne più di una alla volta. Ad esempio, le
seguenti condizioni restituiscono 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 utilizzare le istruzioni condizionali
Puoi utilizzare le condizioni per controllare il comportamento in:
Esecuzione dei criteri
Con le istruzioni 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 del messaggio.
L'esempio seguente trasforma in modo condizionale il file 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 "con nome" possono essere eseguiti in modo condizionale. I pre-flussi e i post-flussi (sia di richiesta che di risposta) su ProxyEndpoints e TargetEndpoints vengono eseguiti per ogni transazione e, pertanto, forniscono funzionalità di "failsafe" incondizionate.
Ad esempio, per eseguire un flusso di richiesta condizionale basato sul verbo HTTP del messaggio di richiesta e un flusso di risposta condizionale basato su 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 della route dell'endpoint di destinazione
Utilizzando le istruzioni condizionali, puoi controllare l'endpoint di destinazione richiamato 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 route viene valutata in base alla sua condizione e, se true, la richiesta viene inoltrata all'endpoint di destinazione denominato.
Ad esempio, per indirizzare i messaggi in modo condizionale a endpoint di destinazione 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>
Consulta Variabili e condizioni di flusso per ulteriori informazioni.
Espressioni percorso
Le espressioni percorso vengono utilizzate per i percorsi URI corrispondenti, utilizzando "*" per rappresentare un singolo elemento del percorso e "**" per rappresentare più livelli URI.
Ad esempio:
Sequenza | 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 come un carattere di escape. Il
pattern %{user%}
corrisponde a {user}
ma non a
user
.
Variabili
Nelle istruzioni condizionali puoi utilizzare sia variabili di flusso integrate sia variabili personalizzate. Per ulteriori informazioni, vedi:
- Riferimento variabili di flusso: un elenco completo delle variabili integrate
- Norma ExtractVariables: istruzioni su come impostare 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 di Java.
- Apigee Edge si basa sulle espressioni regolari implementate in
java.util.regex
.
Nella tabella seguente sono elencati gli operatori supportati. Puoi usare il simbolo o la parola nelle espressioni:
Simbolo | Parole | Descrizione |
---|---|---|
! |
Not , not |
Operatore unario (accetta un singolo input) |
= |
Equals , Is |
Uguale a (sensibile alle maiuscole) |
!= |
NotEquals , IsNot |
Non uguale (sensibile alle maiuscole) |
:= |
EqualsCaseInsensitive |
Uguale a, ma senza distinzione tra maiuscole e minuscole |
> o > |
GreaterThan |
Maggiore di. Se utilizzi > quando definisci la condizione nell'interfaccia utente Edge, viene convertito in >. |
>= o >= |
GreaterThanOrEquals |
Maggiore o uguale a. Se utilizzi >= quando definisci la condizione nell'interfaccia utente Edge, viene convertito in >=. |
< |
LesserThan |
Minore di. L'interfaccia utente perimetrale non supporta il valore letterale <. |
<= |
LesserThanOrEquals |
Minore o uguale a. L'interfaccia utente perimetrale 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 di stile glob utilizzando il carattere jolly "*". La corrispondenza è sensibile alle maiuscole. Per alcuni esempi, consulta la sezione Corrispondenza di pattern con le condizionali. |
~/ |
MatchesPath , LikePath |
Corrisponde a un'espressione del percorso. La corrispondenza è sensibile alle maiuscole. Per alcuni esempi, consulta la sezione Corrispondenza di pattern con le condizionali. |
=| |
StartsWith |
Corrisponde ai primi caratteri di una stringa. La corrispondenza è sensibile alle maiuscole. |
Operatori
Apigee Edge 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 termini come segue:
- "f" o "F" (numero in virgola mobile, ad esempio 3.142f, 91.1F)
- "d" o "D" (doppio, ad esempio, 3.142d, 100.123D)
- "l" o "L" (lungo, ad esempio 12321421312L)
In questi casi, il sistema esegue gli adattamenti mostrati nella tabella seguente (dove il lato destro si riferisce al lato destro dell'equazione e il lato sinistro è il lato sinistro):
Dx, sinistra | Booleano | Numero intero | Lungo | In virgola mobile | Matrimoniale | Stringa | Paragonabile | Oggetto |
---|---|---|---|---|---|---|---|---|
Booleano | Booleano | Numero intero | Lungo | In virgola mobile | Matrimoniale | Stringa | - | |
Numero intero | Numero intero | Numero intero | Lungo | In virgola mobile | Matrimoniale | Stringa | Paragonabile | - |
Lungo | Lungo | Lungo | Lungo | In virgola mobile | Matrimoniale | Stringa | Paragonabile | - |
In virgola mobile | In virgola mobile | In virgola mobile | In virgola mobile | In virgola mobile | Matrimoniale | Stringa | Paragonabile | - |
Matrimoniale | Matrimoniale | Matrimoniale | Matrimoniale | Matrimoniale | Matrimoniale | Stringa | Paragonabile | - |
Stringa | Stringa | Stringa | Stringa | Stringa | Stringa | Stringa | Paragonabile | - |
Paragonabile | Paragonabile | Paragonabile | Paragonabile | Paragonabile | Paragonabile | Paragonabile | Paragonabile | - |
Oggetto | - | - | - | - | - | - | - | - |
Operatori nulli
La tabella seguente mostra se le condizioni restituiscono true
o false
quando i valori sono nulli sul lato sinistro (sinistra) e/o sul lato destro (destra) dell'operando mostrato:
Operatore | LHS null | Dx nullo | Sinistra e destra null |
---|---|---|---|
= , == e := |
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 stringa e numerici, puoi utilizzare i seguenti valori letterali nelle 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>