Referensi kondisi

Halaman ini berlaku untuk Apigee dan Apigee hybrid.

Lihat Dokumentasi Apigee Edge.

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

Ringkasan ketentuan

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

Struktur pernyataan bersyarat

Struktur dasar pernyataan bersyarat adalah:

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

Contoh:

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

Anda dapat menggabungkan kondisi dengan AND untuk menerapkan lebih dari satu per satu. Misalnya, kondisi berikut bernilai true hanya jika URI permintaan cocok /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 berikut:

Eksekusi kebijakan

Dengan menggunakan pernyataan bersyarat, Anda dapat mengontrol penerapan kebijakan. Kasus penggunaan umum merupakan transformasi bersyarat dari pesan respons, yang didasarkan pada header HTTP atau isi pesan.

Contoh berikut mengubah XML ke JSON secara bersyarat berdasarkan Accept {i>header<i}:

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

Eksekusi flow

Dengan menggunakan pernyataan bersyarat, Anda dapat mengontrol eksekusi flow bernama di ProxyEndpoints dan TargetEndpoints. Perhatikan bahwa hanya alur bernama yang dapat dieksekusi secara bersyarat. {i>Preflows<i} dan postflow (permintaan dan respons) di ProxyEndpoints dan TargetEndpoints dijalankan untuk setiap transaksi, sehingga memberikan kemampuan failsafe tanpa syarat.

Misalnya, untuk mengeksekusi alur permintaan bersyarat berdasarkan kata kerja HTTP permintaan tersebut pesan, dan alur respons bersyarat berdasarkan kode status HTTP (potensial) yang mewakili {i>error<i}:

<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 endpoint proxy konfigurasi Anda. Aturan rute meneruskan permintaan ke endpoint target tertentu. Ketika lebih dari tersedia satu endpoint target, aturan rute dievaluasi untuk kondisinya dan, jika true, diteruskan ke titik akhir target yang disebutkan.

Misalnya, untuk merutekan pesan secara bersyarat ke endpoint target yang ditetapkan 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 flow dan kondisi untuk informasi selengkapnya.

Ekspresi jalur

Ekspresi jalur digunakan untuk mencocokkan jalur URI, menggunakan * untuk merepresentasikan elemen jalur tunggal dan ** untuk merepresentasikan beberapa level URI.

Contoh:

Pola Jalur URI contoh 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. Tujuan pola %{user%} cocok dengan {user}, tetapi tidak user.

Variabel

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

Operator

Saat menggunakan operator, amati pembatasan berikut:

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

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

Simbol Word 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, tetapi tidak peka huruf besar/kecil
> atau &gt; GreaterThan Lebih dari. Jika Anda menggunakan > saat menentukan kondisi di UI Apigee, dikonversi menjadi &gt;.
>= atau &gt;= GreaterThanOrEquals Lebih dari atau sama dengan. Jika Anda menggunakan >= saat menentukan kondisi di UI Apigee, itu dikonversi menjadi &gt;=.
&lt; LesserThan Lebih kecil dari. UI Apigee tidak mendukung literal <.
&lt;= LesserThanOrEquals Lebih kecil dari atau sama dengan. UI Apigee tidak mendukung literal <=.
&& And, and Dan
|| Or Operator Or tidak peka huruf besar/kecil. Misalnya, OR, Or, dan or semuanya valid.
() Mengelompokkan ekspresi. ( membuka ekspresi dan ) menutup anotasi.
~~ JavaRegex

Mencocokkan ekspresi reguler yang sesuai dengan javax.util.regex. Hasil yang cocok adalah peka huruf besar/kecil. Untuk contoh, lihat Pencocokan pola.

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

Operand

Apigee menyesuaikan operand dengan 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, tipe data diinterpretasikan sebagai integer kecuali jika nilai diakhiri sebagai berikut:

  • f atau F (float, misalnya, 3.142f, 91.1F)
  • d atau D (double, misalnya, 3.142d, 100.123D)
  • l atau L (long, misalnya, 12321421312L)

Dalam kasus ini, sistem melakukan adaptasi yang ditunjukkan dalam tabel berikut (di mana RHS mengacu dari ruas kanan persamaan dan LHS adalah ruas kiri):

LHS RHS Boolean Bilangan bulat Long Float Ganda String Comparable Objek
Boolean Boolean Bilangan bulat Long Float Ganda String -
Bilangan bulat Bilangan bulat Bilangan bulat Long Float Ganda String Comparable -
Long Long Long Long Float Ganda String Comparable -
Float Float Float Float Float Ganda String Comparable -
Ganda Ganda Ganda Ganda Ganda Ganda String Comparable -
String String String String String String String Comparable -
Comparable Comparable Comparable Comparable Comparable Comparable Comparable Comparable -
Objek - - - - - - - -

Operand null

Tabel berikut menunjukkan apakah kondisi bernilai true atau false saat nilai null di sisi kiri (LHS) dan/atau sisi kanan (RHS) dari operand yang ditampilkan:

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

Literal

Selain {i>string<i} dan literal numerik, Anda dapat menggunakan literal berikut dalam pernyataan bersyarat:

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