Stai visualizzando la documentazione di Apigee Edge.
Consulta la
documentazione di Apigee X. info
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 restituiscono sempre 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 è:
<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 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 di:
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 al contenuto del messaggio.
L'esempio seguente trasforma in modo condizionale XML in JSON in base all'intestazione Accept:
<Step> <Condition>request.header.accept = "application/json"</Condition> <Name>XMLToJSON</Name> </Step>
Esecuzione flusso
Utilizzando le istruzioni condizionali, puoi controllare l'esecuzione dei flussi denominati in ProxyEndpoints e TargetEndpoints. Tieni presente che solo i flussi "denominati" possono essere eseguiti in modo condizionale. I preflow e i postflow (sia richiesta che risposta) su ProxyEndpoint e TargetEndpoint vengono eseguiti per ogni transazione e forniscono quindi funzionalità di "failsafe" incondizionate.
Ad esempio, per eseguire un flusso di richieste condizionali in base al verbo HTTP del messaggio di richiesta e un flusso di risposte condizionali in base a un codice di stato HTTP (potenziale) 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 instradamento inoltra una richiesta a un endpoint di destinazione specifico. Quando è disponibile più di un endpoint di destinazione, la regola di instradamento viene valutata in base alla sua condizione e, se è vera, la richiesta viene inoltrata all'endpoint di destinazione denominato.
Ad esempio, per instradare in modo condizionale i messaggi 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>Per saperne di più, consulta la sezione Variabili e condizioni del flusso.
Espressioni di percorso
Le espressioni di percorso vengono utilizzate per la corrispondenza dei percorsi URI, utilizzando "*" per rappresentare un singolo elemento di percorso e "**" per rappresentare più livelli URI.
Ad esempio:
| Pattern | Esempi di percorsi URI 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 carattere di escape. Il
pattern %{user%} corrisponde a {user}, ma non a
user.
Variabili
Puoi utilizzare sia le variabili di flusso integrate sia quelle personalizzate nelle istruzioni condizionali. Per ulteriori informazioni, vedi:
- Riferimento alle variabili di flusso: un elenco completo delle variabili integrate
- Norme ExtractVariables: istruzioni per l'impostazione di 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 Edge si basa sulle espressioni regolari implementate in
java.util.regex.
La tabella seguente elenca gli operatori supportati. Puoi utilizzare il simbolo o la parola nelle 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 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 convertita in >=. |
< |
LesserThan |
Minore di. La UI di Edge non supporta il carattere letterale <. |
<= |
LesserThanOrEquals |
Minore o uguale a. La UI Edge non supporta il valore letterale <=. |
&& |
And, and |
E |
|| |
Or |
L'operatore OR non è sensibile alle maiuscole. Ad esempio, OR, Or e or sono tutti valori 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, vedi Corrispondenza di pattern con condizionali. |
~/ |
MatchesPath, LikePath |
Corrisponde a un'espressione di percorso. La corrispondenza è sensibile alle maiuscole. Per alcuni esempi, vedi Corrispondenza di pattern con condizionali. |
=| |
StartsWith |
Corrisponde ai primi caratteri di una stringa. La corrispondenza è sensibile alle maiuscole. |
Operandi
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" (float, ad esempio 3.142f, 91.1F)
- "d" o "D" (double, ad esempio 3.142d, 100.123D)
- "l" o "L" (long, ad esempio 12321421312L)
In questi casi, il sistema esegue gli adattamenti mostrati nella tabella seguente (dove RHS si riferisce al lato destro dell'equazione e LHS al lato sinistro):
| RHS LHS | Booleano | Numero intero | Lungo | Float | Doppio | Stringa | Paragonabile | Oggetto |
|---|---|---|---|---|---|---|---|---|
| Booleano | Booleano | Numero intero | Lungo | Float | Doppio | Stringa | - | |
| Numero intero | Numero intero | Numero intero | Lungo | Float | Doppio | Stringa | Paragonabile | - |
| Lungo | Lungo | Lungo | Lungo | Float | Doppio | Stringa | Paragonabile | - |
| Float | Float | Float | Float | Float | 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 vengono valutate come true o
false quando i valori sono nulli sul lato sinistro (LHS) e/o destro (RHS)
dell'operando mostrato:
| Operatore | LHS null | RHS null | LHS e RHS 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:
nulltruefalse
Ad esempio:
request.header.host is nullflow.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>