Riferimento per le condizioni

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 runtime. Le condizioni definiscono le operazioni sulle 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, nelle seguenti sezioni viene descritta la sintassi:

Struttura delle dichiarazioni condizionali

La struttura di base di un'affermazione 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 è possibile utilizzare le istruzioni condizionali

Puoi utilizzare le condizioni per controllare il comportamento:

Esecuzione dei criteri

Utilizzando 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 di 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, di conseguenza, forniscono funzionalità 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 degli 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 per la sua condizione e, se true, la richiesta viene inoltrata all'endpoint di destinazione denominato.

Ad esempio, per instradare i messaggi in modo condizionale agli 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 ulteriori informazioni, consulta Variabili e condizioni di flusso.

Espressioni percorso

Le espressioni di percorso vengono utilizzate per i percorsi URI corrispondenti, con * per rappresentare un singolo elemento di 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 come un carattere di escape. Il pattern %{user%} corrisponde a {user} ma non a user.

Variabili

Puoi utilizzare sia variabili di flusso integrate sia variabili personalizzate nelle istruzioni condizionali. Per ulteriori informazioni, vedi:

Operatori

Quando utilizzi gli operatori, rispetta le seguenti restrizioni:

  • 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 di quest'ultima 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 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 &gt; GreaterThan Maggiore di. Se utilizzi > quando definisci la condizione nell'interfaccia utente di Apigee, questo viene convertito in &gt;.
>= o &gt;= GreaterThanOrEquals Maggiore o uguale a. Se utilizzi >= quando definisci la condizione nell'interfaccia utente di Apigee, viene convertito in &gt;=.
&lt; LesserThan Minore di. L'interfaccia utente di Apigee non supporta il valore letterale <.
&lt;= 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, mentre ) la chiude.
~~ JavaRegex

Corrisponde a un'espressione regolare conforme a javax.util.regex. La corrispondenza è sensibile alle maiuscole. Ad esempio, consulta la sezione Corrispondenza di pattern.

~ Matches, Like Corrisponde a un pattern di stile glob utilizzando il carattere jolly *. La corrispondenza è sensibile alle maiuscole. Ad esempio, consulta la sezione Corrispondenza di pattern.
~/ MatchesPath, LikePath Corrisponde a un'espressione del percorso. La corrispondenza è sensibile alle maiuscole. Ad esempio, consulta la sezione Corrispondenza di pattern.
=| StartsWith Corrisponde ai primi caratteri di una stringa. La corrispondenza è sensibile alle maiuscole.

Operatori

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 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 il lato destro si riferisce al lato destro dell'equazione e il lato sinistro è il lato sinistro):

DX - SX Booleano Numero intero Lungo In virgola mobile Doppio Stringa Paragonabile Oggetto
Booleano Booleano Numero intero Lungo In virgola mobile Doppio Stringa -
Numero intero Numero intero Numero intero Lungo In virgola mobile Doppio Stringa Paragonabile -
Lungo Lungo Lungo Lungo In virgola mobile Doppio Stringa Paragonabile -
In virgola mobile In virgola mobile In virgola mobile In virgola mobile 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 - - - - - - - -

Operatori null

La tabella seguente mostra se le condizioni restituiscono true o false quando i valori sono nulli sul lato sinistro (LHS) e/o sul lato destro (RHS) dell'operando mostrato:

Operatore LHS null RHS null LHS e RHS null
=, ==, := false false vero
=| false false false
!= vero vero false
> o &gt; vero false false
>= o &gt;= false vero vero
&lt; vero false false
&lt;= vero false vero
~ false N/A false
~~ false N/A false
!~ vero false false
~/ false N/A false

Valori letterali

Oltre ai valori letterali stringa e numerici, nelle istruzioni condizionali puoi utilizzare i seguenti valori letterali:

  • 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>