Anda sedang melihat dokumentasi Apigee Edge.
Buka dokumentasi Apigee X. info
Pernyataan bersyarat adalah struktur kontrol yang umum di semua bahasa pemrograman. Seperti bahasa pemrograman, konfigurasi proxy API mendukung pernyataan bersyarat untuk Flow, Kebijakan, Langkah, dan RouteRule. Dengan menentukan pernyataan bersyarat, Anda menentukan perilaku dinamis untuk API Anda. Perilaku dinamis ini memungkinkan Anda melakukan hal-hal seperti mengonversi XML menjadi JSON hanya untuk perangkat seluler, atau merutekan ke URL backend berdasarkan jenis konten atau kata kerja HTTP dari pesan permintaan.
Topik ini menunjukkan cara menggunakan kondisi untuk menerapkan fitur pengelolaan API secara dinamis saat runtime, tanpa menulis kode apa pun.
Mengonfigurasi pernyataan bersyarat
Perilaku bersyarat diterapkan di proxy API menggunakan kombinasi kondisi dan variabel. Pernyataan bersyarat dibuat menggunakan elemen Condition. Berikut adalah kondisi kosong:
<Condition></Condition>
Untuk membuat pernyataan bersyarat, tambahkan operator bersyarat dan variabel untuk membuat struktur berikut:
<Condition>{variable.name}{operator}{"value"}</Condition>
Operator bersyarat yang didukung mencakup = (sama dengan), != (tidak sama dengan),
dan > (lebih besar dari). Agar lebih mudah dibaca, Anda juga dapat menulis kondisional sebagai
teks: equals, notequals, greaterthan.
Saat menggunakan jalur URI, Anda dapat menggunakan ~/ atau MatchesPath. Anda juga dapat mencocokkan ekspresi reguler JavaRegex dengan operator ~~.
Kondisi digunakan untuk menentukan alur bersyarat proxy API ke resource API backend, yang dijelaskan dalam Membuat alur bersyarat ke resource API backend. Untuk daftar lengkap kondisional, lihat Referensi kondisi.
Variabel
Kondisi berfungsi dengan mengevaluasi nilai variabel. Variabel adalah properti transaksi HTTP yang dijalankan oleh proxy API, atau properti konfigurasi proxy API itu sendiri. Setiap kali proxy API mendapatkan permintaan dari aplikasi, Apigee Edge mengisi daftar panjang variabel yang terkait dengan hal-hal seperti waktu sistem, informasi jaringan aplikasi, header HTTP pada pesan, konfigurasi proxy API, eksekusi kebijakan, dan sebagainya. Tindakan ini akan membuat konteks lengkap yang dapat Anda gunakan untuk menyiapkan pernyataan bersyarat.
Variabel selalu menggunakan notasi titik. Misalnya, header HTTP pada pesan permintaan tersedia sebagai variabel yang disebut request.header.{header_name}. Jadi, untuk mengevaluasi header Content-type, Anda dapat menggunakan variabel request.header.Content-type. Misalnya,
request.header.Content-type = "application/json" menunjukkan bahwa jenis
konten permintaan harus JSON.
Bayangkan Anda perlu membuat pernyataan bersyarat yang akan menyebabkan kebijakan
diterapkan hanya saat pesan permintaan adalah GET. Untuk membuat kondisi yang mengevaluasi kata kerja HTTP
permintaan, buat pernyataan bersyarat di bawah. Variabel dalam kondisi ini adalah
request.verb. Nilai variabelnya adalah GET. Operatornya adalah
=.
<Condition>request.verb = "GET"</Condition>
<Condition>request.verb equals "GET"</Condition>
Edge menggunakan pernyataan tersebut untuk mengevaluasi kondisi. Contoh di atas bernilai benar jika kata kerja HTTP yang terkait dengan permintaan adalah GET. Jika kata kerja HTTP yang terkait dengan permintaan adalah POST, pernyataan akan bernilai salah (false).
Untuk mengaktifkan perilaku dinamis, Anda dapat melampirkan Kondisi ke Alur, Langkah, dan RouteRules.
Saat Anda melampirkan kondisi ke Flow, Anda membuat 'Flow bersyarat'. Alur Bersyarat hanya dijalankan jika kondisi bernilai benar. Anda dapat melampirkan Kebijakan sebanyak yang Anda inginkan ke Alur bersyarat. Flow bersyarat memungkinkan Anda membuat aturan pemrosesan yang sangat khusus untuk pesan permintaan atau respons yang memenuhi kriteria tertentu.
Misalnya, untuk membuat Flow yang hanya dieksekusi saat kata kerja permintaan adalah GET:
<Flows> <Flow name="ExecuteForGETs"> <Condition>request.verb="GET"</Condition> </Flow> </Flows>
Untuk membuat satu Flow untuk GET dan Flow lainnya untuk POST:
<Flows> <Flow name="ExecuteForGETs"> <Condition>request.verb="GET"</Condition> </Flow> <Flow name="ExecuteForPOSTs"> <Condition>request.verb="POST"</Condition> </Flow> </Flows>
Seperti yang ditunjukkan dalam contoh di bawah, Anda dapat menerapkan kondisi ke Langkah Kebijakan itu sendiri. Kondisi berikut menyebabkan Kebijakan VerifyApiKey hanya diterapkan jika pesan permintaan adalah POST.
<PreFlow name="PreFlow">
<Request>
<Step>
<Condition>request.verb equals "POST"</Condition>
<Name>VerifyApiKey</Name>
</Step>
</Request>
</PreFlow>Setelah menentukan Alur bersyarat tersebut, Anda dapat melampirkan Kebijakan ke Alur tersebut, sehingga proxy API dapat menerapkan satu set kebijakan untuk permintaan GET, dan set kebijakan lainnya untuk permintaan POST.
Untuk informasi referensi yang komprehensif, lihat referensi berikut:
Contoh 1
Contoh berikut menunjukkan satu alur bersyarat bernama Convert-for-devices,
yang dikonfigurasi dalam alur respons ProxyEndpoint. Tambahkan Condition sebagai elemen ke entity yang menerapkan kondisi tersebut. Dalam contoh ini, kondisi adalah komponen flow.
Oleh karena itu, alur akan dieksekusi setiap kali pernyataan dievaluasi sebagai benar (true).
<Flows>
<Flow name="Convert-for-devices">
<Condition>(request.header.User-Agent = "Mozilla")</Condition>
<Response>
<Step><Name>ConvertToJSON</Name></Step>
</Response>
</Flow>
</Flows>Untuk setiap permintaan yang diterima dari aplikasi, Edge menyimpan nilai semua header HTTP yang ada sebagai
variabel. Jika permintaan berisi header HTTP bernama User-Agent, header tersebut dan nilainya akan disimpan sebagai variabel bernama request.header.User-Agent.
Dengan konfigurasi ProxyEndpoint di atas, Edge memeriksa nilai variabel request.header.User-Agent untuk melihat apakah kondisi bernilai benar.
Jika kondisi bernilai benar, yaitu nilai variabel
request.header.User-Agent sama dengan Mozilla, Flow kondisional
akan dieksekusi dan kebijakan XMLtoJSON yang disebut ConvertToJSON akan diterapkan. Jika tidak, Flow tidak akan dijalankan, dan respons XML akan ditampilkan tanpa diubah (dalam format XML) ke aplikasi yang meminta.
Contoh 2
Mari kita gunakan contoh spesifik saat Anda perlu mengubah pesan respons dari XML menjadi JSON—tetapi hanya untuk perangkat seluler. Pertama, buat kebijakan yang akan mengonversi respons berformat XML dari Weather API menjadi JSON:
<XMLToJSON name="ConvertToJSON"> <Options> </Options> <OutputVariable>response</OutputVariable> <Source>response</Source> </XMLToJSON>
Konfigurasi kebijakan di atas memberi tahu proxy API untuk mengambil pesan respons, melakukan konversi dari XML ke JSON dengan setelan default, lalu menulis hasilnya ke pesan respons baru. (Jika Anda mengonversi pesan permintaan dari XML ke JSON, cukup tetapkan kedua nilai ini ke request.)
Karena Anda ingin mengonversi respons dari XML ke JSON, Anda perlu mengonfigurasi Alur respons bersyarat untuk melakukan konversi. Misalnya, untuk mengonversi semua respons dari XML ke JSON sebelum ditampilkan ke aplikasi klien, konfigurasikan Flow respons ProxyEndpoint berikut.
<Flows>
<Flow name="Convert-for-devices">
<Response>
<Step><Name>ConvertToJSON</Name></Step>
</Response>
</Flow>
</Flows>Saat Anda memanggil API menggunakan permintaan standar, responsnya akan diformat dalam JSON.
Namun, tujuan Anda adalah hanya mengonversi Laporan cuaca menjadi JSON saat klien yang meminta adalah perangkat seluler. Untuk mengaktifkan perilaku dinamis tersebut, Anda harus menambahkan pernyataan bersyarat ke Flow.
Menguji alur kondisional
Dalam contoh permintaan ini, header User-Agent HTTP ditetapkan ke
Mozilla, sehingga pernyataan bersyarat bernilai benar dan alur
kondisional Convert-for-devices dijalankan.
$ curl -H "User-Agent:Mozilla" http://{org_name}-test.apigee.net/weather/forecastrss?w=12797282
atau, untuk pretty print jika Python tersedia:
$ curl -H "User-Agent:Mozilla" http://{org_name}-test.apigee.net/weather/forecastrss?w=12797282 | python -mjson.tool
Contoh Respons:
. . .
"yweather_forecast": [
{
"code": "11",
"date": "12 Dec 2012",
"day": "Wed",
"high": "55",
"low": "36",
"text": "Showers"
},
{
"code": "32",
"date": "13 Dec 2012",
"day": "Thu",
"high": "56",
"low": "38",
"text": "Sunny"
}
]
}
. . .Permintaan yang dikirim tanpa header User-Agent, atau dengan nilai yang berbeda dari
Mozilla, akan menghasilkan respons berformat XML.
$ curl http://{org_name}-test.apigee.net/weather/forecastrss?w=12797282
Respons XML yang tidak diubah akan ditampilkan.
Contoh Respons:
<yweather:forecast day="Wed" date="12 Dec 2012" low="36" high="55" text="Showers" code="11" /> <yweather:forecast day="Thu" date="13 Dec 2012" low="38" high="56" text="Sunny" code="32" />
Pencocokan pola
Bagian ini menjelaskan cara menggunakan pencocokan pola dengan kondisi dalam alur Apigee.
Operator
Bagian ini menjelaskan cara menggunakan operator pencocokan pola berikut dalam pernyataan kondisional:
- Operator kecocokan: Pencocokan pola sederhana
- Operator JavaRegex: Kontrol yang lebih mendetail atas pencocokan
- Operator MatchesPath: Pencocokan fragmen jalur
Kecocokan
Mari kita lihat operator bersyarat "Cocok" atau "~" terlebih dahulu. Kedua operator ini sama -- versi bahasa Inggris, "Matches", dianggap sebagai opsi yang lebih mudah dibaca.
Ringkasan: Operator "Cocok" memberi Anda dua kemungkinan. Cocokkan string secara literal, atau lakukan pencocokan karakter pengganti dengan "*". Seperti yang mungkin Anda duga, karakter pengganti cocok dengan nol atau beberapa karakter. Mari kita lihat cara kerjanya.
XML berikut menunjukkan kondisi langkah. Kebijakan ini menjalankan kebijakan SomePolicy saat kondisi
bernilai true. Dalam contoh ini, kita menguji variabel proxy.pathsuffix, variabel bawaan di Edge yang menyimpan akhiran jalur permintaan. Namun, perhatikan bahwa Anda dapat menguji
nilai flow variable apa pun yang berisi string. Jadi, dalam hal ini, jika jalur dasar permintaan masuk adalah /animals, dan permintaannya adalah /animals/cat, maka akhiran jalur adalah string literal "/cat".
<PreFlow name="PreFlow">
<Request>
<Step>
<Condition>(proxy.pathsuffix Matches "/cat")</Condition>
<Name>SomePolicy</Name>
</Step>
</Request>
<Response/>
</PreFlow>Pertanyaan: Akhiran jalur proxy apa yang akan menyebabkan SomePolicy dieksekusi? Hanya ada satu kemungkinan.
Panggilan API:
GET http://artomatic-test.apigee.net/matchtest/cat
Apakah kebijakan dijalankan? Ya, karena akhiran jalur proxy sama persis dengan "/cat". Aturan ini tidak akan dijalankan jika akhiran adalah /bat atau /dog atau
"/" atau apa pun.
Sekarang, pertimbangkan pernyataan bersyarat ini saat kita menggunakan karakter pengganti
"*":
<Condition>(proxy.pathsuffix Matches "/*at")</Condition>
Panggilan API:
GET http://artomatic-test.apigee.net/matchtest/cat
Apakah kebijakan dijalankan? Ya, karena karakter pengganti cocok dengan karakter apa pun, dan
"/cat" cocok.
Panggilan API:
GET http://artomatic-test.apigee.net/matchtest/bat
Apakah kebijakan dijalankan? Ya, karena karakter pengganti cocok dengan karakter apa pun, "/bat"
cocok.
Panggilan API:
GET http://artomatic-test.apigee.net/matchtest/owl
Apakah kebijakan dijalankan? Tentu saja tidak -- meskipun karakter pengganti cocok dengan "o",
huruf "wl" tidak cocok.
Sekarang, mari kita pindahkan karakter pengganti ke akhir akhiran:
<Condition>(proxy.pathsuffix Matches "/cat*")</Condition>
Panggilan API:
GET http://artomatic-test.apigee.net/matchtest/cat
Apakah kebijakan dijalankan? Ya, karena karakter pengganti cocok dengan nol atau beberapa karakter apa pun.
Panggilan API:
GET http://artomatic-test.apigee.net/matchtest/bat
Apakah kebijakan dijalankan? Tidak, "/bat" tidak cocok.
Panggilan API:
GET http://artomatic-test.apigee.net/matchtest/cat123
Apakah kebijakan dijalankan? Ya, karakter pengganti cocok dengan nol atau beberapa karakter apa pun, sehingga
"123" menghasilkan kecocokan.
Panggilan API:
GET http://artomatic-test.apigee.net/matchtest/cat/bird/mouse
Apakah kebijakan dijalankan? Ya, karena karakter pengganti cocok dengan nol atau beberapa karakter apa pun, sehingga
"/bird/mouse" menghasilkan kecocokan. Perhatikan bagaimana ekspresi seperti ini dapat menimbulkan masalah karena cocok dengan semua karakter setelah karakter literal.
Pertanyaan: Apakah operator Cocok peka huruf besar/kecil?
Ya. Asumsikan Anda memiliki kondisi seperti ini:
<Condition>(proxy.pathsuffix Matches "/*At")</Condition>
Panggilan API:
GET http://artomatic-test.apigee.net/matchtest/cat
Apakah kebijakan dijalankan? Tidak, karakter pengganti cocok dengan huruf apa pun (baik besar maupun kecil), tetapi huruf kecil "a" tidak cocok dengan "A".
Panggilan API:
GET http://artomatic-test.apigee.net/matchtest/bAt
Apakah kebijakan dijalankan? Ya, hurufnya cocok.
Pertanyaan: Bagaimana cara meng-escape karakter dengan operator Cocok?
Gunakan karakter persen "%" untuk meng-escape karakter khusus. Contoh:
<Condition>(proxy.pathsuffix Matches "/c%*at")</Condition>
Panggilan API:
GET http://artomatic-test.apigee.net/matchtest/cat
Apakah kebijakan dijalankan? Tidak, operator Cocok mencari string literal "c*at".
Panggilan API:
GET http://artomatic-test.apigee.net/matchtest/c*at
Pertanyaan:Apakah kebijakan dijalankan?
Ya, jalur ini, meskipun agak tidak biasa, cocok.
JavaRegex
Seperti yang Anda lihat, operator "Cocok" sangat cocok untuk situasi sederhana. Namun, Anda dapat menggunakan operator lain, yaitu operator "JavaRegex" atau "~~". Keduanya adalah operator yang sama, kecuali JavaRegex dianggap lebih mudah dibaca. Kebijakan ini disebut JavaRegex karena memungkinkan pencocokan pola ekspresi reguler, dan Edge mengikuti aturan yang sama dengan class dalam paket java.util.regex dalam bahasa Java. Cara kerja operator JavaRegex sangat berbeda dengan operator Matches, jadi penting untuk tidak salah membedakan keduanya.
Ringkasan: Operator "JavaRegex" memungkinkan Anda menggunakan sintaksis ekspresi reguler dalam pernyataan bersyarat.
Kode berikut menunjukkan kondisi Langkah. Kebijakan SomePolicy akan dijalankan jika kondisi bernilai true. Dalam contoh ini, kita menguji variabel proxy.pathsuffix, variabel bawaan di Edge yang menyimpan akhiran jalur permintaan. Jika jalur dasar permintaan masuk adalah /animals, dan permintaannya adalah /animals/cat, maka akhiran jalur adalah string literal "/cat".
<PreFlow name="PreFlow">
<Request>
<Step>
<Condition>(proxy.pathsuffix JavaRegex "/cat")</Condition>
<Name>SomePolicy</Name>
</Step>
</Request>
<Response/>
</PreFlow>Pertanyaan: Akhiran jalur proxy apa yang akan menyebabkan SomePolicy dieksekusi? Sama seperti operator Cocok, hanya ada satu kemungkinan dalam kasus ini.
Panggilan API:
GET http://artomatic-test.apigee.net/matchtest/cat
Apakah kebijakan dijalankan? Ya, karena akhiran jalur proxy sama persis dengan "/cat". Aturan ini tidak akan dijalankan jika akhiran adalah /bat atau /dog atau apa pun.
Sekarang, mari kita buat ekspresi reguler menggunakan pengukur "*". Kuantor ini cocok dengan nol atau lebih karakter sebelumnya.
<Condition>(proxy.pathsuffix JavaRegex "/c*t")</Condition>
Panggilan API:
GET http://artomatic-test.apigee.net/matchtest/cat
Apakah kebijakan dijalankan? Tidak! Kuantor "*" cocok dengan nol atau lebih karakter sebelumnya, yaitu "c".
Panggilan API:
GET http://artomatic-test.apigee.net/matchtest/ccccct
Apakah kebijakan dijalankan? Ya, karena karakter pengganti cocok dengan nol atau lebih karakter sebelumnya.
Selanjutnya, kita menggunakan penghitung "?", yang mencocokkan karakter sebelumnya satu kali, atau tidak sama sekali.
<Condition>(proxy.pathsuffix JavaRegex "/ca?t")</Condition>
Panggilan API:
GET http://artomatic-test.apigee.net/matchtest/cat
Apakah kebijakan dijalankan? Ya. Kuantor "?" cocok dengan nol atau satu kemunculan
karakter sebelumnya, yaitu "a".
Panggilan API:
GET http://artomatic-test.apigee.net/matchtest/ct
Apakah kebijakan dijalankan? Ya. Kuantor "?" cocok dengan satu atau
tidak ada karakter sebelumnya. Dalam hal ini, tidak ada karakter "a", sehingga
kondisi bernilai benar (true).
Panggilan API:
GET http://artomatic-test.apigee.net/matchtest/caat
Apakah kebijakan dijalankan? Tidak. Pengukur "?" cocok dengan satu karakter sebelumnya, yaitu "a".
Selanjutnya, kita menggunakan gaya ekspresi regex "[abc]" atau "pengelompokan". Karakter ini cocok dengan
karakter "a" atau "b" atau "c".
<Condition>(proxy.pathsuffix JavaRegex "/[cbr]at")</Condition>
Panggilan API:
GET http://artomatic-test.apigee.net/matchtest/cat
Apakah kebijakan dijalankan? Ya. Kita menggunakan ekspresi reguler di sini, dan
ekspresi "[cbr]" cocok dengan "c", "b", ATAU "r". Panggilan ini juga cocok:
GET http://artomatic-test.apigee.net/matchtest/bat
GET http://artomatic-test.apigee.net/matchtest/rat
Namun, ini bukan kecocokan:
GET http://artomatic-test.apigee.net/matchtest/mat
Pertanyaan: Apakah operator JavaRegex peka huruf besar/kecil?
Ya. Asumsikan Anda memiliki kondisi seperti ini:
<Condition>(proxy.pathsuffix JavaRegex "/ca?t")</Condition>
Panggilan API:
GET http://artomatic-test.apigee.net/matchtest/cat
Apakah kebijakan dijalankan? Ya, ekspresi reguler cocok dengan nol atau satu karakter sebelumnya, yaitu "a".
Panggilan API:
GET http://artomatic-test.apigee.net/matchtest/cAt
Pertanyaan: Apakah kebijakan dijalankan?
Tidak, karena huruf kapital "A" tidak cocok dengan huruf kecil "a".
MatchesPath
Operator MatchesPath juga dapat ditentukan seperti ini "~/". Operator ini terlihat sedikit mirip dengan
operator Matches (~) dan JavaRegex (~~). Namun, MatchesPath sepenuhnya berbeda.
Ingatlah bahwa operator ini melihat jalur sebagai serangkaian bagian. Oleh karena itu, jika jalurnya
adalah: /animals/cats/wild, Anda dapat menganggap jalur tersebut terdiri dari bagian
"/animals", "/cats", dan "/wild".
Operator MatchesPath memungkinkan Anda menggunakan dua notasi karakter pengganti: tanda bintang tunggal (*) dan
tanda bintang ganda (**). Tanda bintang tunggal cocok dengan satu elemen jalur. Tanda bintang ganda cocok dengan
satu atau banyak elemen jalur.
Mari perhatikan contoh berikut. Dalam contoh ini, kita menguji variabel proxy.pathsuffix,
variabel bawaan di Edge yang menyimpan akhiran jalur permintaan. Namun, perhatikan bahwa Anda dapat
menguji nilai flow variable apa pun yang berisi string.
<PreFlow name="PreFlow">
<Request>
<Step>
<Condition>(proxy.pathsuffix MatchesPath "/animals/*")</Condition>
<Name>SomePolicy</Name>
</Step>
</Request>
<Response/>
</PreFlow>Pertanyaan: Akhiran jalur proxy apa yang akan menyebabkan SomePolicy dieksekusi?
Panggilan API:
GET http://artomatic-test.apigee.net/matchtest/animals
Pertanyaan: Apakah kebijakan dijalankan?
Tidak, karena kondisi memerlukan elemen jalur lain setelah
"/animals", seperti yang ditentukan oleh "/*".
Panggilan API:
GET http://artomatic-test.apigee.net/matchtest/animals/
Apakah kebijakan dijalankan? Ya, jalur tersebut memiliki elemen jalur lain (bagian setelah
"/animals/"), tetapi kosong.
Panggilan API:
GET http://artomatic-test.apigee.net/matchtest/animals/cats
Apakah kebijakan dijalankan? Ya, karena jalur tersebut jelas memiliki elemen ("/cats")
yang muncul setelah "/animals"
Panggilan API:
GET http://artomatic-test.apigee.net/matchtest/animals/cats/wild
Pertanyaan: Apakah kebijakan dijalankan?
Tidak, karena tanda bintang tunggal hanya cocok dengan satu elemen jalur, dan
API ini memiliki lebih dari satu elemen setelah "/animals".
Sekarang, mari kita gunakan tanda bintang ganda:
<PreFlow name="PreFlow">
<Request>
<Step>
<Condition>(proxy.pathsuffix MatchesPath "/animals/**")</Condition>
<Name>SomePolicy</Name>
</Step>
</Request>
<Response/>
</PreFlow>Pertanyaan: Akhiran jalur proxy apa yang akan menyebabkan SomePolicy dieksekusi?
Panggilan API:
GET http://artomatic-test.apigee.net/matchtest/animals
Apakah kebijakan dijalankan? Tidak, karena kondisi memerlukan setidaknya satu elemen jalur berikut yang ditentukan oleh "/**".
Panggilan API:
GET http://artomatic-test.apigee.net/matchtest/animals/
Apakah kebijakan dijalankan?
Ya, jalur tersebut memiliki elemen jalur lain (bagian setelah
"/animals/"), tetapi kosong.
Panggilan API:
GET http://artomatic-test.apigee.net/matchtest/animals/cats
Apakah kebijakan dijalankan?
Ya, karena jalur memiliki setidaknya satu elemen yang muncul setelah
"/animals"
Panggilan API:
GET http://artomatic-test.apigee.net/matchtest/animals/cats/wild
Apakah kebijakan dijalankan?
Ya, karena jalur memiliki lebih dari satu elemen yang muncul setelah
"/animals"
Mencampur tanda bintang
Anda dapat menggunakan kombinasi tanda bintang tunggal (*) dan ganda (**) untuk lebih menyaring pencocokan jalur.
<PreFlow name="PreFlow">
<Request>
<Step>
<Condition>(proxy.pathsuffix MatchesPath "/animals/*/wild/**")</Condition>
<Name>SomePolicy</Name>
</Step>
</Request>
<Response/>
</PreFlow>Panggilan API:
Semua panggilan API ini akan menghasilkan kecocokan:
GET http://artomatic-test.apigee.net/matchtest/animals/cats/wild/
dan
GET http://artomatic-test.apigee.net/matchtest/animals/dogs/wild/austrailian
dan
GET
http://artomatic-test.apigee.net/matchtest/animals/birds/wild/american/finches
Resource API
Layanan RESTful adalah kumpulan resource API. Resource API adalah fragmen jalur URI yang mengidentifikasi beberapa entity yang dapat diakses developer dengan memanggil API Anda. Misalnya, jika layanan Anda menyediakan laporan cuaca dan prakiraan cuaca, layanan backend Anda dapat menentukan dua resource API:
- http://mygreatweatherforecast.com/reports
- http://mygreatweatherforecast.com/forecasts
Saat membuat proxy API (seperti yang ditunjukkan dalam Membangun proxy API pertama Anda), minimal Anda membuat URL dasar alias yang dipetakan ke layanan backend Anda. Contoh:
| URL dasar backend | URL proxy API baru/setara |
|---|---|
| http://mygreatweatherforecast.com | http://{your_org}-{environment}.apigee.net/mygreatweatherforecast |
Pada tahap ini, Anda dapat melakukan panggilan API ke backend menggunakan salah satu URL dasar. Namun, saat Anda menggunakan URL proxy API, semuanya mulai menjadi menarik.
Selain analisis API yang mulai dikumpulkan Edge saat Anda menggunakan proxy API, proxy juga memungkinkan Anda menentukan alur bersyarat yang dipetakan ke resource di backend Anda. Intinya, "Jika panggilan GET masuk ke resource /reports, Edge harus melakukan sesuatu".
Gambar berikut menunjukkan perbedaan perilaku antara dua URL yang pada akhirnya mengakses backend yang sama. Salah satunya adalah URL resource tanpa proxy, yang lainnya adalah proxy Edge API dengan alur bersyarat ke resource backend yang sama. Kami akan menjelaskan alur bersyarat secara lebih mendetail di bawah.

Cara proxy API dipetakan ke resource backend tertentu
Dengan URL proxy API yang dipetakan ke URL dasar layanan backend (saat Anda membuat proxy), Anda dapat menambahkan alur bersyarat ke resource tertentu, seperti resource /reports dan /forecasts yang disebutkan sebelumnya.
Misalnya, Anda ingin Edge "melakukan sesuatu" saat panggilan masuk ke resource /reports atau /forecasts. Pada tahap ini, Anda tidak memberi tahu Edge
apa yang harus dilakukan, hanya bahwa Edge harus memproses panggilan ke resource tersebut. Anda dapat melakukannya
dengan kondisi. Di proxy Edge API, Anda dapat membuat alur bersyarat untuk
/reports dan /forecasts. Untuk tujuan konseptual, XML proxy API berikut menunjukkan kemungkinan tampilan kondisi tersebut.
<Flows>
<Flow name="reports">
<Description/>
<Request/>
<Response/>
<Condition>(proxy.pathsuffix MatchesPath "/reports") and (request.verb = "GET")</Condition>
</Flow>
<Flow name="forecasts">
<Description/>
<Request/>
<Response/>
<Condition>(proxy.pathsuffix MatchesPath "/forecasts") and (request.verb = "GET")</Condition>
</Flow>
</Flows>Kondisi tersebut menyatakan, "Saat permintaan GET masuk dengan /reports dan
/forecasts di URL, Edge akan melakukan apa pun yang Anda (developer API) perintahkan,
melalui kebijakan yang Anda lampirkan ke flow tersebut.
Berikut adalah contoh cara memberi tahu Edge apa yang harus dilakukan saat suatu kondisi terpenuhi. Dalam XML proxy API berikut, saat permintaan GET dikirim ke https://yourorg-test.apigee.net/mygreatweatherforecast/reports, Edge menjalankan kebijakan "XML-to-JSON-1" dalam respons.
<Flows>
<Flow name="reports">
<Description/>
<Request/>
<Response>
<Step>
<Name>XML-to-JSON-1</Name>
</Step>
</Response>
<Condition>(proxy.pathsuffix MatchesPath "/reports") and (request.verb = "GET")</Condition>
</Flow>Selain flow kondisional opsional tersebut, setiap proxy API juga dilengkapi dengan dua flow default: <PreFlow> yang dijalankan sebelum flow kondisional, dan <PostFlow> yang dijalankan setelah flow kondisional. Alur ini berguna untuk
menjalankan kebijakan saat setiap panggilan dilakukan ke proxy API. Misalnya, jika Anda ingin
memverifikasi kunci API aplikasi dengan setiap panggilan, terlepas dari resource backend yang diakses, Anda
dapat menempatkan kebijakan Verifikasi Kunci API di <PreFlow>. Untuk mengetahui informasi selengkapnya tentang flow, lihat
Mengonfigurasi flow.
Membuat alur bersyarat ke resource backend
Menentukan alur bersyarat ke resource backend di proxy API sepenuhnya bersifat opsional. Namun, alur bersyarat tersebut memberi Anda kemampuan untuk menerapkan pengelolaan dan pemantauan yang mendetail.
Anda akan dapat:
- Menerapkan pengelolaan dengan cara yang mencerminkan semantik model API Anda
- Menerapkan kebijakan dan perilaku yang ditulis dalam skrip ke jalur resource (URI) individual
- Mengumpulkan metrik terperinci untuk Layanan Analytics
Misalnya, bayangkan Anda perlu menerapkan berbagai jenis logika ke resource backend /developers ke /apps.
Untuk melakukannya, tambahkan dua alur kondisional di proxy API Anda: /developers dan
/apps.
Di tampilan Develop pada panel Navigator editor proxy API, klik ikon + di samping default di Proxy Endpoints.
![]()
Di jendela "New Conditional Flow", Anda akan memasukkan konfigurasi kunci berikut:
- Nama alur: Developer
- Jenis Kondisi: Jalur
- Jalur: /developers

Kondisi akan dipicu (dan kebijakan akan dijalankan) jika panggilan dikirim ke proxy dengan /developers di akhir URI.
Sekarang, tambahkan alur bersyarat untuk /apps, dan asumsikan Anda ingin kondisi dipicu pada URI dan kata kerja POST dalam permintaan. Konfigurasi ini melibatkan penetapan hal berikut:
- Nama Alur: Aplikasi
- Jenis Kondisi: Jalur dan Kata Kerja
- Jalur: /apps
- Kata kerja: POST

Kondisi akan dipicu (dan kebijakan akan dijalankan) jika panggilan dikirim ke proxy dengan /apps di akhir URI dan kata kerja POST.
Di panel Navigator, Anda akan melihat alur baru untuk Apps dan Developers.

Pilih salah satu alur untuk melihat konfigurasi alur bersyarat dalam tampilan kode editor proxy API:
<Flow name="Apps"> <Description>Developer apps registered in Developer Services</Description> <Request/> <Response/> <Condition>(proxy.pathsuffix MatchesPath "/apps") and (request.verb = "POST")</Condition> </Flow>
Seperti yang Anda lihat, resource API hanyalah Alur bersyarat yang mengevaluasi jalur URI permintaan masuk. (Variabel proxy.pathsuffix mengidentifikasi URI permintaan yang mengikuti BasePath yang dikonfigurasi dalam konfigurasi ProxyEndpoint.)
Setiap resource API yang Anda tentukan diimplementasikan oleh Alur bersyarat di proxy API. (Lihat Mengonfigurasi alur.)
Setelah Anda men-deploy proxy API ke lingkungan pengujian, permintaan berikut:
http://{org_name}-test.apigee.net/{proxy_path}/appsakan menyebabkan kondisi dievaluasi sebagai benar, dan alur ini, beserta kebijakan terkait, akan dijalankan.
Contoh kondisi berikut menggunakan ekspresi reguler Java untuk mengenali panggilan yang dilakukan ke resource /apps dengan atau tanpa garis miring di akhir (/apps atau /apps/**):
<Condition>(proxy.pathsuffix JavaRegex "/apps(/?)") and (request.verb = "POST")</Condition>
Untuk mengetahui informasi selengkapnya tentang jenis kondisi ini, lihat Cara mencocokkan terlepas dari ... di Komunitas Apigee.
Membuat model URI hierarkis
Dalam beberapa kasus, Anda akan memiliki resource API hierarkis. Misalnya, Developer Services API menyediakan metode untuk mencantumkan semua aplikasi milik developer. Jalur URI-nya adalah:
/developers/{developer_email}/appsAnda mungkin memiliki resource yang menghasilkan ID unik untuk setiap entity dalam koleksi, yang terkadang dianotasikan sebagai berikut:
/genus/:id/species
Jalur ini berlaku sama untuk dua URI berikut:
/genus/18904/species /genus/17908/species
Untuk merepresentasikan struktur ini dalam resource API, Anda dapat menggunakan karakter pengganti. Contoh:
/developers/*/apps
/developers/*example.com/apps
/genus/*/species
akan me-resolve URI hierarkis ini sebagai resource API dengan tepat.
Dalam beberapa kasus, terutama untuk API yang sangat hierarkis, Anda mungkin hanya ingin me-resolve semua yang ada di bawah fragmen URI tertentu. Untuk melakukannya, gunakan karakter pengganti tanda bintang ganda dalam definisi resource Anda. Misalnya, jika Anda menentukan resource API berikut:/developers/**
Resource API tersebut akan me-resolve jalur URI berikut:
/developers/{developer_email}/apps
/developers/{developer_email}/keys
/developers/{developer_email}/apps/{app_id}/keysBerikut adalah tampilan kondisi alur kondisional dalam definisi proxy API:
<Condition>(proxy.pathsuffix MatchesPath "/developers/**") and (request.verb = "POST")</Condition>
Contoh lainnya
Kondisi yang dilampirkan ke RouteRule
<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>
Kondisi yang dilampirkan ke kebijakan
<Step> <!--the policy MaintenancePolicy only executes if the response status code is exactly 503--> <Condition>response.status.code = 503</Condition> <Name>MaintenancePolicy</Name> </Step>
Alur Bersyarat
<!-- this entire flow is executed only if the request verb is a GET--> <Flow name="GetRequests"> <Condition>request.verb="GET"</Condition> <Request> <Step> <!-- this policy only executes if request path includes a term like statues--> <Condition>request.path ~ "/statuses/**"</Condition> <Name>StatusesRequestPolicy</Name> </Step> </Request> <Response> <Step> <!-- this condition has multiple expressions. The policy executes if the response code status is exactly 503 or 400--> <Condition>(response.status.code = 503) or (response.status.code = 400)</Condition> <Name>MaintenancePolicy</Name> </Step> </Response> </Flow>
Contoh operator dalam kondisi
Berikut beberapa contoh operator yang digunakan untuk membuat kondisi:
request.header.content-type = "text/xml"request.header.content-length < 4096 && request.verb = "PUT"response.status.code = 404 || response.status.code = 500request.uri MatchesPath "/*/statuses/**"request.queryparam.q0 NotEquals 10
Contoh praktis: Mengabaikan "/" di akhir jalur
Developer Edge biasanya ingin menangani kedua akhiran jalur ini: "/cat" dan
"/cat/". Hal ini karena beberapa pengguna atau klien mungkin memanggil API Anda dengan garis miring
tambahan di akhir jalur, dan Anda harus dapat menanganinya dalam pernyataan
kondisional. Kasus penggunaan yang sama persis ini
telah dibahas di Komunitas Apigee.
Jika mau, Anda dapat melakukannya tanpa menggunakan Regex seperti ini:
<PreFlow name="PreFlow">
<Request>
<Step>
<Condition>((proxy.pathsuffix = "/cat") OR (proxy.pathsuffix = "/cat/")</Condition>
<Name>SomePolicy</Name>
</Step>
</Request>
<Response/>
</PreFlow>Ini adalah opsi yang bagus. Jelas dan mudah dibaca.
Namun, Anda dapat melakukan hal yang sama dengan Regex, seperti ini. Tanda kurung digunakan untuk mengelompokkan bagian regex dari pernyataan, tetapi tidak wajib.
<Condition>(proxy.pathsuffix JavaRegex "/cat(/?)"</Condition>
Panggilan API:
GET http://artomatic-test.apigee.net/matchtest/cat
or
GET http://artomatic-test.apigee.net/matchtest/cat/
Apakah kebijakan dijalankan? Ya. Perhatikan bahwa dalam ekspresi reguler, karakter "?"
berarti: cocok dengan nol atau salah satu karakter sebelumnya. Oleh karena itu,
"/cat" dan "/cat/" cocok.
Panggilan API:
GET http://artomatic-test.apigee.net/matchtest/cat/spotted
Apakah kebijakan dijalankan? Tidak. Ekspresi reguler cocok dengan nol atau hanya satu kemunculan karakter sebelumnya, dan tidak ada karakter lain yang diizinkan.
Mencocokkan string arbitrer dengan JavaRegex
Dalam semua contoh di topik ini, kami menunjukkan cara mencocokkan salah satu flow variable bawaan: proxy.pathsuffix. Perlu diketahui bahwa Anda dapat melakukan pencocokan pola pada string atau variabel flow arbitrer, baik itu variabel flow bawaan seperti proxy.pathsuffix atau bukan.
Misalnya, jika Anda memiliki kondisi yang menguji string arbitrer, mungkin string yang ditampilkan dalam payload backend, atau string yang ditampilkan dari pencarian server autentikasi, Anda dapat menggunakan operator pencocokan untuk mengujinya. Jika Anda menggunakan JavaRegex, ekspresi reguler akan dibandingkan dengan seluruh string subjek. Jika subjeknya adalah "abc" dan ekspresi regulernya adalah "[a-z]", tidak ada kecocokan, karena "[a-z]" sama persis dengan satu karakter alfa. Ekspresi "[a-z]+" berfungsi, begitu juga "[a-z]*", dan "[a-z]{3}.
Mari kita lihat contoh konkretnya. Misalnya, server autentikasi menampilkan daftar peran sebagai string yang dipisahkan koma: "editor, author, guest".
Untuk menguji keberadaan peran editor, konstruksi ini tidak akan berfungsi, karena "editor" hanya merupakan bagian dari seluruh string.
<Condition>returned_roles ~~ "editor"</Condition>
Namun, konstruksi ini akan berfungsi:
<Condition>returned_roles ~~ ".*\beditor\b.*")</Condition>
Cara ini berhasil karena memperhitungkan pemisah kata dan bagian string lainnya dengan awalan dan akhiran .*.
Dalam contoh ini, Anda juga dapat menguji "editor" dengan operator Matches:
<Condition>returned_roles ~~ "*editor*")</Condition>
Namun, jika Anda memerlukan presisi yang lebih tinggi, JavaRegex sering kali menjadi pilihan yang lebih baik.
Meng-escape tanda petik ganda dalam ekspresi JavaRegex
Sintaksis Condition mengharuskan ekspresi JavaRegex digabungkan dalam tanda kutip ganda; oleh karena itu, jika Anda memiliki ekspresi Regex yang menyertakan tanda kutip ganda, Anda memerlukan cara alternatif untuk mencocokkannya. Jawabannya adalah Unicode. Misalnya, Anda meneruskan header yang menyertakan tanda petik ganda, seperti berikut:-H 'content-type:multipart/related; type="application/xop+xml"'
request.header.Content-Type ~~ "(multipart\/related)(; *type="application\/xop\+xml\")"
\u0022. Misalnya,
ekspresi berikut valid dan memberikan hasil yang diharapkan:
request.header.Content-Type ~~ "(multipart\/related)(; *type=\u0022application\/xop\+xml\u0022)"