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 dievaluasi ke true
atau false
.
Ringkasan ketentuan
Bagian ini menjelaskan cara dan tempat penggunaan pernyataan kondisional dengan Edge. 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 alur bernama di ProxyEndpoint dan TargetEndpoints. Perhatikan bahwa hanya 'bernama' dapat dieksekusi secara bersyarat. {i>Preflows<i} dan postflows (baik permintaan maupun respons) di ProxyEndpoints dan TargetEndpoints untuk setiap transaksi, dan dengan demikian memberikan 'failsafe' tanpa syarat kemampuan IT.
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, dengan 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:
- Referensi variabel flow: 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 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 Edge 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 | 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, tetapi tidak peka huruf besar/kecil |
> atau > |
GreaterThan |
Lebih dari. Jika Anda menggunakan > saat menentukan kondisi di UI Edge, dikonversi menjadi >. |
>= atau >= |
GreaterThanOrEquals |
Lebih dari atau sama dengan. Jika Anda menggunakan >= saat menentukan kondisi di UI Edge, itu dikonversi menjadi >=. |
< |
LesserThan |
Lebih kecil 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. ( membuka ekspresi dan ) menutup
anotasi. |
|
~~ |
JavaRegex |
Mencocokkan ekspresi reguler yang sesuai dengan |
~ |
Matches , Like |
Mencocokkan pola gaya glob menggunakan "*" karakter pengganti. Hasil yang cocok adalah peka huruf besar/kecil. Misalnya, lihat Pencocokan pola dengan kondisional. |
~/ |
MatchesPath , LikePath |
Mencocokkan ekspresi jalur. Pencocokan peka huruf besar/kecil. Misalnya, lihat Pencocokan pola dengan kondisional. |
=| |
StartsWith |
Mencocokkan karakter pertama dari sebuah string. Pencocokan peka huruf besar/kecil. |
Operand
Apigee Edge 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)
- "h" 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 (di mana RHS mengacu dari ruas kanan persamaan dan LHS adalah ruas kiri):
LHS RHS | 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 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 {i>null<i} |
---|---|---|---|
= , == , := |
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 {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>