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 bersyarat
adalah boolean dan selalu bernilai 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 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 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 kondisional, Anda dapat mengontrol penerapan kebijakan. Kasus penggunaan yang umum adalah transformasi bersyarat pada pesan respons, yang didasarkan pada header HTTP atau konten pesan.
Contoh berikut mengubah XML secara bersyarat 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 di ProxyEndpoints dan TargetEndpoints. Perhatikan bahwa hanya alur 'bernama' yang dapat dijalankan secara bersyarat. Alur awal dan alur pasca (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 pesan permintaan, dan alur respons bersyarat berdasarkan kode status HTTP (potensi) yang mewakili 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 ada lebih dari satu endpoint target yang 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 mengetahui informasi selengkapnya.
Ekspresi jalur
Ekspresi jalur digunakan untuk jalur URI yang cocok, 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 dengan
user
.
Variabel
Anda dapat menggunakan variabel alur bawaan dan variabel kustom dalam pernyataan bersyarat. Untuk informasi selengkapnya, lihat:
- Referensi variabel flow: Daftar lengkap variabel built-in
- Kebijakan ExtractVariables: Petunjuk tentang cara menetapkan variabel kustom
Operator
Saat menggunakan operator, amati 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 dalam tanda kutip tunggal.
Misalnya,
'request.header.help!me'
. - Operator aritmatika (
+ * - / %
) tidak didukung. - Prioritas Java digunakan untuk operator.
- Apigee Edge 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 Edge, kondisi tersebut akan dikonversi menjadi >. |
>= atau >= |
GreaterThanOrEquals |
Lebih dari atau sama dengan. Jika Anda menggunakan >= saat menentukan kondisi di UI Edge, kondisi tersebut akan dikonversi menjadi >=. |
< |
LesserThan |
Kurang dari. UI Edge tidak mendukung literal <. |
<= |
LesserThanOrEquals |
Lebih kecil dari atau sama dengan. UI Edge 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 ) menutupnya. |
|
~~ |
JavaRegex |
Cocok dengan ekspresi reguler yang sesuai dengan |
~ |
Matches , Like |
Mencocokkan pola gaya glob menggunakan karakter pengganti "*". Pencocokan peka huruf besar/kecil. Untuk contoh, lihat Pencocokan pola dengan kondisional. |
~/ |
MatchesPath , LikePath |
Cocok dengan ekspresi jalur. Pencocokan peka huruf besar/kecil. Untuk contoh, lihat Pencocokan pola dengan kondisional. |
=| |
StartsWith |
Cocok dengan karakter pertama string. Pencocokan peka huruf besar/kecil. |
Operand
Apigee Edge mengadaptasi operand ke jenis data umum sebelum membandingkannya. Misalnya, jika
kode status respons adalah 404, ekspresi response.status.code = "400"
dan
response.status.code = 400
adalah setara.
Untuk operand numerik, jenis data ditafsirkan sebagai bilangan bulat kecuali jika nilainya dihentikan seperti 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 adalah sisi kanan persamaan dan LHS adalah sisi kiri):
LHS RHS | Boolean | Bilangan Bulat | Panjang | Mengambang | Double | String | Sebanding | Objek |
---|---|---|---|---|---|---|---|---|
Boolean | Boolean | Bilangan Bulat | Panjang | Mengambang | Double | String | - | |
Bilangan Bulat | Bilangan Bulat | Bilangan Bulat | Panjang | Mengambang | Double | String | Sebanding | - |
Panjang | Panjang | Panjang | Panjang | Mengambang | Double | String | Sebanding | - |
Mengambang | Mengambang | Mengambang | Mengambang | Mengambang | Double | String | Sebanding | - |
Double | Double | Double | Double | Double | Double | 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 bernilai true
atau
false
saat 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 | true |
=| |
false | false | false |
!= |
true | true | false |
> atau > |
true | false | false |
>= atau >= |
false | true | true |
< |
true | false | false |
<= |
true | false | true |
~ |
false | T/A | false |
~~ |
false | T/A | false |
!~ |
true | false | false |
~/ |
false | T/A | false |
Literal
Selain literal numerik dan string, 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>