Halaman ini berlaku untuk Apigee dan Apigee Hybrid.
Baca 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
bersifat boolean dan selalu bernilai true
atau false
.
Ringkasan kondisi
Bagian ini menjelaskan cara dan tempat menggunakan pernyataan kondisional dengan Apigee. Selain itu, bagian berikut menjelaskan sintaksisnya:
Struktur pernyataan bersyarat
Struktur dasar dari 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 kondisi sekaligus. Misalnya, kondisi berikut bernilai true
hanya jika URI permintaan cocok
dengan /statuses
dan verb HTTP permintaan tersebut 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 yang umum adalah transformasi bersyarat dari pesan respons, yang didasarkan pada header HTTP atau isi pesan.
Contoh berikut secara bersyarat mengubah XML ke JSON berdasarkan header Accept
:
<Step> <Condition>request.header.accept = "application/json"</Condition> <Name>XMLToJSON</Name> </Step>
Eksekusi alur
Dengan menggunakan pernyataan kondisional, Anda dapat mengontrol eksekusi alur bernama dalam ProxyEndpoints
dan TargetEndpoints
. Perhatikan bahwa hanya flow bernama yang dapat dieksekusi secara bersyarat. Preflow dan
postflow (baik permintaan maupun respons) di ProxyEndpoints
dan TargetEndpoints
akan dijalankan untuk setiap
transaksi, sehingga memberikan kemampuan failsafe tanpa syarat.
Misalnya, untuk menjalankan alur permintaan kondisional berdasarkan kata kerja HTTP dari pesan permintaan, dan alur respons kondisional berdasarkan kode status HTTP (potensi) 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 kondisional, Anda dapat mengontrol endpoint target yang dipanggil oleh konfigurasi endpoint proxy. Aturan rute meneruskan permintaan ke endpoint target tertentu. Jika lebih dari satu endpoint target tersedia, aturan rute dievaluasi untuk kondisinya dan, jika benar, permintaan akan diteruskan ke endpoint target yang disebutkan.
Misalnya, untuk merutekan pesan secara kondisional 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 dan kondisi flow untuk informasi selengkapnya.
Ekspresi jalur
Ekspresi jalur digunakan untuk mencocokkan jalur URI, menggunakan *
untuk mewakili satu elemen jalur
dan **
untuk mewakili beberapa level 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
user
.
Variabel
Anda dapat menggunakan variabel alur bawaan dan variabel kustom dalam pernyataan bersyarat. Untuk informasi selengkapnya, lihat:
- Referensi variabel alur: Daftar lengkap variabel built-in
- Kebijakan ExtractVariables: Petunjuk tentang cara menetapkan variabel kustom
Operator
Saat menggunakan operator, amati pembatasan berikut:
- Operator tidak dapat digunakan sebagai nama variabel.
- Karakter spasi wajib diisi 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. - Prioritas Java digunakan untuk operator.
- Apigee mengandalkan ekspresi reguler seperti yang diimplementasikan di
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 dengan, tetapi tidak peka huruf besar/kecil |
> atau > |
GreaterThan |
Lebih dari. Jika Anda menggunakan > saat menentukan kondisi di UI Apigee, format akan dikonversi menjadi >. |
>= atau >= |
GreaterThanOrEquals |
Lebih dari atau sama dengan. Jika Anda menggunakan >= saat menentukan kondisi di UI Apigee, kondisi akan dikonversi menjadi >=. |
< |
LesserThan |
Kurang dari. UI Apigee tidak mendukung literal <. |
<= |
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. ( akan membuka ekspresi dan ) akan menutupnya. |
|
~~ |
JavaRegex |
Cocok dengan ekspresi reguler yang mematuhi |
~ |
Matches , Like |
Mencocokkan pola gaya glob menggunakan karakter pengganti * . Pencocokan
peka huruf besar/kecil. Untuk contoh, lihat
Pencocokan pola. |
~/ |
MatchesPath , LikePath |
Cocok dengan ekspresi jalur. Pencocokan peka huruf besar/kecil. Untuk contoh, lihat Pencocokan pola. |
=| |
StartsWith |
Cocok dengan karakter pertama dari sebuah string. Pencocokan peka huruf besar/kecil. |
Operand
Apigee 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
akan setara.
Untuk operand numerik, jenis data akan ditafsirkan sebagai bilangan bulat kecuali jika nilainya dihentikan seperti berikut:
f
atauF
(float
, misalnya,3.142f, 91.1F
)d
atauD
(double
, misalnya,3.142d, 100.123D
)l
atauL
(long
, misalnya,12321421312L
)
Dalam kasus ini, sistem melakukan adaptasi yang ditunjukkan dalam tabel berikut (dengan RHS mengacu ke sisi kanan persamaan dan LHS adalah sisi 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
jika nilainya null di sisi kiri (LHS) dan/atau sisi kanan (RHS)
operand yang ditampilkan:
Operator | LHS null | RHS null | LHS dan RHS null |
---|---|---|---|
= , == , := |
false | false | benar |
=| |
false | false | false |
!= |
benar | benar | false |
> atau > |
benar | false | false |
>= atau >= |
false | benar | benar |
< |
benar | false | false |
<= |
benar | false | benar |
~ |
false | T/A | false |
~~ |
false | T/A | false |
!~ |
benar | false | false |
~/ |
false | T/A | false |
Literal
Selain literal numerik dan string, 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>