Halaman ini berlaku untuk Apigee dan Apigee hybrid.
Lihat Dokumentasi Apigee Edge.
Banyak kondisi error dapat muncul saat proxy API melayani permintaan dari aplikasi. Sebagai contoh, proxy API mungkin mengalami masalah jaringan saat berkomunikasi dengan layanan backend, aplikasi mungkin menunjukkan kredensial yang sudah tidak berlaku, pesan permintaan mungkin tidak diformat dengan benar, kueri.
Ketika kesalahan terjadi setelah aplikasi klien memanggil proxy API, pesan kesalahan akan dikembalikan ke klien. Secara {i>default<i}, klien sering menerima pesan {i>error<i} yang samar tanpa detail atau panduan. Tetapi jika Anda ingin mengganti pesan {i>error<i} {i>default<i} dengan pesan khusus yang lebih berguna, dan bahkan memperkayanya dengan hal-hal seperti header HTTP tambahan, Anda perlu menyiapkan kesalahan ditangani di Apigee.
Penanganan kesalahan kustom juga memungkinkan Anda menambahkan fungsionalitas seperti logging pesan setiap kali terjadi kesalahan.
Sebelum kita membahas tentang penerapan penanganan error kustom di proxy API Anda, sebaiknya memahami bagaimana error terjadi dan bagaimana proxy API bereaksi terhadapnya.
Video
Tonton video berikut untuk mempelajari lebih lanjut penanganan kesalahan.
Video | Deskripsi |
---|---|
Pengantar penanganan kesalahan dan alur error | Pelajari penanganan fault dan hal yang terjadi saat terjadi error di proxy API. |
Menangani kesalahan menggunakan aturan kesalahan | Pelajari cara menangani kesalahan menggunakan aturan kesalahan. |
Ajukan kustom kesalahan menggunakan kebijakan RaiseFault | Menampilkan kesalahan kustom selama runtime API menggunakan kebijakan RaiseFault. |
Menentukan kesalahan aturan di proxy API dan endpoint target | Menentukan aturan kesalahan di proxy API dan endpoint target serta memahami perbedaan tersebut. |
Memahami urutan eksekusi aturan fault | Memahami urutan eksekusi aturan kesalahan di proxy dan target API endpoint. |
Tentukan default aturan fault | Tentukan aturan kesalahan default untuk menangani error generik di API Anda. |
Bagaimana kesalahan terjadi
Pertama-tama, kita akan membahas bagaimana error terjadi. Mengetahui bagaimana kesalahan terjadi membantu Anda merencanakan untuk berbagai situasi di mana Anda ingin menerapkan penanganan error kustom.
Error otomatis
Proxy API menampilkan error secara otomatis dalam situasi berikut:
- Kebijakan akan menampilkan error. Misalnya, jika panggilan API mengirimkan kunci yang sudah tidak berlaku, Kebijakan VerifyAPIKey otomatis menampilkan error; atau jika jumlah panggilan API melampaui batas tertentu, Kebijakan kuota atau kebijakan SpikeArrest akan menampilkan error. (Lihat Referensi error kebijakan untuk mengetahui jenis kebijakan error yang dapat ditampilkan).
- Ada masalah dalam alur pesan proxy API, misalnya error pemilihan rute.
- Terjadi kegagalan backend, seperti error HTTP karena kegagalan tingkat protokol, TLS/SSL error, atau layanan target tidak tersedia.
- Terjadi kegagalan tingkat sistem, misalnya pengecualian kehabisan memori.
Untuk mengetahui informasi selengkapnya tentang error ini, lihat Taksonomi error dalam topik ini.
Error kustom
Jika tidak ada error otomatis, Anda mungkin perlu menampilkan error kustom; untuk
misalnya, jika respons berisi kata unavailable
, atau jika kode status HTTP lebih
dari 201
. Lakukan ini dengan menambahkan kebijakan RaiseFault ke
di tempat yang sesuai dalam alur proxy API.
Anda dapat menambahkan kebijakan RaiseFault ke alur proxy API dengan cara yang sama seperti yang Anda lakukan pada kebijakan lainnya. Di beberapa
contoh konfigurasi proxy berikut, kebijakan Raise-Fault-1
terpasang pada
respons TargetEndpoint. Jika kata unavailable
ada dalam respons dari target
layanan, kebijakan RaiseFault dijalankan dan menampilkan pesan {i>error<i}.
<TargetEndpoint name="default"> ... <Response> <Step> <Name>Raise-Fault-1</Name> <Condition>message.content Like "*unavailable*"</Condition> </Step> </Response>
Hal ini hanya untuk menunjukkan bahwa Anda dapat menampilkan error kustom. Kita akan membahas Kebijakan RaiseFault dalam kebijakan FaultRules vs. the RaiseFault bagian.
Untuk mengetahui contoh lainnya, lihat postingan Komunitas Apigee ini:
Tindakan proxy API saat terjadi error
Inilah yang terjadi ketika {i>proxy<i} menampilkan {i>error<i}.
Keluar dari pipeline proxy
Ketika proxy API mengalami error, bagaimanapun caranya terjadi, proxy akan keluar dari pipeline alur normal, memasuki status error, dan menampilkan pesan error ke aplikasi klien. Setelah proxy API memasukkan status error, maka tidak dapat mengembalikan pemrosesan kembali ke pipeline alur normal.
Misalnya, anggaplah proxy API memiliki kebijakan dalam urutan berikut di ProxyEndpoint permintaan:
- Memverifikasi Kunci API
- Kuota
- JSON ke XML
Jika terjadi error selama verifikasi kunci API, proxy API akan beralih ke status error. Tujuan Kebijakan kuota dan JSON ke XML tidak dijalankan, proxy tidak dilanjutkan ke TargetEndpoint, dan pesan {i>error<i} dikembalikan ke aplikasi klien.
Memeriksa FaultRules
Dalam status error, proxy API juga memeriksa keberadaan hal berikut (secara berurutan) di Konfigurasi proxy API sebelum menampilkan pesan error default ke aplikasi klien:
- Bagian
<FaultRules>
, yang berisi logika untuk memicu pesan error khusus (dan kebijakan lainnya) berdasarkan kondisi tertentu yang mendefinisikan. - Bagian
<DefaultFaultRule>
, yang memicu tindakan default dalam situasi berikut:- Tidak ada
<FaultRules>
yang ditentukan. - Tidak ada
<FaultRules>
yang dijalankan. - Elemen
<AlwaysEnforce>
disetel ke benar (true).
- Tidak ada
Intinya, proxy API memberi Anda kesempatan untuk menampilkan pesan kesalahan khusus dan memicu logika lainnya. Jika {i>proxy<i} menemukan tak satu pun dari bagian tersebut, atau bagian itu ada tetapi tidak ada khusus jika terjadi kesalahan, proxy mengirimkan pesan default yang dihasilkan Apigee sendiri.
Contoh penanganan fault yang sederhana
Mari kita mulai dengan contoh sederhana, saat panggilan ke proxy API tidak berisi API yang diperlukan tombol. Secara default, berikut adalah respons yang ditampilkan ke aplikasi klien:
HTTP/1.1 401 Unauthorized Date: Wed, 20 Jul 2016 19:19:32 GMT Content-Type: application/json Content-Length: 150 Connection: keep-alive Server: Apigee Router * Connection #0 to host myorg-test.apigee.net left intact {"fault":{"faultstring":"Failed to resolve API Key variable request.queryparam.apikey","detail":{"errorcode":"steps.oauth.v2.FailedToResolveAPIKey"}}}
Pengguna API Anda mungkin dapat mengetahui pesan error, tetapi mungkin tidak. Dan banyak yang default kesalahan terlihat halus dan lebih sulit untuk dipecahkan.
Sebagai pengembang API, terserah Anda untuk mengubah pesan ini untuk memenuhi kebutuhan siapa pun yang mau pada akhirnya menerima pesan error, baik itu developer aplikasi iOS atau pengujian internal yang memiliki persyaratan format pesan {i>error<i} sendiri.
Berikut adalah contoh dasar cara membuat pesan error kustom untuk menangani error ini. Ini memerlukan 1) kebijakan yang menentukan pesan kustom, dan 2) FaultRule yang menjalankan kebijakan saat proxy beralih ke status error.
1. Buat kebijakan yang menentukan pesan kustom
Pertama, buat kebijakan yang menentukan pesan error kustom. Anda dapat menggunakan semua jenis kebijakan, seperti kebijakan TetapkanMessage, yang dapat menetapkan payload dan header HTTP opsional seperti kode status dan frasa alasan. Kebijakan Menetapkan Pesan cocok untuk hal ini. Hal ini memungkinkan Anda untuk mengontrol {i>payload<i} pesan, mengatur kode status HTTP yang berbeda, menetapkan frasa alasan HTTP yang berbeda, dan menambahkan {i>header<i} HTTP.
Anda tidak perlu melampirkan kebijakan ke alur; Anda cukup membuatnya, seperti yang dijelaskan dalam Buat kebijakan.
Berikut adalah contoh kebijakan Menetapkan Pesan yang:
- Menampilkan pesan JSON.
- Menetapkan kode status HTTP (
911
, yang merupakan kode status yang jelas tidak ada hanya untuk menggambarkan fleksibilitas yang Anda miliki). Kode status muncul di header HTTP. - Menetapkan frasa alasan HTTP (untuk mengganti frasa alasan
Unauthorized
default untuk frasa ini kunci API tidak ada). Frasa alasan muncul di samping kode status di HTTP {i>header<i}. - Membuat dan mengisi header HTTP baru bernama
invalidKey
.
<AssignMessage async="false" continueOnError="false" enabled="true" name="invalid-key-message"> <DisplayName>Invalid key message</DisplayName> <Set> <Payload contentType="application/json">{"Citizen":"Where's your API key? I don't see it as a query parameter"}</Payload> <StatusCode>911</StatusCode> </Set> <Add> <Headers> <Header name="invalidKey">Invalid API key! Call the cops!</Header> </Headers> </Add> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
Jika kebijakan ini dijalankan, respons terhadap aplikasi klien akan terlihat seperti berikut. Bandingkan dengan respons {i>default<i} yang ditunjukkan sebelumnya.
HTTP/1.1 911 Rejected by API Key Emergency Services
Date: Wed, 20 Jul 2016 18:42:36 GMT
Content-Type: application/json
Content-Length: 35
Connection: keep-alive
invalidKey: Invalid API key! Call the cops!
Server: Apigee Router
* Connection #0 to host myorg-test.apigee.net left intact
{"Citizen":"Where's your API key? I don't see it as a query parameter."}
Ya, terdengar konyol, tetapi ini menunjukkan kepada Anda apa yang mungkin dilakukan. Setidaknya sekarang developer menerima pesan tersebut tahu bahwa mereka lupa menyertakan kunci API sebagai parameter kueri.
Namun, bagaimana cara kebijakan ini dijalankan? Bagian berikutnya akan menunjukkan kepada Anda.
2. Buat <FaultRule> yang akan memicu kebijakan
Di bagian <ProxyEndpoint>
atau <TargetEndpoint>
konfigurasi proxy, Anda akan menambahkan blok XML <FaultRules>
yang berisi satu
atau lebih bagian <FaultRule>
individual. Setiap FaultRule mewakili
yang ingin Anda tangani. Dalam contoh sederhana ini, kami hanya akan menggunakan
satu {i>FaultRule<i} untuk menunjukkan
yang menyusunnya.
Anda juga harus menambahkan <DefaultFaultRule>
untuk menampilkan error umum kustom
jika tidak ada FaultRules yang dijalankan.
Contoh
<ProxyEndpoint name="default"> ... <FaultRules> <FaultRule name="invalid_key_rule"> <Step> <Name>invalid-key-message</Name> </Step> <Condition>(fault.name = "FailedToResolveAPIKey")</Condition> </FaultRule> </FaultRules> <DefaultFaultRule name="default-fault"> <Step> <Name>Default-message</Name> </Step> </DefaultFaultRule>
Poin utama:
- FaultRules ditentukan di ProxyEndpoint. Ini penting. Selengkapnya tentang menempatkan FaultRules di ProxyEndpoint vs. TargetEndpoint nanti.
<Name>
: Nama kebijakan yang akan dieksekusi. Nama berasal dari atributname
kebijakan pada elemen induk, seperti yang ditunjukkan dalam contoh kebijakan sebelumnya.-
<Condition>
: Apigee mengevaluasi kondisi dan mengeksekusi kebijakan hanya jika kondisinya benar. Jika ada beberapa {i>FaultRules<i} yang bernilai true, Apigee menjalankan pernyataan pertama yang benar. (Penting: urutan evaluasi FaultRules, dari atas ke bawah atau dari bawah ke atas, berbeda antara TargetEndpoint dan ProxyEndpoint, seperti yang dijelaskan dalam FaultRules dan execution logic.) Jika Anda tidak menyertakan kondisi, FaultRule secara otomatis nilainya adalah benar (true). Tapi itu bukan praktik terbaik. Setiap FaultRule harus memiliki . -
<DefaultFaultRule>
: Jika tidak ada FaultRule kustom dieksekusi,<DefaultFaultRule>
akan dieksekusi, mengirimkan model pesan kustom, bukan pesan default samar yang dibuat oleh Apigee. J<DefaultFaultRule>
juga dapat memiliki<Condition>
, tetapi di dalam kebanyakan kasus, Anda tidak akan menyertakannya, karena Anda ingin perintah itu dijalankan, tidak peduli apa yang resor.DefaultFaultRule biasanya digunakan untuk menampilkan pesan error umum untuk dan terjadi error tak terduga. Contohnya adalah pesan yang berisi informasi kontak untuk dukungan teknis. Respons {i>default<i} ini memiliki tujuan ganda untuk memberikan informasi yang mudah diterapkan dan juga mengaburkan URL backend atau informasi lain yang dapat digunakan untuk menyusupi sistem.
Beberapa FaultRules dan logika eksekusi
Di bagian Contoh penanganan kesalahan sederhana, kami menggunakan contoh sederhana
dari satu FaultRule dan kondisi. Dalam project API dunia nyata, dengan semua kemungkinan error
yang mungkin terjadi, kemungkinan Anda memiliki beberapa FaultRules dan DefaultFaultRule
<ProxyEndpoint>
dan <TargetEndpoint>
. Pada akhirnya,
hanya satu FaultRule yang dijalankan ketika proxy API mengalami status error.
Bagian ini menjelaskan logika yang digunakan Apigee dalam menangani FaultRules, dari caranya diterima di
satu FaultRule yang akan dieksekusi ke cara penanganan kondisi Langkah dalam saat FaultRule
dipicu. Bagian ini juga memberikan panduan tentang kapan harus menentukan FaultRules dalam
<ProxyEndpoint>
vs. <TargetEndpoint>
, dan menjelaskan
hubungan antara FaultRules dan kebijakan RaiseFault.
Eksekusi FaultRules
Singkatnya, berikut adalah logika yang digunakan Apigee saat proxy API mengalami status error. Perlu diketahui bahwa ada sedikit perbedaan antara evaluasi FaultRules di ProxyEndpoint dan TargetEndpoint.
- Apigee mengevaluasi FaultRules di ProxyEndpoint atau TargetEndpoint, bergantung pada
tempat error terjadi:
- ProxyEndpoint - Apigee memulai dengan bagian bawah
<FaultRule>
dalam XML konfigurasi dan berjalan, mengevaluasi<Condition>
dari setiap<FaultRule>
(bagian luar kondisi, bukan kondisi<Step>
dalam). - TargetEndpoint - Apigee dimulai dari bagian teratas
<FaultRule>
dalam XML konfigurasi dan berfungsi menurun, mengevaluasi<Condition>
dari setiap<FaultRule>
(bagian luar kondisi, bukan kondisi<Step>
dalam).
- ProxyEndpoint - Apigee memulai dengan bagian bawah
- Mengeksekusi FaultRule pertama yang kondisinya benar. Jika FaultRule memiliki
tidak ada kondisi, nilainya benar
secara {i>default<i}.
- Ketika FaultRule dijalankan, semua Langkah di dalam FaultRule dievaluasi secara berurutan,
dari atas ke bawah dalam konfigurasi XML. Langkah tanpa kondisi akan dijalankan secara otomatis
(kebijakan dijalankan), dan Langkah-langkah yang memiliki
<Condition>
yang dieksekusi (kondisi yang mengevaluasi kecode
tidak dijalankan). -
Jika FaultRule dijalankan, tetapi tidak ada langkah dalam FaultRule yang dijalankan (karena kondisi dievaluasi ke
code
), pesan error default yang dihasilkan Apigee akan ditampilkan ke aplikasi klien.<DefaultFaultRule>
tidak dieksekusi, karena Apigee telah menjalankan satu FaultRule-nya.
- Ketika FaultRule dijalankan, semua Langkah di dalam FaultRule dievaluasi secara berurutan,
dari atas ke bawah dalam konfigurasi XML. Langkah tanpa kondisi akan dijalankan secara otomatis
(kebijakan dijalankan), dan Langkah-langkah yang memiliki
- Jika tidak ada FaultRule yang dijalankan, Apigee akan menjalankan
<DefaultFaultRule>
, jika saat ini.
Berikut adalah contoh dengan komentar inline.
Eksekusi ProxyEndpoint
Evaluasi ProxyEndpoint FaultRules dari bawah ke atas, jadi mulailah membaca dari bagian terakhir FaultRule dalam contoh berikut dan lanjutkan. Lihat terakhir DefaultFaultRule.
<ProxyEndpoint name="default"> ... <FaultRules> <!-- 3. This FaultRule is automatically TRUE, because there's no outer condition. But because the FaultRule just below this got executed (bottom-to-top evaluation in a ProxyEndpoint), Apigee doesn't even evaluate this FaultRule. Note that it's not a best practice to have a FaultRule without an outer condition, which automatically makes the FaultRule true. --> <FaultRule name="random-error-message"> <Step> <Name>Random-fault</Name> </Step> </FaultRule> <!-- 2. Let's say this fault is TRUE. The Quota policy threw a QuotaViolation error. This is the first FaultRule to be TRUE, so it's executed. Now the Steps are evaluated, and for the ones whose conditions evaluate to TRUE, their policies are executed. Steps without conditions are automatically true. --> <FaultRule name="over_quota"> <Step> <Name>developer-over-quota-fault</Name> <Condition>(ratelimit.developer-quota-policy.exceed.count GreaterThan "0")</Condition> </Step> <Step> <Name>global-over-quota-fault</Name> <Condition>(ratelimit.global-quota-policy.exceed.count GreaterThan "0")</Condition> </Step> <Step> <Name>log-error-message</Name> </Step> <Condition>(fault.name = "QuotaViolation")</Condition> </FaultRule> <!-- 1. Because this is the ProxyEndpoint, Apigee looks at this FaultRule first. But let's say this FaultRule is FALSE. A policy did not throw a FailedToResolveAPIKey error. Apigee moves UP to check the next FaultRule. --> <FaultRule name="invalid_key_rule"> <Step> <Name>invalid-key-message</Name> </Step> <Condition>(fault.name = "FailedToResolveAPIKey")</Condition> </FaultRule> </FaultRules> <!-- If no <FaultRule> is executed, the <DefaultFaultRule> is executed. If a FaultRule is executed, but none of its Steps are executed, The DefaultFaultRule is not executed (because Apigee has already executed its one FaultRule). --> <DefaultFaultRule name="default-fault"> <Step> <Name>Default-message</Name> </Step> </DefaultFaultRule>
Eksekusi TargetEndpoint
Evaluasi TargetEndpoint FaultRules dari atas ke bawah, jadi mulailah membaca FaultRule dalam contoh berikut dan lanjutkan. Lihat terakhir DefaultFaultRule.
<TargetEndpoint name="default"> ... <FaultRules> <!-- 1. Because this is the TargetEndpoint, Apigee looks at this FaultRule first. Let's say this FaultRule is FALSE. A policy did not throw a FailedToResolveAPIKey error. Apigee moves down to the next FaultRule. --> <FaultRule name="invalid_key_rule"> <Step> <Name>invalid-key-message</Name> </Step> <Condition>(fault.name = "FailedToResolveAPIKey")</Condition> </FaultRule> <!-- 2. Let's say this fault is TRUE. The Quota policy threw a QuotaViolation error. This is the first FaultRule to be TRUE, so it's executed. Now the Steps are evaluated, and for the ones whose conditions evaluate to TRUE, their policies are executed. Steps without conditions are automatically true. --> <FaultRule name="over_quota"> <Step> <Name>developer-over-quota-fault</Name> <Condition>(ratelimit.developer-quota-policy.exceed.count GreaterThan "0")</Condition> </Step> <Step> <Name>global-over-quota-fault</Name> <Condition>(ratelimit.global-quota-policy.exceed.count GreaterThan "0")</Condition> </Step> <Step> <Name>log-error-message</Name> </Step> <Condition>(fault.name = "QuotaViolation")</Condition> </FaultRule> <!-- 3. This FaultRule is automatically TRUE, because there's no outer condition. But because the FaultRule just above this got executed (top-to-bottom evaluation in a TargetEndpoint), Apigee doesn't even evaluate this FaultRule. Note that it's not a best practice to have a FaultRule without an outer condition, which automatically makes the FaultRule true. --> <FaultRule name="random-error-message"> <Step> <Name>Random-fault</Name> </Step> </FaultRule> </FaultRules> <!-- If no <FaultRule> is executed, the <DefaultFaultRule> is executed. If a FaultRule is executed, but none of its Steps are executed, The DefaultFaultRule is not executed (because Apigee has already executed its one FaultRule). --> <DefaultFaultRule name="default-fault"> <Step> <Name>Default-message</Name> </Step> </DefaultFaultRule>
Urutan aturan kesalahan
Seperti yang dapat Anda lihat pada contoh sebelumnya, urutan untuk memasukkan FaultRules adalah penting tergantung pada apakah kesalahan terjadi di {i>ProxyEndpoint<i} versus TargetEndpoint.
Contoh:
Urutan ProxyEndpoint | Urutan TargetEndpoint |
---|---|
Pada contoh berikut, karena evaluasi dari bawah ke atas, {i>FaultRule<i} 3 dieksekusi, yang berarti {i>FaultRules<i} 2 dan 1 tidak dievaluasi. 5. FaultRule 1: FALSE 4. FaultRule 2: BENAR 3. FaultAturan 3: BENAR 2. FaultRule 4: FALSE 1. FaultAturan 5: FALSE |
Pada contoh berikut, karena evaluasi dari atas ke bawah, {i>FaultRule<i} 2 dieksekusi, yang berarti FaultRules 3, 4, dan 5 tidak dievaluasi. 1. FaultRule 1: FALSE 2. FaultRule 2: BENAR 3. FaultAturan 3: BENAR 4. FaultRule 4: FALSE 5. FaultAturan 5: FALSE |
Kebijakan yang akan disertakan
Anda dapat menjalankan kebijakan apa pun dari FaultRule dengan menempatkannya dalam Langkah-Langkah. Sebagai contoh, Anda dapat jalankan kebijakan MenetapkanMessage untuk memformat respons ke aplikasi klien, lalu mencatat pesan ke dalam log dengan kebijakan MessageLogging. Kebijakan dijalankan sesuai urutan yang Anda masukkan (dari atas ke bawah dalam XML).
Aturan error HANYA dipicu dalam status error (tentang continueOnError)
Judulnya mungkin tampak seperti kita mengulang sendiri, tetapi ada satu hal yang perlu
diwaspadai sehubungan dengan error proxy yang menyebabkan proxy API memasuki status error—atau
tetapi, tidak memasukkan status error: atribut continueOnError
pada
lebih lanjut.
Sebagai ringkasan: Proxy API mengevaluasi <FaultRules>
dan
<DefaultFaultRule>
hanya jika proxy memasuki status error. Bahwa
berarti bahwa meskipun kondisi FaultRule bernilai benar (true), kondisi ini tidak akan terpicu jika proxy
tidak dalam status error.
Namun, berikut adalah contoh error yang terjadi dan proxy tidak memasuki status error. Aktif
kebijakan apa pun, Anda dapat menetapkan atribut pada elemen induk yang disebut continueOnError
.
Atribut tersebut sangat penting dalam hal penanganan fault, karena atribut ini menentukan apakah
{i>proxy<i} tidak memasuki status {i>error<i}
jika kebijakan tersebut gagal. Dalam kebanyakan kasus, Anda perlu mempertahankan
continueOnError="false"
default, yang menempatkan proxy dalam status error jika
kebijakan gagal, dan penanganan error kustom Anda akan dipicu. Namun, jika
continueOnError="true"
(misalnya, jika Anda tidak ingin terjadi kegagalan Service
Pemanggilan untuk menghentikan eksekusi proxy), proxy tidak akan memasuki status error jika tindakan tersebut
kebijakan gagal, dan proxy tidak akan melihat FaultRules Anda.
Untuk informasi tentang logging error saat continueOnError="true"
, lihat Menangani kesalahan kebijakan dalam alur saat ini.
Lokasi untuk menentukan FaultRules: ProxyEndpoint atau TargetEndpoint
Saat proxy API mengalami error, error tersebut akan terjadi di
<ProxyEndpoint>
(permintaan dari atau respons ke aplikasi klien) atau di
<TargetEndpoint>
(permintaan ke atau respons dari layanan target). Di mana pun itu
terjadi saat Apigee mencari FaultRules.
Misalnya, jika server target tidak tersedia (kode status HTTP 503
), proxy API akan digunakan
ke status error dalam respons <TargetEndpoint>
, dan proxy API normal
alur tidak akan berlanjut ke <ProxyEndpoint>
. Jika Anda menentukan FaultRules
hanya di <ProxyEndpoint>
, fungsi tersebut
tidak akan menangani error tersebut.
Contoh lainnya, Jika kebijakan RaiseFault ada di <ProxyEndpoint>
memicu error, FaultRule di <TargetEndpoint>
tidak akan mendapatkan
telah dijalankan.
FaultRules vs. kebijakan RaiseFault
Aturan kesalahan dan kebijakan RaiseFault mungkin terkesan seperti cara alternatif untuk menyelesaikan penanganan kesalahan; dan memang benar. Tetapi mereka juga bekerja sama. Ini menjelaskan hubungan di antara keduanya. Memahami hubungan ini akan membantu merancang penanganan kesalahan, terutama jika Anda ingin menggunakan keduanya.
Singkatnya:
- Aturan kesalahan selalu dievaluasi saat proxy API mengalami error status.
-
Kebijakan RaiseFault adalah cara menempatkan proxy API dalam status error ketika tidak terjadi {i>error<i}.
Misalnya, jika Anda ingin menampilkan pesan {i>error<i} jika kode status HTTP dalam respons dari layanan target lebih besar dari
200
, Anda menambahkan kebijakan RaiseFault di respons Anda alur kerja. Token akan terlihat seperti ini:<TargetEndpoint name="default"> <PreFlow name="PreFlow"> ... <Response> <Step> <Name>Raise-Fault-1</Name> <!-- If the condition is true, the Raise-Fault-1 policy gets executed --> <Condition>(response.status.code GreaterThan "200")</Condition> </Step> </Response>
Kebijakan RaiseFault juga mengirim pesan error ke aplikasi klien.
Apa yang terjadi saat kebijakan RaiseFault memicu error, yang menyebabkan proxy mengalami error , yang mungkin akan menjalankan FaultRule? Di sinilah segalanya bisa sedikit rumit. Jika kebijakan RaiseFault akan menampilkan pesan error dan FaultRule akan dipicu dan mengembalikan pesan {i>error<i}, apa yang akan dikembalikan ke aplikasi klien?
- Karena FaultRule atau DefaultFaultRule dieksekusi setelah kebijakan RaiseFault, Data respons FaultRule akan menang.
- Data respons kebijakan RaiseFault (kode status, frasa alasan, atau payload pesan) adalah digunakan jika data tidak disetel oleh FaultRule atau DefaultFaultRule.
- Jika kebijakan RaiseFault dan FaultRule menambahkan header HTTP kustom, keduanya akan disertakan dalam responsnya. Nama header duplikat membuat header dengan beberapa nilai.
Berikut contoh setelan yang ditetapkan oleh kebijakan RaiseFault dan FaultRule, serta hal yang dikembalikan ke aplikasi klien. Contoh ini dirancang agar singkat, bukan untuk praktik terbaik.
Aplikasi klien menerima: Status Code: 468 Reason Phrase: Something happened Payload: {"Whoa":"Sorry."} Header: errorNote: woops,gremlins |
<- Kebijakan aturan kesalahan menetapkan hal ini: Status Code: [none] Reason Phrase: Something happened Payload: {"Whoa":"Sorry."} Header: errorNote: gremlins |
<- Kebijakan RaiseFault menetapkan ini: Status Code: 468 Reason Phrase: Can't do that Payload: {"DOH!":"Try again."} Header: errorNote: woops |
Mem-build kondisi
Kondisi adalah kunci untuk eksekusi FaultRule. Anda membuat kondisi FaultRule dengan cara yang sama yang Anda lakukan untuk kondisi lain di Apigee, seperti untuk alur bersyarat atau kondisi RaiseFault.
Untuk menempatkan sisa bagian ini dalam konteks, berikut contoh aturan kesalahan yang memiliki lapisan luar Kondisi FaultRule dan kondisi Langkah dalam.
<FaultRule name="invalid_key_rule"> <Step> <Name>invalid-key-message</Name> <Condition>oauthV2.Verify-API-Key-1.failed = true</Condition> </Step> <Condition>fault.name = "FailedToResolveAPIKey"</Condition> </FaultRule>
Variabel khusus kebijakan kesalahan
Variabel fault.name
dan {policy_namespace}.{policy_name}.failed
tersedia saat kebijakan menampilkan error.
fault.name
Saat kebijakan gagal, tangkap error dalam kondisi menggunakan fault.name
variabel. Contoh:
<Condition>fault.name = "policy_error_name"</Condition>
Nama error akan muncul dalam pesan error default. Misalnya, error berikut
bernama FailedToResolveAPIKey
. Dalam hal ini, variabel {i>flow<i}
yang disebut
fault.name
ditetapkan ke nilai FailedToResolveAPIKey
.
{"fault":{"faultstring":"Failed to resolve API Key variable request.queryparam.apikey","detail":{"errorcode":"steps.oauth.v2.FailedToResolveAPIKey"}}}
Jadi kondisinya akan terlihat seperti ini:
<Condition>fault.name = "FailedToResolveAPIKey"</Condition>
Lihat Referensi error kebijakan untuk mengetahui daftar error kebijakan.
{policy_namespace}.{policy_name}.failed
Variabel *.failed
tersedia saat kebijakan gagal. Berikut adalah
contoh variabel *.failed
untuk berbagai kebijakan.
Untuk namespace kebijakan, lihat variabel alur di setiap topik referensi kebijakan.
- Kebijakan RaiseFault:
raisefault.failed
(sama untuk semua kebijakan RaiseFault) - Kebijakan VerifyAPIKey:
oauthV2.{policy_name}.failed
, untuk contoh,oauthV2.Verify-API-Key-1.failed
- Kebijakan kuota dan kebijakan SpikeArrest:
ratelimit.{policy_name}.failed
, misalnya,ratelimit.Quota-1.failed
Variabel lain yang tersedia
Ketika proxy API mengalami status error, satu-satunya variabel yang tersedia untuk digunakan dalam kondisi adalah:
- Variabel kebijakan yang gagal.
- Variabel pesan HTTP yang ada pada saat kegagalan. Misalnya, jika sebuah {i>error<i}
ditampilkan dalam respons, FaultRule di
<TargetEndpoint>
dapat menggunakan HTTP dataresponse.status.code
,message.content
,error.content
, dan seterusnya. Atau, jika Kebijakan kuota gagal, Anda dapat menggunakan variabelratelimit.{quota_policy_name}.exceed.count
. Gunakan alat Debug dan Referensi kebijakan untuk membantu Anda mengetahui variabel dan data HTTP mana yang tersedia.
Informasi selengkapnya
-
Kondisi: Referensi kondisi dan Variabel flow dan kondisi
- Error: Referensi error kebijakan
- Variabel: Referensi variabel flow, dan melihat masing-masing variabel Halaman Referensi kebijakan untuk variabel yang tersedia dalam setiap kebijakan.
Praktik terbaik untuk penanganan kesalahan
Penanganan kesalahan adalah tugas desain arsitektur utama untuk pengembangan proxy API. Penting luangkan waktu untuk mencari tahu bagaimana dan kapan Anda akan menangani {i>error<i}, tentukan pesan, dan mendesain format pesan {i>error<i}. Setelah (atau saat) Anda mengetahui hal-hal itu, kemudian gunakan praktik terbaik ini untuk membantu Anda dalam implementasi penanganan kesalahan.
Berikut adalah beberapa praktik terbaik dalam mendesain dan membangun penanganan fault:
- Di FaultRules, Anda dapat menentukan jenis kebijakan apa pun. Pola yang paling umum adalah menggunakan Kebijakan TetapkanMessage untuk menetapkan item tertentu dalam respons error yang tertunda. Anda juga dapat menggunakan Menetapkan Pesan untuk menetapkan variabel yang digunakan untuk tujuan lain, misalnya, untuk variabel yang direferensikan oleh kebijakan logging yang dijalankan di PostClientFlow, atau di FlowHooks. Pertimbangkan juga untuk membuat log pesan, misalnya dengan kebijakan MessageLogging atau Kebijakan ServiceKeterangan, jika Anda ingin mencatat error tertentu dalam kondisi kesalahan tertentu.
- Jangan tetapkan kebijakan RaiseFault sebagai Langkah dalam FaultRule. Lebih baik menggunakan Kebijakan Menetapkan Pesan untuk menyetel atau mengubah elemen pesan, termasuk payload, header, atau kode status.
- Untuk setiap FaultRule, atau untuk semua kecuali FaultRule yang terakhir dievaluasi,
menyediakan
<Condition>
luar yang dilampirkan sebagai turunan dari elemen<FaultRule>
. Kondisi eksekusi untuk FaultRule tanpa aturan eksplisit Kondisi yang ditentukan, secara implisit akan dievaluasi ketrue
.<Condition>
dilampirkan sebagai turunan dari elemen<Step>
tidak digunakan untuk menentukan apakah kondisi eksekusi untuk FaultRule bernilaitrue
ataufalse
. Kondisi langkah hanya dievaluasi setelah Apigee mengeksekusi FaultRule yang memuatnya. Dalam {i>FaultRule<i}, biasanya ada beberapa Langkah dengan kebijakan MenetapkanMessage (atau yang lainnya), masing-masing dengan kondisi Step. -
Untuk menangani error dalam beberapa kebijakan berjenis sama (misalnya, beberapa Kuota kebijakan), buat satu FaultRule per error kebijakan yang mungkin akan Anda terima, lalu bedakan di antara error terpisah dengan Kondisi yang dilampirkan pada Langkah. Misalnya, buat FaultRule untuk menangani error dalam kebijakan Kuota, seperti
QuotaViolation
, dan FaultRule terpisah untukInvalidApiKey
. (Lihat Referensi error kebijakan untuk error kebijakan. Saat menemukan error tambahan yang perlu ditangani, Anda dapat kembali nanti dan menambahkannya ke FaultRules. Tidak apa-apa untuk bersifat iteratif, meskipun memang memerlukan deployment ulang proxy.) Pendekatan ini memungkinkan Anda untuk menangkap jenis kesalahan yang sama kebijakan akan menampilkannya, sehingga membuat XML FaultRules Anda efisien.Kondisi Langkah internal memberi Anda kontrol yang lebih mendetail. Misalnya, jika Anda menerapkan kuota developer individu dan kuota global dengan dua kebijakan di alur permintaan, setel kondisi FaultRule outer agar dipicu pada Error
QuotaViolation
(yang ditampilkan saat kuota terlampaui dalam kedua kasus tersebut). Selanjutnya tetapkan Kondisi langkah untuk mengevaluasi variabelexceed.count
tertentu di kedua kuota Anda kebijakan izin yang relevan. Hanya error yang relevan yang dikirim ke klien (kelebihan kuota developer atau error global kelebihan kuota). Berikut adalah contoh konfigurasi ini:<FaultRule name="over_quota"> <!-- This condition catches a QuotaViolation in *any* Quota policy --> <Condition>fault.name = "QuotaViolation"</Condition> <Step> <Name>AM-developer-over-quota-fault</Name> <Condition>ratelimit.developer-quota-policy.exceed.count GreaterThan 0</Condition> </Step> <Step> <Name>AM-global-over-quota-fault</Name> <Condition>ratelimit.global-quota-policy.exceed.count GreaterThan 0</Condition> </Step> </FaultRule>
Untuk contoh lainnya, lihat diskusi tentang Penanganan kesalahan kebijakan ini.
-
Untuk menangani error saat Anda menggunakan satu kebijakan dari satu jenis, pertimbangkan satu error yang dijalankan ketika satu kebijakan itu gagal, dan menyertakan beberapa langkah yang dipetakan ke tiap kemungkinan kesalahan. Cara ini membuat XML Anda tetap sederhana dengan menggunakan satu FaultRule, bukan beberapa FaultRules (satu untuk setiap jenis error). Misalnya, Anda dapat menentukan bahwa Langkah kebijakan MenetapkanMessage dijalankan dalam berbagai kondisi, seperti ini:
<FaultRule name="raise-fault-3"> <!-- This condition catches *any* error in the Verify-API-Key-1 policy. --> <Condition>oauthV2.Verify-API-Key-1.failed = "true"</Condition> <!-- This first step always executes, which handles errors you haven't mapped with inner conditions. --> <Step> <Name>AM-Generic-Key-Fault</Name> </Step> <Step> <Name>AM-API-Key-NotFound</Name> <Condition>fault.name = "FailedToResolveAPIKey"</Condition> </Step> <Step> <Name>AM-API-Key-Invalid</Name> <Condition>fault.name = "InvalidApiKey"</Condition> </Step> </FaultRule>
- Tambahkan FaultRules tempat error akan terjadi (sisi klien
<ProxyEndpoint>
atau sisi target<TargetEndpoint>
). Sertakan FaultRules untuk setiap kebijakan yang muncul di setiap lokasi. - Saat menggunakan kebijakan RaiseFault bersama dengan FaultRules, koordinasikan respons yang dikirim kembali saat kebijakan RaiseFault dan FaultRule menampilkan data. Sebagai jika Anda memiliki kebijakan RaiseFault yang menyetel kode status HTTP, jangan konfigurasi Tetapkan Langkah Pesan dalam FaultRule yang direset kode status. Hal terburuk yang dapat terjadi adalah kode status {i>default<i} dikembalikan ke aplikasi klien.
-
Elemen
<DefaultFaultRule>
melengkapi<FaultRules>
untuk memberi Anda kontrol lebih besar atas kebijakan yang dijalankan {i>proxy<i} saat menangani status fault. Jika Anda menentukan<DefaultFaultRule>
, skrip akan dijalankan jika salah satu atau kedua hal berikut benar:- Tidak ada FaultRule lain yang dijalankan. Kasus khusus di sini
adalah jika ada
tidak ada elemen
<FaultRules>
yang dikonfigurasi sama sekali. - Jika elemen turunan
<AlwaysEnforce>
dari<DefaultFaultRule>
bernilai benar (true).
Anda juga dapat menentukan elemen
<Condition>
di<DefaultFaultRule>
. Anda mungkin ingin melakukannya untuk mengecualikan eksekusinya berdasarkan beberapa status permintaan atau error yang tertunda jika ada atau tidak ada header tertentu.Gunakan
<DefaultFaultRule>
dengan<AlwaysEnforce>
ditetapkan ketrue
, jika Anda memiliki satu atau beberapa kebijakan yang Anda inginkan untuk selalu dijalankan oleh {i>proxy<i}, terlepas dari apakah FaultRule sebelumnya telah dijalankan. Salah satu kemungkinan skenario: misalkan Anda ingin menginjeksikan header ke dalam respons apakah permintaan {i>proxy<i} menimbulkan kesalahan atau tidak, dan apakah kesalahan telah tertangani sebelumnya. Maka Anda akan melampirkan kebijakan Menetapkan Pesan yang sesuai di Bagian<PostFlow>
/<Response>
, dan juga melampirkan kebijakan yang sama dalam<DefaultFaultRule>
dengan<AlwaysEnforce>
disetel ketrue
. - Tidak ada FaultRule lain yang dijalankan. Kasus khusus di sini
adalah jika ada
tidak ada elemen
Pola untuk penanganan fault yang terpusat dan dapat digunakan kembali
An pola penanganan error untuk proxy Apigee menjelaskan pola penanganan kesalahan terpusat tanpa duplikasi kode.
Membuat FaultRules
Untuk menambahkan FaultRule, Anda perlu mengedit konfigurasi XML ProxyEndpoint atau TargetEndpoint. Anda dapat menggunakan UI Apigee untuk melakukan pengeditan ini di panel Code Mengembangkan tampilan untuk proxy API, atau mengedit file XML yang menentukan ProxyEndpoint atau TargetEndpoint.
Jika Anda membuat FaultRules di UI Apigee, buat kebijakan yang ingin dijalankan terlebih dahulu, lalu menambahkannya ke konfigurasi FaultRule. (Anda akan mendapatkan pesan error di UI jika mencoba menyimpan FaultRule yang mereferensikan kebijakan yang belum dibuat.)
Menambahkan kebijakan ke FaultRule
Meskipun Anda dapat memasukkan kebijakan apa pun dalam FaultRule, biasanya Anda menggunakan Menetapkan kebijakan untuk membuat pesan respons kustom untuk kondisi error. MenetapkanMessage memungkinkan Anda untuk mengonfigurasi respons HTTP dengan {i>payload<i}, kode status HTTP, {i>header<i}, dan alasan.
Contoh di bawah ini menunjukkan konfigurasi kebijakan Menetapkan Pesan standar:
<AssignMessage name="AM-Invalid-Key"> <Set> <Payload contentType="text/plain">That is an error.</Payload> <StatusCode>401</StatusCode> </Set> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> </AssignMessage>
Perhatikan bahwa perintah ini tidak menentukan elemen <AssignTo>
. Ini berarti
akan ditetapkan ke pesan standby, tergantung tempat kebijakan dilampirkan.
Sekarang Anda dapat menggunakan kebijakan ini di FaultRule. Perhatikan bagaimana Anda mereferensikan MenetapkanMessage kebijakan menurut nama dalam FaultRule:
<ProxyEndpoint name="default"> ... <FaultRules> <FaultRule name="invalid_key_rule"> <Step> <Name>AM-Invalid-Key</Name> </Step> <Condition>fault.name = "InvalidApiKey"</Condition> </FaultRule> </FaultRules> </ProxyEndpoint>
Saat Anda men-deploy konfigurasi di atas, proxy API akan menjalankan kebijakan MenetapkanMessage
yang dipanggil AM-Invalid-Key
setiap kali aplikasi menyajikan kunci API yang tidak valid.
Anda dapat menjalankan beberapa kebijakan dalam FaultRule, seperti yang ditunjukkan contoh berikut:
<ProxyEndpoint name="default"> ... <FaultRules> <FaultRule name="invalid_key_rule"> <Step> <Name>AM-Invalid-Key</Name> </Step> <Step> <Name>policy2</Name> </Step> <Step> <Name>policy3</Name> </Step> <Condition>fault.name = "InvalidApiKey"</Condition> </FaultRule> </FaultRules> </ProxyEndpoint>
Kebijakan akan dijalankan sesuai urutan yang ditentukan. Misalnya, Anda dapat menggunakan Kebijakan MessageLogging, kebijakan ExtractVariables, Kebijakan Menetapkan Pesan, atau kebijakan lainnya dalam FaultRule. Perlu diperhatikan bahwa pemrosesan FaultRule akan langsung berhenti jika salah satu dari situasi ini terjadi:
- Kebijakan apa pun dalam FaultRule menyebabkan error
- Salah satu kebijakan di FaultRule adalah jenis RaiseFault
Mendefinisikan pesan error kustom yang ditampilkan dari FaultRule
Sebagai praktik terbaik, Anda harus menentukan respons kesalahan yang jelas dari Google Cloud Platform. Dengan begitu, Anda dapat memberikan informasi yang konsisten dan bermanfaat kepada klien.
Contoh kebijakan MenetapkanMessage berikut menggunakan <Payload>
dan
Tag <StatusCode>
untuk menentukan
respons error yang dikirim kembali ke klien pada error InvalidApiKey (lihat FaultRules sebelumnya
contoh).
<AssignMessage name="AM-Invalid-Key"> <Set> <Payload contentType="text/plain">You have attempted to access a resource without the correct authorization. Contact support at support@mycompany.com.</Payload> <StatusCode>401</StatusCode> </Set> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> </AssignMessage>
Respons ini menyertakan:
- Payload yang berisi pesan error dan alamat email untuk menghubungi dukungan.
- Kode status HTTP yang ditampilkan dalam respons.
- Frasa alasan, yang merupakan deskripsi singkat tentang error.
Membuat DefaultFaultRule
DefaultFaultRule bertindak sebagai pengendali pengecualian untuk setiap error yang tidak ditangani secara eksplisit oleh
{i>FaultRule<i} lainnya. Jika kondisi untuk semua FaultRules tidak cocok dengan error,
DefaultFaultRule menangani error. Aktifkan penanganan fault default dengan menambahkan atribut
Tag <DefaultFaultRule>
sebagai elemen turunan ProxyEndpoint atau
TargetEndpoint.
Misalnya, konfigurasi TargetEndpoint di bawah menetapkan DefaultFaultRule yang memanggil
kebijakan bernama AM-Return-Generic-Error
:
<TargetEndpoint name="default"> ... <FaultRules> ... </FaultRules> <DefaultFaultRule name="fault-rule"> <Step> <Name>AM-Return-Generic-Error</Name> </Step> </DefaultFaultRule> <HTTPTargetConnection> <URL>https://mytarget.example.net</URL> </HTTPTargetConnection> </TargetEndpoint>
DefaultFaultRule biasanya digunakan untuk menampilkan pesan error umum untuk otomatis, seperti pesan yang berisi informasi kontak untuk dukungan teknis. Default ini memiliki fungsi ganda, yaitu memberikan informasi yang mudah digunakan developer, mengaburkan URL backend atau informasi lain yang mungkin digunakan untuk menyusupi sistem.
Misalnya, Anda menentukan kebijakan MenetapkanMessage berikut untuk menampilkan error generik:
<AssignMessage name="AM-Return-Generic-Error"> <Set> <Payload type="text/plain">SERVICE UNAVAILABLE. PLEASE CONTACT SUPPORT: support@company.com.</Payload> </Set> </AssignMessage>
Sertakan elemen <AlwaysEnforce>
di
<DefaultFaultRule>
untuk menjalankan DefaultFaultRule untuk setiap error, bahkan
jika FaultRule lain sudah dijalankan. DefaultFaultRule selalu merupakan FaultRule terakhir
untuk mengeksekusi:
<DefaultFaultRule name="fault-rule"> <Step> <Name>AM-Return-Generic-Error</Name> </Step> <AlwaysEnforce>true</AlwaysEnforce> </DefaultFaultRule>
Salah satu kegunaan DefaultFaultRule adalah untuk menentukan jenis error yang
jika tidak, mereka tidak
dapat menentukannya. Misalnya, jika proxy API gagal karena error yang
tidak dapat ditentukan, Anda dapat menggunakan DefaultFaultRule untuk memanggil kebijakan TetapkanMessage berikut. Ini
kebijakan menulis nilai fault.name
ke header bernama Unhandled-Fault
dalam responsnya:
<AssignMessage name="AM-Set-Fault-Header"> <Set> <Headers> <Header name="Unhandled-Fault">{fault.name}</Header> </Headers> </Set> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> </AssignMessage>
Selanjutnya, Anda dapat melihat header di alat Debug atau pada respons untuk melihat penyebab {i>error<i}.
Menambahkan pencatatan pesan ke PostClientFlow
PostClientFlow adalah satu-satunya alur yang dijalankan setelah proxy memasuki error status. Hanya kebijakan MessageLogging yang dapat disertakan ke alur ini, yang akan dijalankan setelah respons dikirim kembali ke klien. Meskipun melampirkan kebijakan MessageLogging ke alur ini adalah secara teknis tidak penanganan {i>error<i}, Anda dapat menggunakannya untuk mencatat informasi jika terjadi kesalahan. Karena hal itu terlepas dari apakah {i>proxy<i} berhasil atau gagal, Anda bisa menempatkan {i>Message Logging<i} kebijakan di PostClientFlow dan dijamin selalu dieksekusi.
Menangani kesalahan kebijakan dalam alur saat ini
Semua contoh yang ditampilkan sejauh ini menggunakan FaultRule di ProxyEndpoint atau TargetEndpoint untuk menangani
error kebijakan sebagai bagian dari status error. Hal itu karena nilai {i>default<i} dari
continueOnError
elemen kebijakan adalah false
, artinya saat
terjadi dalam kebijakan, kontrol diarahkan ke status error. Setelah berada dalam status {i>error<i}, Anda
tidak bisa mengembalikan kontrol ke pipeline normal dan biasanya Anda akan memunculkan beberapa
ke aplikasi panggilan.
Namun, jika Anda menetapkan elemen continueOnError
ke true
untuk
kebijakan, kontrol tetap berjalan saat ini dan kebijakan berikutnya dalam pipeline dijalankan setelah
kebijakan yang menyebabkan error. Keuntungan menangani {i>error<i}
dalam alur saat ini adalah bahwa Anda
mungkin memiliki cara untuk memulihkan dari kesalahan
untuk menyelesaikan pemrosesan permintaan.
Di bawah ini adalah kebijakan VerifyAPIKey bernama verify-api-key
dengan
Elemen continueOnError
disetel ke true:
<VerifyAPIKey continueOnError="true" name="verify-api-key"> <DisplayName>Verify API Key</DisplayName> <APIKey ref="request.queryparam.apikey"/> </VerifyAPIKey>
Jika kunci API tidak ada atau tidak valid, kebijakan VerifyAPIKey akan menetapkan
variabel oauthV2.verify-api-key.failed
ke true
, tetapi memproses
berlanjut dengan aliran saat ini.
Kemudian, tambahkan kebijakan VerifyAPIKey sebagai langkah dalam PreFlow ProxyEndpoint:
<ProxyEndpoint name="default"> ... <PreFlow name="PreFlow"> <Request> <Step> <Name>verify-api-key</Name> </Step> <Step> <Name>FaultInFlow</Name> <Condition>oauthV2.verify-api-key.failed = "true"</Condition> </Step> </Request> <Response/> </PreFlow> </ProxyEndpoint>
Perhatikan bagaimana langkah selanjutnya dalam PreFlow menggunakan kondisi untuk menguji keberadaan
{i>error<i}. Jika terjadi error dalam kebijakan VerifyAPIKey, kebijakan bernama
FaultInFlow
kebijakan dijalankan. Jika tidak, kebijakan FaultInFlow
akan
dilewati. Kebijakan FaultInFlow
dapat melakukan banyak hal, seperti mencatat error ke dalam log,
mencoba memperbaiki {i>error<i}, atau
melakukan beberapa tindakan lainnya.
Memicu error dengan menggunakan RaiseFault kebijakan
Anda dapat menggunakan kebijakan RaiseFault kapan saja dalam satu alur untuk memicu error. Ketika seorang Kebijakan RaiseFault dijalankan, kebijakan ini menghentikan alur saat ini dan mentransfer kontrol ke error status.
Salah satu kegunaan kebijakan RaiseFault adalah untuk
menguji kondisi tertentu di mana kebijakan lain
mungkin tidak dapat dideteksi. Pada contoh di atas, Anda menambahkan tag <Condition>
ke
Tag <Step>
PreFlow yang menyebabkan kebijakan FaultInFlow
dijalankan
jika kondisi terpenuhi. Jika FaultInFlow
adalah kebijakan RaiseFault, kontrol
data tersebut ditransfer ke status error. Atau, Anda dapat menyisipkan kebijakan RaiseFault
dalam alur untuk melakukan debug dan
menguji FaultRules Anda.
Saat kebijakan RaiseFault memicu error, Anda dapat menggunakan FaultRule dan kondisi berikut untuk memprosesnya:
<FaultRule name="raisefault_rule"> <Step> <Name>POLICY-NAME-HERE</Name> </Step> <Condition>fault.name = "RaiseFault"</Condition> </FaultRule>
Perhatikan bahwa kondisi akan diuji untuk kesalahan bernama RaiseFault
. RaiseFault
kebijakan selalu menetapkan nilai fault.name
ke RaiseFault
. Anda juga dapat
mengatur variabel khusus dalam kebijakan RaiseFault. Jika demikian, Anda dapat
menguji variabel tersebut
di dalam elemen Condition.
Penanganan kustom kode error HTTP dari server target
Contoh yang ditunjukkan di bagian sebelumnya berlaku untuk error yang dibuat oleh kebijakan. Bagaimanapun cara Anda juga dapat membuat respons khusus untuk error tingkat transport, yang berarti error HTTP ditampilkan server target. Untuk mengontrol respons dari error HTTP, konfigurasikan TargetEndpoint untuk memproses kode respons HTTP.
Secara default, Apigee memperlakukan kode respons HTTP dalam rentang 1xx-3xx
sebagai
berhasil, dan HTTP
kode respons dalam rentang 4xx-5xx
sebagai gagal. Itu berarti setiap respons dari backend
dengan kode respons HTTP 4xx-5xx
akan otomatis memanggil status error, yang kemudian
mengembalikan pesan {i>error<i} secara langsung kepada klien yang meminta.
Anda dapat membuat pengendali kustom untuk kode respons HTTP apa pun. Misalnya, Anda mungkin tidak ingin
memperlakukan semua kode respons HTTP dalam rentang 4xx-5xx
sebagai "kegagalan" tetapi hanya
5xx
, atau Anda mungkin mau
untuk menampilkan pesan error kustom untuk kode respons HTTP 400
dan 500
.
Pada contoh berikutnya, Anda menggunakan properti success.codes
untuk mengonfigurasi
TargetEndpoint untuk memperlakukan kode respons HTTP 400
dan 500
sebagai berhasil,
bersama dengan HTTP
kode program. Dengan memperlakukan kode tersebut sebagai berhasil, TargetEndpoint mengambil alih pemrosesan
pesan respons, alih-alih memanggil status error:
<TargetEndpoint name="default"> ... <HTTPTargetConnection> <Properties> <Property name="success.codes">1xx,2xx,3xx,400,500</Property> </Properties> <URL>http://weather.yahooapis.com</URL> </HTTPTargetConnection> </TargetEndpoint>
Seperti yang terlihat dalam contoh ini, Anda dapat menggunakan karakter pengganti untuk menetapkan properti success.codes ke rentang nilai-nilai..
Menyetel properti success.codes
akan menimpa
nilai default-nya. Oleh karena itu, jika Anda ingin menambahkan kode HTTP 400
ke daftar keberhasilan default
kode, tetapkan properti ini sebagai:
<Property name="success.codes">1xx,2xx,3xx,400</Property>
Namun, jika Anda hanya ingin kode HTTP 400
diperlakukan sebagai kode berhasil, tetapkan properti sebagai:
<Property name="success.codes">400</Property>
Sekarang Anda dapat menentukan pengendali kustom untuk kode respons HTTP 400
dan 500
untuk menampilkan
pesan respons ke aplikasi yang meminta. TargetEndpoint berikut menggunakan kebijakan yang bernama
ReturnError
untuk menangani kode respons 400
dan 500
HTTP:
<TargetEndpoint name="default"> <PreFlow name="PreFlow"> <Request/> <Response> <Step> <Name>ReturnError</Name> <Condition>(response.status.code = 400) or (response.status.code = 500)</Condition> </Step> </Response> </PreFlow> <HTTPTargetConnection> <Properties> <Property name="success.codes">1xx,2xx,3xx,400,500</Property> </Properties> <URL>http://weather.yahooapis.com</URL> </HTTPTargetConnection> </TargetEndpoint>
Konfigurasi TargetEndpoint ini menyebabkan kebijakan yang disebut ReturnError
menangani
respons setiap kali TargetEndpoint
menemukan kode respons HTTP
400
ATAU 500
.
Taksonomi salah
Layanan API mengatur kesalahan ke dalam kategori dan subkategori berikut.
Kategori | Subkategori | Nama Kesalahan | Deskripsi |
---|---|---|---|
Pesan | Kegagalan yang terjadi selama alur pesan (tidak termasuk kegagalan kebijakan) | ||
Kesalahan kustom | {fault_name} | Setiap kesalahan yang secara eksplisit ditangani oleh proxy API menggunakan kebijakan RaiseFault | |
Kode respons | InternalServerError, Tidak Ditemukan | Kode error HTTP 5xx , 4xx |
|
Kegagalan pemilihan rute | NoRoutesMatched | Gagal memilih TargetEndpoint bernama untuk permintaan | |
Kegagalan klasifikasi | NotFound | Kegagalan disebabkan oleh URI permintaan yang tidak cocok dengan BasePath mana pun untuk ProxyEndpoint mana pun (yaitu, tidak ada proxy API yang cocok dengan URL di permintaan aplikasi klien) | |
Transpor | Error tingkat transpor HTTP | ||
Konektivitas | ConnectionRefused, ConnectionReset, ConnectionTimeout | Terjadi kegagalan saat membuat koneksi tingkat jaringan atau transport | |
Minta validasi | ContentLengthMissing, HostHeaderMissing | Kesalahan terjadi selama pemeriksaan semantik pada setiap permintaan | |
Validasi respons | Kesalahan terjadi selama pemeriksaan semantik pada setiap respons | ||
Error IO | SSLHandshakeError, ReadTimeout, ReadError, WriteTimeout, WriteError, ChunkError | Error baca/tulis di endpoint klien atau target, waktu tunggu, error TLS/SSL, dan potongan kesalahan | |
Sistem | Error runtime yang tidak ditentukan | ||
Memori | OutOfMemory, GCOverLimit | Kegagalan terkait memori | |
Rangkaian pesan | RogueTaskTerminated | Kegagalan seperti penghentian tugas yang tidak sedang dijalankan | |
Kebijakan | Kesalahan untuk setiap jenis kebijakan ditentukan dalam Referensi kebijakan. |
Error selalu disertai dengan deskripsi teks alasan kegagalan tersebut. Jika sistem menimbulkan kesalahan, serangkaian atribut diisi untuk membantu dalam pemecahan masalah. Kesalahan mencakup informasi berikut:
- Alasan
- Atribut khusus yang ditentukan pengguna