Menangani kesalahan

Halaman ini berlaku untuk Apigee dan Apigee Hybrid.

Baca dokumentasi Apigee Edge.

Banyak kondisi error yang dapat muncul saat proxy API melayani permintaan dari aplikasi. Misalnya, proxy API mungkin mengalami masalah jaringan saat berkomunikasi dengan layanan backend, aplikasi mungkin memiliki kredensial yang sudah tidak berlaku, pesan permintaan mungkin salah diformat, dan sebagainya.

Jika terjadi error setelah aplikasi klien memanggil proxy API, pesan error akan ditampilkan ke klien. Secara default, klien sering menerima pesan error samar tanpa detail atau panduan. Namun, jika Anda ingin mengganti pesan error default dengan pesan kustom yang lebih berguna, bahkan memperkayanya dengan hal-hal seperti header HTTP tambahan, Anda perlu menyiapkan penanganan fault kustom di Apigee.

Penanganan kesalahan kustom juga memungkinkan Anda menambahkan fungsi seperti logging pesan setiap kali terjadi error.

Sebelum kita membahas cara menerapkan penanganan error kustom di proxy API, sebaiknya pahami bagaimana error terjadi dan reaksi proxy API terhadapnya.

Video

Tonton video berikut untuk mempelajari lebih lanjut penanganan kesalahan.

Video Deskripsi
Pengantar penanganan fault dan alur error Pelajari penanganan kesalahan dan apa yang terjadi saat error terjadi di proxy API.
Menangani error menggunakan aturan fault Mempelajari cara menangani kesalahan menggunakan aturan kesalahan.
Mengajukan kesalahan khusus menggunakan kebijakan RaiseFault Mengajukan kesalahan kustom selama runtime API menggunakan kebijakan RaiseFault.
Menentukan aturan fault di proxy API dan endpoint target Menentukan aturan fault di proxy API dan endpoint target serta memahami perbedaannya.
Memahami urutan eksekusi aturan fault Memahami urutan eksekusi aturan fault di proxy API dan endpoint target.
Menentukan aturan fault default Menentukan aturan kesalahan default untuk menangani error umum di API Anda.

Cara terjadinya error

Pertama-tama, kita hanya akan membahas bagaimana error terjadi. Mengetahui bagaimana error terjadi akan membantu Anda merencanakan berbagai situasi ketika Anda ingin menerapkan penanganan error kustom.

Error otomatis

Proxy API memunculkan error secara otomatis dalam situasi berikut:

  • Kebijakan akan memunculkan error. Misalnya, jika panggilan API mengirimkan kunci yang sudah tidak berlaku, kebijakan VerifyAPIKey akan otomatis menampilkan error; atau jika jumlah panggilan API melebihi batas tertentu, Kebijakan kuota atau kebijakan SpikeArrest akan menampilkan error. (Lihat Referensi error kebijakan untuk jenis-jenis error yang dapat ditampilkan oleh kebijakan).
  • Ada masalah dalam alur pesan proxy API, seperti error perutean.
  • Ada kegagalan backend, seperti error HTTP karena kegagalan tingkat protokol, error TLS/SSL, atau layanan target yang tidak tersedia.
  • Ada kegagalan level sistem, seperti pengecualian kehabisan memori.

Untuk informasi selengkapnya tentang error ini, lihat Taksonomi kesalahan dalam topik ini.

Error kustom

Jika tidak ada error otomatis, Anda dapat menampilkan error kustom; misalnya, jika respons berisi kata unavailable, atau jika kode status HTTP lebih besar daripada 201. Lakukan hal ini dengan menambahkan kebijakan RaiseFault ke tempat yang sesuai dalam alur proxy API.

Anda dapat menambahkan kebijakan RaiseFault ke alur proxy API, sama seperti yang Anda lakukan pada kebijakan lainnya. Dalam contoh konfigurasi proxy berikut, kebijakan Raise-Fault-1 dilampirkan ke respons TargetEndpoint. Jika kata unavailable ada dalam respons dari layanan target, kebijakan RaiseFault akan dijalankan dan memunculkan error.

<TargetEndpoint name="default">
...
  <Response>
    <Step>
      <Name>Raise-Fault-1</Name>
      <Condition>message.content Like "*unavailable*"</Condition>
    </Step>
  </Response>

Ini hanya untuk menunjukkan bahwa Anda dapat menampilkan error kustom. Kami membahas kebijakan RaiseFault secara lebih mendetail di bagian kebijakan FaultRules vs. kebijakan RaiseFault.

Untuk contoh lainnya, lihat postingan Komunitas Apigee:

Apa yang dilakukan proxy API saat terjadi error

Inilah yang terjadi ketika proxy menampilkan error.

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 memasuki status error, proxy API tidak dapat mengembalikan pemrosesan ke pipeline alur normal.

Contohnya, anggaplah proxy API memiliki kebijakan dengan urutan berikut pada permintaan ProxyEndpoint:

  1. Memverifikasi Kunci API
  2. Kuota
  3. JSON ke XML

Jika terjadi error selama verifikasi kunci API, proxy API akan beralih ke status error. Kebijakan Kuota dan JSON ke XML tidak dijalankan, proxy tidak akan melanjutkan ke TargetEndpoint, dan pesan error ditampilkan ke aplikasi klien.

Memeriksa FaultRules

Dalam status error, proxy API juga memeriksa keberadaan hal-hal berikut (secara berurutan) dalam konfigurasi proxy API sebelum menampilkan pesan error default ke aplikasi klien:

  1. Bagian <FaultRules>, yang berisi logika untuk memicu pesan error kustom (dan kebijakan lainnya) berdasarkan kondisi tertentu yang Anda tentukan.
  2. Bagian <DefaultFaultRule>, yang memicu pesan error default dalam situasi berikut:
    • Tidak ada <FaultRules> yang ditentukan.
    • Tidak ada <FaultRules> yang dijalankan.
    • Elemen <AlwaysEnforce> disetel ke benar (true).

Pada intinya, proxy API memberi Anda kesempatan untuk menampilkan pesan error khusus dan memicu logika lainnya. Jika proxy tidak menemukan bagian tersebut, atau keduanya ada tetapi tidak ada kesalahan khusus yang dipicu, proxy akan mengirim pesan default yang dihasilkan Apigee sendiri.

Contoh penanganan kesalahan sederhana

Mari kita mulai dengan contoh sederhana, ketika panggilan ke proxy API tidak berisi kunci API yang diperlukan. 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 menemukan pesan error, tetapi mungkin saja tidak. Selain itu, banyak error default yang lebih halus dan sulit dipahami.

Sebagai developer API, Andalah yang mengubah pesan ini untuk memenuhi kebutuhan siapa pun yang pada akhirnya akan menerima pesan error, baik itu developer aplikasi iOS maupun grup pengujian internal yang memiliki persyaratan format pesan error sendiri.

Berikut adalah contoh dasar cara membuat pesan error khusus untuk menangani error ini. Hal ini memerlukan 1) kebijakan yang menentukan pesan kustom, dan 2) FaultRule yang mengeksekusi kebijakan saat proxy beralih ke status error.

1. Buat kebijakan yang mendefinisikan pesan kustom

Pertama, buat kebijakan yang mendefinisikan pesan error kustom. Anda dapat menggunakan jenis kebijakan apa pun, seperti kebijakanAssignMessage, yang dapat menetapkan payload dan header HTTP opsional seperti kode status dan frasa alasan. KebijakanAssignMessage cocok untuk hal ini. Opsi ini memungkinkan Anda mengontrol payload pesan, menetapkan kode status HTTP yang berbeda, menetapkan frasa alasan HTTP yang berbeda, dan menambahkan header HTTP.

Anda tidak perlu melampirkan kebijakan ke alur; cukup buat kebijakan, seperti yang dijelaskan dalam Membuat kebijakan.

Berikut adalah contoh kebijakanAssignMessage 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 error kunci API tidak ada ini). Frasa alasan muncul di samping kode status di header HTTP.
  • Membuat dan mengisi header HTTP baru yang disebut 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>

Saat kebijakan ini dijalankan, respons terhadap aplikasi klien akan terlihat seperti berikut. Bandingkan dengan respons default yang ditampilkan 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, ini sedikit konyol, tapi itu menunjukkan kepada Anda apa yang mungkin terjadi. Setidaknya sekarang developer yang menerima pesan tersebut mengetahui bahwa mereka lupa menyertakan kunci API sebagai parameter kueri.

Namun, bagaimana 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 beberapa bagian <FaultRule> individual. Setiap FaultRule mewakili error berbeda yang ingin Anda tangani. Dalam contoh sederhana ini, kita hanya akan menggunakan satu FaultRule untuk menunjukkan komponennya.

Anda juga harus menambahkan <DefaultFaultRule> untuk memberikan pesan 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. Anda akan mempelajari lebih lanjut tentang penggunaan FaultRules di ProxyEndpoint vs. TargetEndpoint nanti.
  • <Name>: Nama kebijakan yang akan dijalankan. Nama ini berasal dari atribut name kebijakan pada elemen induk, seperti yang ditampilkan dalam contoh kebijakan sebelumnya.
  • <Condition>: Apigee mengevaluasi kondisi dan mengeksekusi kebijakan hanya jika kondisinya benar. Jika ada beberapa FaultRules yang bernilai benar (true), Apigee akan mengeksekusi aturan pertama yang benar. (Penting: Urutan FaultRules yang dievaluasi, dari atas ke bawah atau dari bawah ke atas, berbeda antara TargetEndpoint dan ProxyEndpoint, seperti yang dijelaskan di bagian Beberapa Aturan Kesalahan dan logika eksekusi.) Jika Anda tidak menyertakan suatu kondisi, FaultRule akan otomatis bernilai benar (true). Tapi itu bukan praktik terbaik. Setiap FaultRule harus memiliki kondisinya sendiri.

  • <DefaultFaultRule>: Jika tidak ada FaultRule kustom yang dijalankan, <DefaultFaultRule> akan dijalankan, sehingga mengirimkan pesan kustom yang lebih umum, bukan pesan default samar yang dihasilkan Apigee. <DefaultFaultRule> juga dapat memiliki <Condition>, tetapi dalam sebagian besar kasus, Anda tidak akan menyertakannya, karena Anda ingin mengeksekusinya, apa pun upaya yang terakhir dilakukan.

    DefaultFaultRule biasanya digunakan untuk menampilkan pesan error umum untuk error tidak terduga. Contohnya adalah pesan yang berisi informasi kontak untuk dukungan teknis. Respons default ini memiliki tujuan ganda, yaitu memberikan informasi yang cocok untuk developer sekaligus mengaburkan URL backend atau informasi lain yang mungkin digunakan untuk menyusupi sistem.

Beberapa FaultRules dan logika eksekusi

Di bagian Contoh penanganan kesalahan sederhana, kami menggunakan contoh sederhana untuk satu FaultRule dan kondisi. Dalam project API dunia nyata, dengan semua kemungkinan error yang dapat terjadi, Anda mungkin memiliki beberapa FaultRules dan DefaultFaultRule di <ProxyEndpoint> dan <TargetEndpoint>. Namun pada akhirnya, hanya satu FaultRule yang dijalankan ketika proxy API mengalami status error.

Bagian ini menjelaskan logika yang digunakan Apigee dalam menangani FaultRules, mulai dari penerimaan FaultRule yang diterima hingga cara penanganan kondisi Langkah inner saat FaultRule dipicu. Bagian ini juga menjelaskan kapan harus menentukan FaultRules di <ProxyEndpoint> vs. <TargetEndpoint>, serta menjelaskan hubungan antara FaultRules dan kebijakan RaiseFault.

Eksekusi FaultRules

Singkatnya, berikut ini adalah logika yang digunakan Apigee saat proxy API mengalami status error. Perlu diperhatikan bahwa ada sedikit perbedaan antara evaluasi FaultRules di ProxyEndpoint dengan TargetEndpoint.

  1. Apigee mengevaluasi FaultRules di ProxyEndpoint atau TargetEndpoint, bergantung pada tempat terjadinya error:
    • ProxyEndpoint - Apigee dimulai dengan <FaultRule> bottom dalam XML konfigurasi dan terus meningkat, sehingga mengevaluasi <Condition> setiap <FaultRule> (kondisi outer, bukan kondisi <Step> dalam).
    • TargetEndpoint - Apigee dimulai dengan <FaultRule> TargetEndpoint dalam XML konfigurasi dan terus menurun, mengevaluasi <Condition> dari setiap <FaultRule> (kondisi luar, bukan kondisi <Step> dalam).
  2. Mengeksekusi FaultRule first yang kondisinya bernilai true. Jika FaultRule memiliki kondisi tidak, nilainya adalah benar (true) secara default.
    • Saat FaultRule dijalankan, semua Langkah di dalam FaultRule akan dievaluasi secara berurutan, dari atas ke bawah dalam konfigurasi XML. Langkah-langkah tanpa kondisi akan dijalankan secara otomatis (kebijakan dijalankan), dan Langkah yang memiliki <Condition> yang dievaluasi akan dijalankan (kondisi yang bernilai code tidak dijalankan).
    • Jika FaultRule dijalankan, tetapi tidak ada langkah-langkah dalam FaultRule yang dijalankan (karena kondisinya bernilai code), pesan error default yang dihasilkan Apigee akan ditampilkan ke aplikasi klien. <DefaultFaultRule> tidak dieksekusi karena Apigee sudah menjalankan satu FaultRule-nya.

  3. Jika tidak ada FaultRule yang dijalankan, Apigee akan mengeksekusi <DefaultFaultRule>, jika ada.

Berikut adalah contoh dengan komentar inline.

Eksekusi ProxyEndpoint

Evaluasi ProxyEndpoint FaultRules berada di bawah ke atas, jadi mulailah membaca FaultRule terakhir dari contoh berikut dan lanjutkan ke atas. Lihat DefaultFaultRule terakhir.

<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 pertama dalam contoh berikut dan lanjutkan ke bawah. Lihat DefaultFaultRule terakhir.

<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 Anda lihat pada contoh sebelumnya, urutan FaultRules penting untuk Anda, bergantung pada apakah error terjadi di ProxyEndpoint atau TargetEndpoint.

Contoh:

Urutan ProxyEndpoint Urutan TargetEndpoint

Pada contoh berikut, karena evaluasi dilakukan dari bawah ke atas, FaultRule 3 dijalankan, yang berarti FaultRules 2 dan 1 tidak dievaluasi.

5. Aturan Kesalahan 1: FALSE

4. Aturan Kesalahan 2: BENAR

3. Aturan Kesalahan 3: BENAR

2. Aturan Kesalahan 4: FALSE

1. Aturan Kesalahan 5: FALSE

Pada contoh berikut, karena evaluasi dilakukan dari atas ke bawah, FaultRule 2 dijalankan, yang berarti FaultRules 3, 4, dan 5 tidak dievaluasi.

1. Aturan Kesalahan 1: FALSE

2. Aturan Kesalahan 2: BENAR

3. Aturan Kesalahan 3: BENAR

4. Aturan Kesalahan 4: FALSE

5. Aturan Kesalahan 5: FALSE

Kebijakan yang akan disertakan

Anda dapat menjalankan kebijakan apa pun dari FaultRule dengan memasukkannya ke dalam Langkah. Misalnya, Anda dapat menjalankan kebijakanAssignMessage untuk memformat respons terhadap aplikasi klien, lalu mencatat pesan ke dalam log dengan kebijakan MessageLogging. Kebijakan dijalankan sesuai urutan Anda menempatkannya (dari atas ke bawah pada XML).

Aturan kesalahan HANYA dipicu dalam status kesalahan (tentang continueOnError)

Judulnya mungkin tampak seperti kita mengulang, tetapi ada satu perbedaan tertentu yang perlu diperhatikan sehubungan dengan error proxy yang menyebabkan proxy API memasuki status error—atau tidak memasuki status error: atribut continueOnError pada kebijakan.

Ringkasnya: Proxy API mengevaluasi <FaultRules> dan <DefaultFaultRule> hanya jika proxy telah memasuki status error. Artinya, meskipun kondisi FaultRule bernilai true, kondisi tersebut tidak akan dipicu jika proxy tidak berada dalam status error.

Namun, berikut ini contoh error yang terjadi dan proxy tidak memasuki status error. Pada kebijakan apa pun, Anda dapat menetapkan atribut pada elemen induk yang disebut continueOnError. Atribut tersebut sangat penting terkait dengan penanganan fault, karena menentukan apakah proxy akan memasuki status error atau tidak jika kebijakan gagal. Dalam sebagian besar kasus, sebaiknya Anda mempertahankan continueOnError="false" default, yang menempatkan proxy dalam status error jika kebijakan gagal, dan penanganan error khusus Anda akan terpicu. Namun, jika continueOnError="true" (misalnya, jika Anda tidak ingin kegagalan Service Callout menghentikan eksekusi proxy), proxy tidak akan mengalami status error jika kebijakan tersebut gagal, dan proxy tidak akan melihat FaultRules Anda.

Untuk mengetahui informasi tentang logging error saat continueOnError="true", lihat Menangani kesalahan kebijakan dalam flow saat ini.

Tempat untuk menentukan FaultRules: ProxyEndpoint atau TargetEndpoint

Saat proxy API mengalami error, error tersebut akan terjadi dalam <ProxyEndpoint> (permintaan dari atau respons ke aplikasi klien) atau dalam <TargetEndpoint> (permintaan ke atau respons dari layanan target). Di mana pun error tersebut terjadi, Apigee akan mencari FaultRules.

Misalnya, jika server target tidak tersedia (kode status HTTP 503), proxy API akan beralih ke status error dalam respons <TargetEndpoint>, dan alur proxy API normal tidak akan melanjutkan ke <ProxyEndpoint>. Jika Anda memiliki FaultRules yang hanya ditentukan di <ProxyEndpoint>, FaultRules tidak akan menangani error tersebut.

Contoh lainnya, Jika kebijakan RaiseFault pada respons <ProxyEndpoint> memicu error, FaultRule di <TargetEndpoint> tidak akan dijalankan.

FaultRules vs. kebijakan RaiseFault

Aturan error dan kebijakan RaiseFault di permukaan mungkin terdengar seperti cara alternatif untuk menyelesaikan penanganan fault; dan dalam beberapa hal ini benar. Tetapi alat-alat ini juga bekerja sama. Bagian ini menjelaskan hubungan antara keduanya. Memahami hubungan ini akan membantu Anda mendesain penanganan kesalahan, terutama jika ingin menggunakan keduanya.

Secara singkat:

  • Aturan error selalu dievaluasi saat proxy API memasuki status error.
  • Kebijakan RaiseFault adalah cara untuk menempatkan proxy API dalam status error ketika error sebenarnya tidak terjadi.

    Misalnya, jika ingin menampilkan error jika kode status HTTP dalam respons dari layanan target lebih besar dari 200, Anda harus menambahkan kebijakan RaiseFault dalam alur respons. Token akan terlihat seperti berikut:

    <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 jika kebijakan RaiseFault memicu error, yang menempatkan proxy dalam status error, yang berpotensi menjalankan FaultRule? Di sinilah segalanya akan menjadi sedikit lebih rumit. Jika kebijakan RaiseFault menampilkan pesan error dan FaultRule akan terpicu serta menampilkan pesan error, apa yang akan ditampilkan ke aplikasi klien?

  • Karena FaultRule atau DefaultFaultRule dijalankan setelah kebijakan RaiseFault, data respons FaultRule akan menang.
  • Data respons kebijakan RaiseFault (kode status, frasa alasan, atau payload pesan) digunakan jika data tersebut tidak ditetapkan oleh FaultRule atau DefaultFaultRule.
  • Jika kebijakan RaiseFault dan FaultRule menambahkan header HTTP kustom, keduanya akan disertakan dalam respons. Nama header duplikat akan membuat header dengan beberapa nilai.

Berikut adalah contoh hal yang ditetapkan oleh kebijakan RaiseFault dan FaultRule, serta apa yang akan ditampilkan ke aplikasi klien. Contoh ini dirancang agar singkat, bukan untuk praktik terbaik.

Apa yang ditetapkan oleh kebijakan RaiseFault dan FaultRule.

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 hal 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 seperti yang Anda lakukan untuk kondisi lain di Apigee, seperti untuk flow bersyarat atau kondisi RaiseFault.

Untuk menyertakan bagian lainnya dalam konteks, berikut adalah contoh aturan kesalahan yang memiliki kondisi FaultRule luar 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 untuk error kebijakan

Variabel fault.name dan {policy_namespace}.{policy_name}.failed tersedia saat kebijakan menampilkan error.

fault.name

Jika kebijakan gagal, tangkap error dalam kondisi menggunakan variabel fault.name. Contoh:

<Condition>fault.name = "policy_error_name"</Condition>

Nama error akan muncul di pesan error default. Misalnya, dalam kode berikut, nama kesalahan adalah FailedToResolveAPIKey. Dalam hal ini, variabel flow bernama 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 kebijakan yang berbeda. Untuk namespace kebijakan, lihat variabel alur di setiap topik referensi kebijakan.

Variabel lain yang tersedia

Saat 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 titik kegagalan. Misalnya, jika error ditampilkan dalam respons, FaultRule di <TargetEndpoint> dapat menggunakan data HTTP response.status.code, message.content, error.content, dan seterusnya. Atau, jika Kebijakan kuota gagal, Anda dapat menggunakan variabel ratelimit.{quota_policy_name}.exceed.count. Gunakan Alat debug dan Referensi kebijakan untuk membantu Anda mengetahui variabel dan data HTTP yang tersedia.

Informasi selengkapnya

Praktik terbaik untuk penanganan kesalahan

Penanganan kesalahan adalah tugas desain arsitektur utama untuk pengembangan proxy API. Anda harus meluangkan waktu untuk mencari tahu bagaimana dan kapan Anda menangani error, menentukan pesan error yang akan muncul, dan merancang format pesan error. Setelah (atau saat) Anda memahami hal tersebut, gunakan praktik terbaik ini untuk membantu implementasi penanganan fault Anda.

Berikut adalah beberapa praktik terbaik dalam mendesain dan membangun penanganan kesalahan:

  • Di FaultRules, Anda dapat menentukan jenis kebijakan apa pun. Pola yang paling umum adalah menggunakan kebijakanAssignMessage untuk menetapkan item tertentu dalam respons error yang tertunda. Anda juga dapat menggunakan ProvideMessage untuk menetapkan variabel yang digunakan untuk tujuan lain, misalnya, untuk variabel yang dirujuk oleh kebijakan logging yang dijalankan di PostClientFlow, atau di FlowHooks. Pertimbangkan juga untuk mencatat pesan ke dalam log, misalnya dengan kebijakan MessageLogging atau kebijakan ServiceCallout, jika Anda ingin mencatat error tertentu dalam kondisi kesalahan tertentu.
  • Jangan menetapkan kebijakan RaiseFault sebagai Langkah dalam FaultRule. Sebaiknya gunakan kebijakan ProvideMessage untuk menetapkan atau mengubah elemen pesan, termasuk payload, header, atau kode status.
  • Untuk setiap FaultRule, atau untuk semua selain FaultRule yang dievaluasi terakhir, berikan outer <Condition> yang dilampirkan sebagai turunan dari elemen <FaultRule>. Kondisi eksekusi untuk FaultRule tanpa Kondisi eksplisit yang ditetapkan, akan dievaluasi secara implisit ke true. Elemen <Condition> yang dilampirkan sebagai turunan elemen <Step> tidak digunakan untuk menentukan apakah kondisi eksekusi untuk FaultRule bernilai true atau false. Kondisi langkah hanya dievaluasi setelah Apigee menjalankan FaultRule yang memuatnya. Dalam FaultRule, biasanya memiliki beberapa Langkah dengan kebijakan ApplyMessage (atau lainnya), yang masing-masing dengan kondisi Step.
  • Untuk menangani error dalam beberapa kebijakan dari jenis yang sama (misalnya, beberapa kebijakan Kuota), buat satu FaultRule untuk setiap error kebijakan yang kemungkinan akan Anda terima, lalu bedakan antara error terpisah dengan Kondisi yang dilampirkan ke Langkah. Misalnya, buat FaultRule untuk menangani error dalam kebijakan Kuota, seperti QuotaViolation, dan FaultRule yang terpisah untuk InvalidApiKey. (Lihat Referensi error kebijakan untuk error kebijakan. Saat menemukan error lain yang perlu ditangani, Anda dapat kembali lagi nanti dan menambahkannya ke FaultRules. Anda dapat melakukan iterasi, meskipun memang memerlukan deployment ulang proxy.) Pendekatan ini memungkinkan Anda menangkap jenis error yang sama, apa pun kebijakan yang menampilkannya, sehingga membuat XML FaultRules Anda efisien.

    Kondisi Langkah bagian dalam memberi Anda kontrol yang lebih mendetail. Misalnya, jika Anda menerapkan kuota developer individual dan kuota global dengan dua kebijakan dalam alur permintaan, tetapkan kondisi FaultRule outer agar dipicu pada error QuotaViolation (yang ditampilkan ketika kuota terlampaui dalam kedua kasus tersebut). Kemudian, tetapkan kondisi Langkah untuk mengevaluasi variabel exceed.count spesifik di kedua kebijakan kuota Anda. Hanya error relevan yang dikirim ke klien (kelebihan kuota developer atau kelebihan kuota global). 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.

  • Untuk menangani error saat Anda menggunakan satu kebijakan dari satu jenis, pertimbangkan satu aturan kesalahan yang dijalankan saat satu kebijakan tersebut gagal, dan sertakan beberapa langkah yang dipetakan ke setiap kemungkinan error. Hal ini membuat XML Anda lebih sederhana dengan menggunakan satu FaultRule, bukan beberapa FaultRules (satu untuk setiap jenis error). Misalnya, Anda dapat menentukan langkah-langkah AssignMessage yang berbeda dieksekusi 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 data respons yang dikirim kembali saat kebijakan RaiseFault dan FaultRule menampilkan data. Misalnya, jika Anda memiliki kebijakan RaiseFault yang menetapkan kode status HTTP, jangan juga mengonfigurasi Langkah ProvideMessage dalam FaultRule yang mereset kode status. Hal terburuk yang dapat terjadi adalah kode status default ditampilkan ke aplikasi klien.
  • Elemen <DefaultFaultRule> melengkapi elemen <FaultRules> untuk memberi Anda lebih banyak kontrol atas kebijakan yang dijalankan proxy saat menangani status kesalahan. Jika Anda menentukan <DefaultFaultRule>, kode ini akan dijalankan jika salah satu atau kedua hal berikut berlaku:

    • Tidak ada FaultRule lain yang telah dieksekusi. Kasus khusus di sini adalah jika tidak ada elemen <FaultRules> yang dikonfigurasi sama sekali.
    • Jika elemen turunan <AlwaysEnforce> dari <DefaultFaultRule> benar.

    Anda juga dapat menentukan elemen <Condition> di <DefaultFaultRule>. Anda mungkin perlu melakukannya untuk mengecualikan eksekusinya berdasarkan status permintaan atau pesan error yang tertunda, misalnya jika header tertentu ada atau tidak ada.

    Gunakan <DefaultFaultRule> dengan <AlwaysEnforce> yang ditetapkan ke true, jika Anda memiliki satu atau beberapa kebijakan yang Anda inginkan untuk selalu dijalankan proxy, terlepas dari apakah FaultRule sebelumnya telah dijalankan. Satu kemungkinan skenario: misalkan Anda ingin memasukkan header ke dalam respons dalam semua kasus, apakah permintaan proxy menghasilkan kesalahan atau tidak, dan apakah kesalahan tersebut telah ditangani sebelumnya. Kemudian, Anda akan melampirkan kebijakan produksi yang sesuai di bagian <PostFlow>/<Response>, dan juga melampirkan kebijakan yang sama di <DefaultFaultRule> dengan <AlwaysEnforce> yang ditetapkan ke true.

Pola untuk penanganan kesalahan terpusat yang dapat digunakan kembali

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 di tampilan Develop 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 tambahkan ke konfigurasi FaultRule. (Anda akan mengalami error di UI jika mencoba menyimpan FaultRule yang merujuk ke kebijakan yang belum dibuat.)

Menambahkan kebijakan ke FaultRule

Meskipun Anda dapat menempatkan kebijakan apa pun di FaultRule, biasanya Anda akan menggunakan kebijakanAssignMessage untuk menghasilkan pesan respons kustom untuk kondisi error. Dengan AccessMessage, Anda dapat mengonfigurasi respons HTTP dengan payload, kode status HTTP, header, dan elemen frasa alasan.

Contoh di bawah menunjukkan konfigurasi kebijakanAssignMessage yang umum:

<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 kode ini tidak menentukan elemen <AssignTo>. Artinya, kolom ini akan ditetapkan ke pesan standby, bergantung pada tempat kebijakan dilampirkan.

Sekarang Anda dapat menggunakan kebijakan ini di FaultRule. Perhatikan cara Anda mereferensikan kebijakan ReplaceMessage menggunakan nama di 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 menerapkan konfigurasi di atas, proxy API akan menjalankan kebijakan TetapkanMessage yang disebut AM-Invalid-Key setiap kali aplikasi menampilkan kunci API yang tidak valid.

Anda dapat menjalankan beberapa kebijakan di 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 dijalankan dalam urutan yang ditentukan. Misalnya, Anda dapat menggunakan kebijakan MessageLogging, kebijakan ExtractVariables, kebijakanAssignMessage, atau kebijakan lainnya di FaultRule. Perhatikan bahwa pemrosesan FaultRule langsung berhenti jika salah satu situasi berikut terjadi:

  • Kebijakan apa pun dalam FaultRule menyebabkan error
  • Setiap kebijakan di FaultRule merupakan jenis RaiseFault

Menentukan pesan error kustom yang ditampilkan dari FaultRule

Sebagai praktik terbaik, Anda harus menentukan respons error yang jelas dari API Anda. Dengan begitu, Anda dapat menyampaikan informasi yang konsisten dan bermanfaat kepada klien.

Contoh kebijakan TetapkanMessage berikut menggunakan tag <Payload> dan <StatusCode> untuk menentukan respons error kustom yang dikirim kembali ke klien saat terjadi error InvalidApiKey (lihat contoh FaultRules sebelumnya).

<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 error.

Membuat DefaultFaultRule

DefaultFaultRule bertindak sebagai pengendali pengecualian untuk error yang tidak ditangani secara eksplisit oleh FaultRule lain. Jika kondisi untuk semua FaultRules tidak cocok dengan error, DefaultFaultRule akan menangani error tersebut. Aktifkan penanganan fault default dengan menambahkan tag <DefaultFaultRule> sebagai elemen turunan ProxyEndpoint atau TargetEndpoint.

Misalnya, konfigurasi TargetEndpoint di bawah ini 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 bagi error yang tidak terduga, seperti pesan yang berisi informasi kontak untuk dukungan teknis. Respons default ini memiliki tujuan ganda, yaitu memberikan informasi yang cocok untuk developer sekaligus mengaburkan URL backend atau informasi lain yang mungkin digunakan untuk menyusupi sistem.

Misalnya, Anda menentukan kebijakan TetapkanMessage berikut untuk menampilkan error umum:

<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> dalam tag <DefaultFaultRule> guna menjalankan DefaultFaultRule untuk setiap error, meskipun FaultRule lain telah dijalankan. DefaultFaultRule selalu merupakan FaultRule terakhir yang akan dijalankan:

  <DefaultFaultRule name="fault-rule">
    <Step>
      <Name>AM-Return-Generic-Error</Name>
    </Step>
    <AlwaysEnforce>true</AlwaysEnforce>
  </DefaultFaultRule>

Salah satu kegunaan DefaultFaultRule adalah menentukan jenis error yang terjadi jika Anda tidak dapat menentukannya. Misalnya, jika proxy API Anda gagal karena error yang tidak dapat ditentukan, Anda dapat menggunakan DefaultFaultRule untuk memanggil kebijakan ReplaceMessage berikut. Kebijakan ini menulis nilai fault.name ke header bernama Unhandled-Fault dalam respons:

<AssignMessage name="AM-Set-Fault-Header">
  <Set>
    <Headers>
      <Header name="Unhandled-Fault">{fault.name}</Header>
    </Headers>
  </Set>
  <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
</AssignMessage>

Anda kemudian dapat menampilkan header di Alat debug atau pada respons untuk melihat penyebab error.

Menambahkan logging pesan ke PostClientFlow

PostClientFlow adalah satu-satunya alur yang dijalankan setelah proxy memasuki status error. Hanya kebijakan MessageLogging yang dapat dilampirkan ke alur ini, yang dijalankan setelah responsnya dikirim kembali ke klien. Meskipun melampirkan kebijakan MessageLogging ke alur ini secara teknis bukanlah penanganan error, Anda dapat menggunakannya untuk mencatat informasi ke dalam log jika terjadi error. Karena dijalankan terlepas dari apakah proxy berhasil atau gagal, Anda dapat menempatkan kebijakan Logging Pesan di PostClientFlow dan dijamin bahwa kebijakan tersebut selalu dijalankan.

Menangani kesalahan kebijakan dalam alur saat ini

Semua contoh yang ditampilkan sejauh ini menggunakan FaultRule pada ProxyEndpoint atau TargetEndpoint untuk menangani error kebijakan sebagai bagian dari status error. Hal itu dikarenakan nilai default elemen continueOnError kebijakan adalah false. Artinya, saat terjadi error dalam kebijakan, kontrol akan dialihkan ke status error. Setelah berada dalam status error, Anda tidak dapat mengembalikan kontrol ke pipeline normal dan Anda biasanya menampilkan beberapa bentuk pesan error ke aplikasi pemanggil.

Namun, jika Anda menetapkan elemen continueOnError ke true untuk suatu kebijakan, kontrol akan tetap berada dalam alur saat ini dan kebijakan berikutnya dalam pipeline akan dijalankan setelah kebijakan yang menyebabkan error. Keuntungan dalam menangani error dalam alur saat ini adalah Anda mungkin memiliki cara untuk pulih dari error guna menyelesaikan pemrosesan permintaan.

Di bawah ini adalah kebijakan VerifyAPIKey bernama verify-api-key dengan elemen continueOnError yang 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 pemrosesan akan berlanjut dalam alur saat ini.

Anda kemudian menambahkan kebijakan VerifyAPIKey sebagai langkah dalam PreFlow dari 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 berikutnya dalam PreFlow menggunakan kondisi untuk menguji keberadaan error. Jika terjadi error dalam kebijakan VerifyAPIKey, kebijakan yang bernama kebijakan FaultInFlow akan dijalankan. Jika tidak, kebijakan FaultInFlow akan dilewati. Kebijakan FaultInFlow dapat melakukan banyak hal, seperti mencatat log error, mencoba memperbaiki error, atau melakukan beberapa tindakan lainnya.

Memicu error menggunakan kebijakan RaiseFault

Anda dapat menggunakan kebijakan RaiseFault kapan saja dalam alur untuk memicu error. Saat dijalankan, kebijakan RaiseFault akan menghentikan flow saat ini dan mentransfer kontrol ke status error.

Salah satu kegunaan kebijakan RaiseFault adalah untuk menguji kondisi tertentu yang mungkin tidak terdeteksi oleh kebijakan lain. 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 transfer ke status error. Atau, Anda dapat memasukkan kebijakan RaiseFault dalam alur untuk men-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 tersebut menguji kesalahan yang bernama RaiseFault. Kebijakan RaiseFault selalu menetapkan nilai fault.name ke RaiseFault. Anda juga dapat menetapkan variabel kustom dalam kebijakan RaiseFault. Jika melakukannya, Anda dapat menguji variabel tersebut dalam elemen Condition.

Penanganan khusus kode error HTTP dari server target

Contoh yang ditampilkan di bagian sebelumnya berlaku untuk error yang dibuat oleh kebijakan. Namun, Anda juga dapat membuat respons kustom untuk error di tingkat transpor, yang berarti error HTTP ditampilkan dari 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 kode respons HTTP dalam rentang 4xx-5xx sebagai kegagalan. Artinya, respons apa pun dari layanan backend dengan kode respons HTTP 4xx-5xx akan otomatis memanggil status error, yang kemudian menampilkan pesan error langsung ke 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 ingin 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 sukses, bersama dengan kode HTTP default. Dengan memperlakukan kode tersebut sebagai berhasil, TargetEndpoint akan mengambil alih pemrosesan pesan respons, bukan 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 dapat dilihat dalam contoh ini, Anda dapat menggunakan karakter pengganti untuk menetapkan properti success.codes ke rentang nilai.

Menetapkan properti success.codes akan menimpa nilai default. Oleh karena itu, jika Anda ingin menambahkan kode HTTP 400 ke daftar kode sukses default, 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>

Kini Anda dapat menentukan pengendali kustom untuk kode respons HTTP 400 dan 500 guna menampilkan pesan respons yang disesuaikan ke aplikasi yang meminta. TargetEndpoint berikut menggunakan kebijakan bernama ReturnError untuk menangani kode respons HTTP 400 dan 500:

<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 kesalahan

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, NotFound Kode error HTTP 5xx, 4xx
Kegagalan perutean NoRoutesMatched Gagal memilih TargetEndpoint bernama untuk permintaan
Kegagalan klasifikasi NotFound Kegagalan yang disebabkan oleh URI permintaan yang tidak cocok dengan BasePath mana pun untuk konfigurasi ProxyEndpoint apa pun (yaitu, tidak ada proxy API yang cocok dengan URL dalam permintaan aplikasi klien)
Transpor Error tingkat transport HTTP
Konektivitas ConnectionRefused, ConnectionReset, ConnectionTimeout Kegagalan terjadi saat membuat koneksi tingkat transport atau jaringan
Meminta 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 habis, error TLS/SSL, dan potongan error
Sistem Error runtime yang tidak ditentukan
Memori OutOfMemory, GCOverLimit Kegagalan terkait memori
Rangkaian pesan RogueTaskTerminated Kegagalan seperti penghentian tugas run-away
Kebijakan Kesalahan untuk setiap jenis kebijakan didefinisikan dalam Referensi kebijakan.

Error selalu disertai dengan deskripsi teks tentang alasan kegagalan. Saat sistem melakukan kesalahan, serangkaian atribut akan diisi untuk membantu pemecahan masalah. Kesalahan mencakup informasi berikut:

  • Alasan
  • Atribut khusus buatan pengguna