Topik ini menjelaskan cara menggunakan parameter dan ekspresi kondisional dalam plug-in API Gateway.
1. Ikhtisar
Dalam plugin, Anda dapat mengambil parameter dari request, response, atau konteks sistem saat ini, lalu mengevaluasinya menggunakan ekspresi kondisional kustom. Topik ini menjelaskan cara mendefinisikan parameter dan menulis ekspresi kondisional.
2. Definisi Parameter
2.1 Metode definisi
Sebelum menggunakan ekspresi kondisional, Anda harus secara eksplisit mendefinisikan semua parameter yang diperlukan dalam bidang parameters. Contohnya:
---
parameters:
method: "Method"
appId: "System:CaAppId"
action: "Query:action"
userId: "Token:UserId"Bidang parameters berisi pasangan kunci-nilai bertipe string. kunci dan nilai didefinisikan sebagai berikut:
kunci: Nama variabel yang digunakan dalam ekspresi kondisional. Nama tersebut harus unik dan mengikuti format[a-zA-Z_][a-zA-Z0-9]+.nilai: Lokasi suatu parameter. Definisikan lokasi dalam format{lokasi}atau{lokasi}:{nama}. Contohnya:lokasi: Lokasi suatu parameter. Untuk informasi lebih lanjut, lihat bagian berikutnya.nama: Nama suatu parameter. Gunakan nama ini untuk menemukan parameter pada lokasi tertentu. Misalnya,Query:q1menunjukkan nilai pertama dari parameter bernama q1 dalam string kueri.
2.2 Lokasi parameter
Sebelum menggunakan ekspresi kondisional, Anda harus mendefinisikan parameter yang diperlukan dalam ekspresi tersebut. Tabel berikut menjelaskan parameter pada lokasi tertentu yang dapat digunakan oleh plug-in API Gateway.
Lokasi | Ruang lingkup | Deskripsi |
Metode | Permintaan | Metode permintaan HTTP, dalam huruf besar. Contoh:
|
Path | Permintaan | Path lengkap dari permintaan HTTP. Contoh:
|
StatusCode | Respons | Kode respons HTTP dalam respons backend. Contoh:
|
ErrorCode | Respons | Kode kesalahan dari respons kesalahan sistem di API Gateway. Untuk informasi lebih lanjut, lihat Kode kesalahan. |
Header | Permintaan atau respons | Gunakan Menunjukkan nilai pertama dari header HTTP |
Query | Permintaan | Gunakan |
Form | Permintaan | Gunakan |
Host | Permintaan | Gunakan |
Parameter | Permintaan | Gunakan |
BodyJsonField | Respons* | Gunakan |
Sistem | Permintaan atau respons | Gunakan |
Token | Permintaan atau respons | Saat autentikasi JWT digunakan, gunakan |
XFF | Permintaan | Gunakan format |
Catatan Penggunaan Lokasi Parameter
Plugin kontrol akses berbasis parameter, plugin pembentukan lalu lintas, dan plugin perutean backend berjalan selama fase permintaan. Plugin-plugin ini hanya mendukung parameter dari lokasi permintaan berikut:
Method,Path,Header,Query,Form,Parameter,System,Token, danXFF.Plugin pemetaan kode kesalahan berjalan selama fase respons. Plugin ini hanya mendukung parameter dari lokasi respons berikut:
StatusCode,ErrorCode,Header,BodyJsonField,System, danToken.Untuk lokasi
Method,Path,StatusCode,ErrorCode, danXFF, Anda hanya perlu menyediakan lokasi. Nama tidak diperlukan.Saat parameter pada lokasi
Headerdigunakan dalam plug-in selama fase permintaan, plug-in membaca header dari permintaan klien. Saat digunakan dalam plug-in selama fase respons, plug-in membaca header dari respons backend.Parameter pada lokasi
Parameterhanya digunakan dalam plug-in selama fase permintaan. Sistem mencari parameter dengan nama yang sama dalam definisi API menggunakannama parameter, bukannama parameter backend. Jika parameter tidak ada,nulldikembalikan.Parameter pada lokasi
Hosthanya didukung untuk ekstraksi parameter nama domain wildcard. Untuk informasi selengkapnya, lihat Gunakan nama domain kustom untuk memanggil API. Untuk mengambil host lengkap, gunakan parameter sistemSystem:CaDomain.Parameter
Pathmenentukan jalur permintaan lengkap. JikaPathberisi parameter, definisikan parameter tersebut dalam bagianParameter.Parameter pada lokasi
BodyJsonFieldsaat ini hanya didukung dalam plugin pemetaan kode kesalahan. Gunakan ekspresiJSONPathuntuk membaca nilai dari badan respons JSON. Untuk informasi selengkapnya, lihat Catatan penggunaan JSONPath.Token: Jika plugin autentikasi JWT dikonfigurasi, Anda dapat menggunakanToken:{ClaimName}untuk membaca nilai yang ditentukan dalam plug-in. Untuk informasi selengkapnya, lihat dokumentasi plug-in terkait.
2.3 Catatan penggunaan JSONPath
Anda dapat menggunakan ekspresi JSONPath pada lokasi BodyJsonField untuk mengekstraksi bidang JSON dari badan JSON respons backend. Fitur ini hanya didukung untuk plugin pemetaan kode kesalahan. Untuk informasi selengkapnya tentang JSONPath, lihat dokumentasi JSONPath.
Contoh: Gunakan
code:"BodyJsonField:$.result_code"untuk mengambil nilairesult_codedari badan respons berikut. Hasil yang diurai adalahcode:ok.
{ "result_code": "ok", "message": ... }2.4 Parameter sistem
Parameter | Parameter | Nilai valid atau contoh nilai |
CaClientIp | Alamat IP klien yang mengirim permintaan. | Contoh: |
CaDomain | Nama domain lengkap dari header Host permintaan. | Contoh:
|
CaAppId | ID aplikasi yang mengirim permintaan. | Contoh:
|
CaAppKey* | Kunci aplikasi yang mengirim permintaan. | Contoh:
|
CaRequestId | ID permintaan unik yang dihasilkan oleh API Gateway. | Contoh:
|
CaApiName | Nama API. | Contoh:
|
CaHttpSchema | Protokol yang digunakan untuk memanggil API. | Nilai valid: |
CaClientUa | Header User-Agent klien. | Lewati nilai yang diunggah oleh klien. |
CaCloudMarketInstanceId | ID hubungan pembelian di Alibaba Cloud Marketplace. | Alibaba Cloud Marketplace |
CaMarketExpriencePlan | Menentukan apakah paket uji coba Alibaba Cloud Marketplace diaktifkan. | Diaktifkan: Tidak diaktifkan: |
3. Ekspresi kondisional
Anda dapat menggunakan ekspresi kondisional dalam plug-in dan skenario lain untuk melakukan evaluasi kondisional yang fleksibel.
3.1 Sintaksis
Ekspresi kondisional mirip dengan ekspresi SQL. Contohnya:
$A > 100 and $B = 'B'.Format dasar ekspresi adalah
{parameter} {operator} {parameter}. Contohnya, dalam$A > 100, parameter dapat berupavariabelataukonstanta.Variabeldiawali dengan$dan mereferensikan parameter yang didefinisikan dalam konteks. Misalnya, jika parameterq1:"Query:q1"didefinisikan dalamparameters, Anda dapat menggunakan variabel$q1dalam ekspresi. Nilai variabel ini adalah nilai parameter kueri bernamaq1dalam permintaan saat ini.Konstantadapat berupa tipestring,angka, atauBoolean, seperti"Hello",'foo',100,-1,0,1, atautrue. Untuk informasi selengkapnya, lihat Tipe parameter dan aturan penilaian.operatorberikut ini didukung:Operator
=dan==: sama dengan.<>dan!=: tidak sama dengan.>,>=,<, dan<=: perbandingan.likedan!like: pemeriksaan kemiripan. Karakter wildcard%di awal atau akhir string dapat digunakan untuk memeriksa kemiripan string. Contohnya:$Query like 'Prefix%'.in_cidrdan!in_cidr: memeriksa apakah alamat IP berada dalam blok CIDR tertentu. Contohnya:$ClientIp in_cidr '47.89.XX.XX/24'.Gunakan
nulluntuk memeriksa apakah parameter kosong. Contohnya:$A == nullatau$A != null.Gunakan
and,or, danxoruntuk menggabungkan ekspresi yang berbeda. Urutan evaluasi default adalah dari kanan ke kiri.Gunakan tanda kurung
(dan)untuk menentukan prioritas kondisi.Gunakan
!(dan)untuk melakukan operasi NOT pada ekspresi yang diapit. Contohnya, hasil dari!(1=1)adalahfalse.Sistem memiliki fungsi bawaan untuk evaluasi dalam skenario khusus.
Random(): Menghasilkan bilangan titik mengambang antara0 dan 1. Fungsi ini digunakan dalam skenario yang memerlukan keacakan, seperti penyebaran biru-hijau.Timestamp(): Mengembalikantimestamp Unixdalam milidetik.TimeOfDay(): Mengembalikan jumlah milidetik yang telah berlalu sejak tengah malam hari ini dalam zona waktuGMT.
3.2 Jenis nilai dan aturan penilaian
Jenis nilai berikut didukung dalam ekspresi:
STRING: Tipe string. Anda dapat menggunakan tanda kutip tunggal atau ganda. Contohnya:"Hello",'Hello'.NUMBER: Tipe bilangan bulat atau bilangan titik mengambang. Contohnya:1001,-1,0,1,-100,0.BOOLEAN: Tipe Boolean. Contohnya:true,false.
Untuk operator
sama dengan,tidak sama dengan, danperbandingan, aturan evaluasi untuk tipe yang berbeda adalah sebagai berikut:STRING: Menggunakan urutan string untuk evaluasi. Contohnya:Hasil dari
'123' > '1000'adalah true.Hasil dari
'A123' > 'A120'adalah true.Hasil dari
'' < 'a'adalah true.
NUMBER: Dievaluasi berdasarkan nilai numerik.Hasil dari
123 > 1000adalah false.Hasil dari
100.0 == 100adalah true.
BOOLEAN: Aturan evaluasi untuk nilai Boolean adalah bahwatruelebih besar darifalse.Hasil dari
true == trueadalah true.Hasil dari
false == falseadalah true.Hasil dari
true > falseadalah true.
Untuk operator
sama dengan,tidak sama dengan, danperbandingan, jika tipe parameter operan kiri dan kanan berbeda, aturan evaluasi berikut berlaku:STRING NUMBER: Jika operan kiri dapat dikonversi ke tipeNUMBER, nilai dibandingkan secara numerik. Jika tidak, dibandingkan sebagai string. Contohnya:Hasil dari
'100' = 100.0adalah benar.Hasil dari
'-100' > 0adalah false.
STRING BOOLEAN: Jika operan kiri dapat dikonversi ke tipeBOOLEAN(sama dengantrueataufalsetanpa memperhatikan huruf besar/kecil), perbandingan didasarkan pada tipeBOOLEAN. Jika tidak, kecuali untuk perbandingan!=, hasil semua perbandingan lainnya adalahfalse. Contohnya:Hasil dari
'True' = trueadalah true.Hasil dari
'False' = falseadalah true.Hasil dari
'bad' = falseadalah false.Hasil dari
'bad' != falseadalah true. Untuk operan kiri yang bukantrueataufalse, hanya operator!=yang mengembalikantrue. Semua operator perbandingan lainnya mengembalikanfalse.Hasil dari
'bad' != trueadalah true.Hasil dari
'0' > falseadalah false.Hasil dari
'0' <= falseadalah false.
NUMBER BOOLEAN: Selalu mengembalikanfalse.
Nilai
nulldapat digunakan untuk memeriksa apakah suatu bidang kosong. Untuk operatorsama dengan,tidak sama dengan, danperbandingan, aturan evaluasi adalah sebagai berikut:Saat parameter
$Akosong, hasil dari$A == nulladalah true, dan hasil dari$A != nulladalah false.String kosong
''tidak sama dengannull. Hasil dari'' == nulladalahfalse, dan hasil dari'' == ''adalahtrue.Untuk operator
perbandingan, jika salah satu operan adalahnull, hasilnya adalahfalse.
Operator
likedan!likedapat digunakan untuk memeriksa awalan, akhiran, dan inklusi string. Aturan evaluasi adalah sebagai berikut:Ekspresi hanya mendukung konstanta
STRINGsebagai operan kanan. Contohnya:$Path like '/users/%'.Karakter
'%'dapat digunakan di awal atau akhir operan kanan untuk mendukung pemeriksaan awalan, akhiran, dan inklusi. Contohnya:Pemeriksaan awalan:
$Path like '/users/%',$Path !like '/admin/%'.Pemeriksaan akhiran:
$q1 like '%search',$q1 !like '%.do'.Pemeriksaan inklusi:
$ErrorCode like '%400%',$ErrorCode !like '%200%'.
Jika operan kiri bukan tipe
NUMBERatauBOOLEAN, akan dikonversi ke formatSTRINGsebelum evaluasi.Jika operan kiri adalah
null, hasilnya adalahfalse.
Ekspresi
in_cidrdan!in_cidrdapat digunakan untuk memeriksa apakah alamat IP berada dalam blok CIDR. Aturan evaluasi adalah sebagai berikut:Ekspresi hanya mendukung konstanta
STRINGdalam format CIDR IPv4 atau IPv6 sebagai operan kanan. Contohnya:$ClientIP in_cidr '10.0.0.0/8'$ClientIP !in_cidr '0:0:0:0:0:FFFF::/96'
Jika operan kiri bertipe
STRING, dievaluasi sebagai alamat IP.Jika operan kiri bertipe
NUMBERatauBOOLEAN, atau kosong, hasilnya adalahfalse.Parameter
System:CaClientIpmengembalikan alamat IP klien dan biasanya digunakan untuk jenis evaluasi ini.
4. Kasus penggunaan
Kemungkinan 5%:
Random() < 0.05Periksa apakah API yang diminta diterbitkan ke lingkungan pengujian.
parameters:
stage: "System:CaStage"$CaStage = 'TEST'Parameter kustom UserName adalah Admin dan alamat IP sumber berada dalam blok CIDR
47.47.XX.XX/24.
parameters:
UserName: "Token:UserName"
ClientIp: "System:CaClientIp"$UserName = 'Admin' and $CaClientIp in_cidr '47.47.XX.XX/24'ID pengguna dari permintaan saat ini adalah 1001, 1098, atau 2011, dan permintaan menggunakan protokol HTTPS.
parameters:
CaAppId: "System:CaAppId"
HttpSchema: "System:CaHttpSchema"$CaHttpScheme = 'HTTPS' and ($CaAppId = 1001 or $CaAppId = 1098 or $CaAppId = 2011)`StatusCode respons adalah 200, dan badan
JSONberisiresult_codeyang bukanok.
parameters:
StatusCode: "StatusCode"
ResultCode: "BodyJsonField:$.result_code"$StatusCode = 200 and ($ResultCode <> null and $ResultCode <> 'ok')5. Batasan
Sebuah plug-in tunggal dapat memiliki maksimal 16 definisi parameter.
Sebuah ekspresi tunggal tidak boleh melebihi 512 karakter.
Ukuran badan permintaan atau respons untuk BodyJsonField tidak boleh melebihi 16 KB. Jika batas dilampaui, pengaturan tidak berlaku.