Referensi kondisi

Anda sedang melihat dokumentasi Apigee Edge.
Buka dokumentasi Apigee X.
info

Kondisi memungkinkan Proxy API berperilaku secara dinamis saat runtime. Kondisi menentukan operasi pada variabel, yang dievaluasi oleh pipeline pemrosesan Apigee Edge. Pernyataan kondisional adalah boolean dan selalu dievaluasi ke true atau false.

Ringkasan kondisi

Bagian ini menjelaskan cara dan tempat menggunakan pernyataan bersyarat dengan Edge. Selain itu, bagian berikut menjelaskan sintaksisnya:

Struktur pernyataan bersyarat

Struktur dasar pernyataan kondisional adalah:

<Condition>variable.name operator "value"</Condition>

Contoh:

<Condition>request.verb = "GET"</Condition>

Anda dapat menggabungkan kondisi dengan AND untuk menerapkan lebih dari satu kondisi sekaligus. Misalnya, kondisi berikut dievaluasi ke true hanya jika URI permintaan cocok dengan /statuses dan kata kerja HTTP permintaan adalah GET:

<Condition>(proxy.pathsuffix MatchesPath "/statuses") and (request.verb = "GET")</Condition>

Tempat Anda dapat menggunakan pernyataan bersyarat

Anda dapat menggunakan kondisi untuk mengontrol perilaku dalam hal berikut:

Eksekusi kebijakan

Dengan menggunakan pernyataan bersyarat, Anda dapat mengontrol penerapan kebijakan. Kasus penggunaan umum adalah transformasi pesan respons bersyarat, berdasarkan header HTTP atau konten pesan.

Contoh berikut secara kondisional mengubah XML menjadi JSON berdasarkan header Accept:

<Step>
  <Condition>request.header.accept = "application/json"</Condition>
  <Name>XMLToJSON</Name>
</Step>

Eksekusi alur

Dengan menggunakan pernyataan bersyarat, Anda dapat mengontrol eksekusi alur bernama di ProxyEndpoints dan TargetEndpoints. Perhatikan bahwa hanya alur 'bernama' yang dapat dieksekusi secara kondisional. Preflow dan postflow (permintaan dan respons) di ProxyEndpoint dan TargetEndpoint dieksekusi untuk setiap transaksi, sehingga memberikan kemampuan 'aman' tanpa syarat.

Misalnya, untuk mengeksekusi alur permintaan kondisional berdasarkan kata kerja HTTP dari pesan permintaan, dan alur respons kondisional berdasarkan kode status HTTP (potensial) yang merepresentasikan error:

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

Pemilihan rute endpoint target

Dengan menggunakan pernyataan bersyarat, Anda dapat mengontrol endpoint target yang dipanggil oleh konfigurasi endpoint proxy. Aturan rute meneruskan permintaan ke endpoint target tertentu. Jika ada lebih dari satu endpoint target yang tersedia, aturan rute dievaluasi untuk kondisinya dan, jika benar, permintaan diteruskan ke endpoint target bernama.

Misalnya, untuk mengarahkan pesan secara bersyarat ke endpoint target yang ditentukan berdasarkan 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>

Lihat Variabel dan kondisi alur untuk mengetahui informasi selengkapnya.

Ekspresi jalur

Ekspresi jalur digunakan untuk mencocokkan jalur URI, menggunakan "*" untuk merepresentasikan satu elemen jalur dan "**" untuk merepresentasikan beberapa tingkat URI.

Contoh:

Pola Contoh jalur URI yang cocok
/*/a/ /x/a/ atau /y/a/
/*/a/* /x/a/b atau /y/a/foo
/*/a/** /x/a/b/c/d
/*/a/*/feed/ /x/a/b/feed/ atau /y/a/foo/feed/
/a/**/feed/** /a/b/feed/rss/1234

% diperlakukan sebagai karakter escape. Pola %{user%} cocok dengan {user}, tetapi tidak cocok dengan user.

Variabel

Anda dapat menggunakan variabel alur bawaan dan variabel kustom dalam pernyataan bersyarat. Untuk informasi selengkapnya, lihat:

Operator

Saat menggunakan operator, perhatikan batasan berikut:

  • Operator tidak dapat digunakan sebagai nama variabel.
  • Karakter spasi diperlukan sebelum dan sesudah operator.
  • Untuk menyertakan operator dalam variabel, nama variabel harus diapit tanda petik tunggal. Misalnya, 'request.header.help!me'.
  • Operator aritmetika (+ * - / %) tidak didukung.
  • Prioritas Java digunakan untuk operator.
  • Apigee Edge mengandalkan ekspresi reguler seperti yang diterapkan di java.util.regex.

Tabel berikut mencantumkan operator yang didukung. Anda dapat menggunakan simbol atau kata dalam ekspresi:

Simbol Kata Deskripsi
! Not, not Operator unary (mengambil satu input)
= Equals, Is Sama dengan (peka huruf besar/kecil)
!= NotEquals, IsNot Tidak sama dengan (peka huruf besar/kecil)
:= EqualsCaseInsensitive Sama dengan, tetapi tidak peka huruf besar/kecil
> atau &gt; GreaterThan Lebih besar dari. Jika Anda menggunakan > saat menentukan kondisi di UI Edge, > akan dikonversi menjadi &gt;.
>= atau &gt;= GreaterThanOrEquals Lebih besar dari atau sama dengan. Jika Anda menggunakan >= saat menentukan kondisi di UI Edge, kondisi tersebut akan dikonversi menjadi &gt;=.
&lt; LesserThan Lebih kecil dari. UI Edge tidak mendukung < literal.
&lt;= LesserThanOrEquals Lebih kecil dari atau sama dengan. UI Edge tidak mendukung <=.
&& And, and Dan
|| Or Operator Or tidak peka huruf besar/kecil. Misalnya, OR, Or, dan or semuanya valid.
() Mengelompokkan ekspresi. ( membuka ekspresi dan ) menutupnya.
~~ JavaRegex

Mencocokkan ekspresi reguler yang sesuai dengan javax.util.regex. Pencocokan peka huruf besar/kecil. Untuk contoh, lihat Pencocokan pola dalam pernyataan bersyarat.

~ Matches, Like Mencocokkan pola gaya glob menggunakan karakter pengganti "*". Pencocokan peka huruf besar/kecil. Untuk contoh, lihat Pencocokan pola dengan kondisional.
~/ MatchesPath, LikePath Mencocokkan ekspresi jalur. Pencocokan peka huruf besar/kecil. Untuk contoh, lihat Pencocokan pola dengan kondisional.
=| StartsWith Mencocokkan karakter pertama dari string. Pencocokan peka huruf besar/kecil.

Operand

Apigee Edge menyesuaikan operand ke jenis data umum sebelum membandingkannya. Misalnya, jika kode status respons adalah 404, ekspresi response.status.code = "400" dan response.status.code = 400 setara.

Untuk operand numerik, jenis data ditafsirkan sebagai bilangan bulat kecuali jika nilai diakhiri sebagai berikut:

  • "f" atau "F" (float, misalnya, 3.142f, 91.1F)
  • "d" atau "D" (ganda, misalnya, 3.142d, 100.123D)
  • "l" atau "L" (panjang, misalnya, 12321421312L)

Dalam kasus ini, sistem melakukan adaptasi yang ditunjukkan dalam tabel berikut (dengan RHS mengacu pada sisi kanan persamaan dan LHS adalah sisi kiri):

RHS LHS Boolean Bilangan bulat Panjang Float Ganda String Sebanding Objek
Boolean Boolean Bilangan bulat Panjang Float Ganda String -
Bilangan bulat Bilangan bulat Bilangan bulat Panjang Float Ganda String Sebanding -
Panjang Panjang Panjang Panjang Float Ganda String Sebanding -
Float Float Float Float Float Ganda String Sebanding -
Ganda Ganda Ganda Ganda Ganda Ganda String Sebanding -
String String String String String String String Sebanding -
Sebanding Sebanding Sebanding Sebanding Sebanding Sebanding Sebanding Sebanding -
Objek - - - - - - - -

Operand null

Tabel berikut menunjukkan apakah kondisi dievaluasi ke true atau false jika nilai null di sisi kiri (LHS) dan/atau sisi kanan (RHS) operan yang ditampilkan:

Operator Null LHS Null RHS LHS dan RHS null
=, ==, := false false true
=| false false false
!= true true false
> atau &gt; true false false
>= atau &gt;= false true true
&lt; true false false
&lt;= true false true
~ false T/A false
~~ false T/A false
!~ true false false
~/ false T/A false

Literal

Selain literal string dan numerik, Anda dapat menggunakan literal berikut dalam pernyataan kondisional:

  • null
  • true
  • false

Contoh:

  • request.header.host is null
  • flow.cachehit is true

Contoh

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