Anda sedang melihat dokumentasi Apigee Edge.
Buka
Dokumentasi Apigee X. info
Gejala
Aplikasi klien mendapatkan kode status HTTP 400 Bad Request
dengan kode error
messaging.adaptors.http.flow.DecompressionFailureAtRequest
sebagai respons terhadap API
panggilan telepon.
Pesan error
Aplikasi klien mendapatkan kode respons berikut:
HTTP/1.1 400 Bad Request
Selain itu, Anda mungkin melihat pesan error yang mirip dengan yang ditampilkan di bawah ini:
{ "fault":{ "faultstring":"Decompression failure at request", "detail":{ "errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtRequest" } } }
Kemungkinan penyebab
Error ini hanya terjadi jika:
- Encoding yang ditentukan dalam header permintaan HTTP
Content-Encoding
valid dan didukung oleh Apigee Edge, - Format payload yang dikirim oleh klien sebagai bagian dari permintaan HTTP tidak
cocok dengan format encoding yang ditentukan di header
Content-Encoding
TETAPI
Hal ini karena Apigee Edge gagal mendekode payload menggunakan encoding yang ditentukan karena
format payload tidak dalam format yang sama dengan encoding yang ditentukan dalam
Header Content-Encoding
.
Berikut adalah beberapa contoh nilai Content-Encoding
yang didukung dan cara Apigee Edge
mengharapkan format payload dalam kasus tersebut:
Skenario | Content-Encoding | Format Payload yang Diharapkan |
---|---|---|
Encoding Tunggal | gzip | Format Lihat Format GZIP RFC1952. |
Encoding Tunggal | mengempiskan | Format ini menggunakan struktur |
Beberapa Encoding | Beberapa Encoding Misalnya, jika encoding dilakukan dua kali, hal ini bisa berupa:
|
Beberapa encoding diterapkan ke payload dalam urutan tertentu seperti yang muncul di header. |
Kemungkinan penyebab error ini adalah sebagai berikut:
Penyebab | Deskripsi | Petunjuk pemecahan masalah berlaku untuk |
---|---|---|
Format payload permintaan tidak cocok dengan encoding yang ditentukan di header Content-Encoding | Format payload permintaan yang dikirim oleh klien tidak dienkode atau tidak
cocok dengan encoding yang ditentukan dalam header Content-Encoding . |
Pengguna Edge Public dan Private Cloud |
Langkah-langkah diagnosis umum
Gunakan salah satu alat/teknik berikut untuk mendiagnosis error ini:
Pemantauan API
Untuk mendiagnosis error menggunakan Pemantauan API:
- Login ke UI Apigee Edge sebagai pengguna dengan peran yang sesuai.
Beralihlah ke organisasi tempat Anda ingin menyelidiki masalah tersebut.
- Buka Analyze > Pemantauan API > Investigasi.
- Pilih jangka waktu tertentu saat Anda melihat error.
- Pastikan filter Proxy disetel ke Semua.
- Gambarkan Kode Kesalahan terhadap Waktu.
Pilih sel yang memiliki kode kesalahan
messaging.adaptors.http.flow.DecompressionFailureAtRequest
sebagai yang ditampilkan di bawah ini:Informasi tentang kode kesalahan
messaging.adaptors.http.flow.DecompressionFailureAtRequest
ditampilkan seperti yang ditunjukkan di bawah ini:Klik View logs dan luaskan baris yang gagal dengan error
400
.- Dari jendela Logs, perhatikan detail berikut:
- Kode Status:
400
- Sumber Kesalahan:
proxy
- Kode Kesalahan:
messaging.adaptors.http.flow.DecompressionFailureAtRequest
.
- Kode Status:
- Jika Fault Source memiliki nilai
proxy
, hal ini menunjukkan format payload permintaan tidak cocok dengan encoding yang didukung yang ditentukan dalam headerContent-Encoding
.
Alat rekaman aktivitas
Untuk mendiagnosis error menggunakan alat Trace:
- Mengaktifkan sesi rekaman aktivitas
dan:
- Tunggu hingga error
400 Bad Request
terjadi, atau - Jika Anda dapat mereproduksi masalah, lakukan panggilan API dan rekonstruksi
400 Bad Request
.
- Tunggu hingga error
Pastikan Tampilkan semua FlowInfos diaktifkan:
- Pilih salah satu permintaan yang gagal dan periksa rekaman aktivitasnya.
- Menavigasi melalui berbagai fase pelacakan dan menemukan letak kegagalan terjadi.
Anda biasanya akan menemukan kesalahan dalam alur tepat setelah Permintaan Diterima dari Klien seperti yang ditunjukkan di bawah ini:
-
Perhatikan nilai properti dari rekaman aktivitas:
- error:
Decompression failure at request
- error.class:
com.apigee.rest.framework.BadRequestException
- error.cause:
Not in GZIP format
error.cause menyatakan bahwa payload permintaan TIDAK dalam format GZIP. Ini berarti bahwa Apigee Edge mengharapkan payload permintaan dalam format GZIP seperti yang akan ditentukan dalam header
Content-Encoding
. - error:
Tentukan nilai header permintaan
Content-Encoding
. Untuk itu, buka fase Permintaan Diterima dari Klien seperti yang ditunjukkan di bawah ini:( lihat gambar yang lebih besar)
Perhatikan bahwa nilai header permintaan
Content-Encoding
memanggzip
.Rekaman aktivitas contoh di atas menunjukkan bahwa encoding ditentukan dalam header permintaan
Content-Encoding
adalahgzip
; Namun, payload permintaan tidak dalam format GZIP. Oleh karena itu, Apigee tidak dapat mendekompresi payload menggunakan gzip dan menampilkan errorDecompression failure at request
.- Catat kode status dan pesan error yang ditampilkan oleh Apigee Edge dengan menavigasi
ke fase Response Sent to Client dalam rekaman aktivitas seperti yang ditunjukkan di bawah ini:
( lihat gambar yang lebih besar)
Perhatikan detail berikut dari rekaman aktivitas:
- Kode status:
400 Bad Request
. - Konten Error:
{"fault":{"faultstring":"Decompression failure at request","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtRequest"}}}
- Kode status:
Buka fase AX (Data Analytics Direkam) di rekaman aktivitas lalu klik tombol tersebut.
- Scroll ke bawah ke bagian Detail Fase, Header Error, dan tentukan nilai X-Apigee-fault-code dan X-Apigee-fault-source sebagaimana ditunjukkan di bawah ini:
- Anda akan melihat nilai X-Apigee-fault-code dan X-Apigee-fault-source
sebagai
messaging.adaptors.http.flow.DecompressionFailureAtRequest
danpolicy
, yang menunjukkan bahwa format payload permintaan tidak cocok dengan encoding yang ditentukan dalam headerContent-Encoding
.Header respons Nilai X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtRequest
X-Apigee-fault-source policy
NGINX
Untuk mendiagnosis error menggunakan log akses NGINX:
- Jika Anda adalah pengguna Private Cloud, Anda dapat menggunakan log akses NGINX untuk
menentukan informasi penting tentang error
400
HTTP. Periksa log akses NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
Di mana: ORG, ENV, dan PORT# diganti dengan nilai sebenarnya.
- Telusuri untuk mengetahui apakah terdapat error
400
selama durasi tertentu atau tidak (jika masalah terjadi di masa lalu) atau jika ada permintaan yang masih gagal dengan400
. Jika Anda menemukan error
400
dengan X-Apigee-fault-code cocok dengan nilaimessaging.adaptors.http.flow.DecompressionFailureAtRequest
, lalu tentukan nilai X-Apigee-fault-source.Contoh error 400 dari log akses NGINX:
Contoh entri di atas dari log akses NGINX memiliki nilai berikut untuk X-Apigee-fault-code dan X-Apigee-fault-source:
Header respons Nilai X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtRequest
X-Apigee-fault-source policy
Penyebab: Format payload permintaan tidak cocok dengan encoding yang ditentukan di header Content-Encoding
Secara default, Apigee Edge selalu mendekompresi payload jika header permintaan
Content-Encoding
berisi valid dan
encoding yang didukung. Oleh karena itu, format payload permintaan diharapkan
harus cocok dengan encoding yang ditentukan dalam header permintaan Content-Encoding
.
Jika ada ketidakcocokan, Anda akan mendapatkan error ini.
Diagnosis
- Tentukan Kode Kesalahan dan Sumber Kesalahan untuk error yang diamati menggunakan API Log akses Monitoring, alat Trace, atau NGINX seperti yang dijelaskan dalam Langkah-langkah diagnosis umum.
- Jika Kode Kesalahan tersebut adalah
messaging.adaptors.http.flow.DecompressionFailureAtRequest
dan Sumber Kesalahan memiliki nilaipolicy
atauproxy
, maka menunjukkan bahwa permintaan yang dikirim oleh aplikasi klien memiliki {i>payload<i} yang tidak cocok dengan encoding yang didukung yang ditentukan dalam header permintaanContent-Encoding
. Anda dapat menentukan ketidakcocokan sebagai bagian dari permintaan HTTP dengan menggunakan salah satu metode:
Pesan error
Untuk memvalidasi menggunakan pesan error:
-
Jika Anda memiliki akses ke pesan error lengkap yang diterima dari Apigee Edge, lihat
faultstring
.Contoh pesan error:
"faultstring":"Decompression failure at request"
- Dalam pesan {i>error<i} di atas,
"Decompression failure at request"
yang menyiratkan bahwa permintaan tidak dapat didekompresi menggunakan encoding yang ditentukan dalam HeaderContent-Encoding
.
Trace
Untuk memvalidasi menggunakan Trace:
- Tentukan nilai header permintaan Content-Encoding dan atribut properti error.cause menggunakan Trace seperti yang dijelaskan dalam Langkah-langkah diagnosis umum.
Nilai dari trace contoh adalah sebagai berikut:
- Encoding Konten:
gzip
- error.cause:
Not in GZIP format
Nilai di header permintaan Content-Encoding adalah gzip; tetapi, payload permintaan tidak dalam format GZIP (seperti yang ditunjukkan oleh error.cause). Oleh karena itu, Apigee Edge merespons dengan
400 Bad Request
dan kode errormessaging.adaptors.http.flow.DecompressionFailureAtRequest
.- Encoding Konten:
Permintaan sebenarnya
Untuk memvalidasi menggunakan permintaan yang sebenarnya:
Jika Anda memiliki akses ke permintaan sebenarnya yang dibuat oleh klien aplikasi, lalu lakukan langkah-langkah berikut:
- Tentukan nilai yang diteruskan ke header permintaan
Content-Encoding
. - Tentukan format payload yang dikirim sebagai bagian dari permintaan.
Jika nilai header
Content-Encoding
ada dalam daftar encoding yang didukung, tetapi format payload permintaan tidak cocok dengan encoding yang ditentukan dalam headerContent-Encoding
, maka itulah yang menjadi penyebab masalah.Contoh permintaan:
curl -v "http://HOSTALIAS/v1/testgzip"
-H "Content-Encoding: gzip"
-X POST -d @request_payload.zipContoh permintaan di atas mengirimkan nilai
gzip
ke HeaderContent-Encoding
yang merupakan encoding yang didukung di Apigee Edge. Namun, payload permintaanrequest_payload.zip
dalam format ZIP. Oleh karena itu, permintaan ini gagal dengan kode status400 Bad Request
dan kode error:messaging.adaptors.http.flow.DecompressionFailureAtRequest
.
Log Pemroses Pesan
Untuk memvalidasi menggunakan log Pemroses Pesan:
Jika Anda adalah pengguna Private Cloud, Anda dapat menggunakan log Pemroses Pesan untuk menentukan informasi penting tentang error
400
HTTP.- Tentukan ID pesan dari permintaan yang gagal menggunakan Pemantauan API, Alat Trace, atau log akses NGINX seperti yang dijelaskan dalam Langkah-langkah diagnosis umum.
Telusuri ID pesan di log Pemroses Pesan:
/opt/apigee/var/log/edge-message-processor/logs/system.log
Anda akan melihat salah satu pengecualian berikut:
Skenario #1
Skenario #1: Jika permintaan API memiliki header Content-Encoding: gzip
2021-07-28 10:21:16,861 NIOThread@0 ERROR HTTP.SERVER - HTTPServer$Context.onInputException() : Message id:rt-57-1 SSLClientChannel[Accepted: Remote:192.168.199.8:8443 Local:192.168.80.234:44284]@28469 useCount=1 bytesRead=0 bytesWritten=28764 age=2739893ms lastIO=0ms isOpen=true.onExceptionRead exception: {} java.util.zip.ZipException: Not in GZIP format 2021-07-28 10:21:16,862 NIOThread@0 ERROR ADAPTORS.HTTP.FLOW - AbstractRequestListener.onException() : Request:POST, uri:/test, message Id:rt-57-1, exception:java.util.zip.ZipException: Not in GZIP format, context:Context@71ea5ac input=ClientInputChannel(SSLClientChannel[Accepted: Remote:192.168.199.8:8443 Local:192.168.80.234:44284]@28469 useCount=1 bytesRead=0 bytesWritten=28764 age=2739894ms lastIO=0ms isOpen=true) 2021-07-28 10:21:16,862 NIOThread@0 INFO HTTP.SERVICE - ExceptionHandler.handleException() : Exception
java.util.zip.ZipException: Not in GZIP format
occurred while writing to channel null 2021-07-28 10:21:16,863 NIOThread@0 INFO HTTP.SERVICE - ExceptionHandler.handleException() : Exception trace: java.util.zip.ZipException: Not in GZIP formatBaris
java.util.zip.ZipException: Not in GZIP format
dalam pesan error di atas menunjukkan bahwa permintaan payload tidak dikirim dalam format GZIP meskipunContent-Encoding
ditetapkan sebagai gzip. Oleh karena itu, Apigee Edge menampilkan pengecualian dan menampilkan kode status400
dengan kode kesalahanmessaging.adaptors.http.flow.DecompressionFailureAtRequest
pada aplikasi klien.Skenario #2
Skenario #2: Saat permintaan API memiliki header Content-Encoding: deflate
2021-07-28 15:26:31,893 NIOThread@1 ERROR HTTP.SERVER - HTTPServer$Context.onInputException() : Message id:rt-47875-1 SSLClientChannel[Accepted: Remote:192.168.199.8:8443 Local:192.168.81.72:45954]@29276 useCount=1 bytesRead=0 bytesWritten=37230 age=3498856ms lastIO=1ms isOpen=true.onExceptionRead exception: {}
java.util.zip.ZipException: incorrect header check
….Caused by: java.util.zip.DataFormatException: incorrect header check
.. 2021-07-28 15:26:31,894 NIOThread@1 ERROR ADAPTORS.HTTP.FLOW - AbstractRequestListener.onException() : Request:POST, uri:/test, message Id:rrt-47875-1, exception:java.util.zip.ZipException: incorrect header check, context:Context@69b3ac45 input=ClientInputChannel(SSLClientChannel[Accepted: Remote:192.168.199.8:8443 Local:192.168.81.72:45954]@29276 useCount=1 byt esRead=0 bytesWritten=37230 age=3498856ms lastIO=1ms isOpen=true)Garis
java.util.zip.ZipException: incorrect header check
danCaused by: java.util.zip.DataFormatException: incorrect header check
dalam pesan error di atas menunjukkan bahwa payload permintaan tidak dikirim dalam dan tidak cocok dengan encoding yang ditentukan dalam HeaderContent-Encoding
dari deflate. Oleh karena itu, Apigee Edge menampilkan pengecualian dan menampilkan kode status400
dengan kode kesalahanmessaging.adaptors.http.flow.DecompressionFailureAtRequest
pada aplikasi klien.
-
Resolusi
- Jika payload permintaan terkompresi tidak diperlukan dalam alur proxy API di Apigee Edge
dan di server backend, jangan teruskan header
Content-Encoding
. Jika payload permintaan perlu dikompresi, lanjutkan ke langkah 2. - Pastikan aplikasi klien selalu mengirimkan hal berikut:
- Salah satu
encoding yang didukung sebagai nilai untuk header
Content-Encoding
di minta - Payload permintaan dalam format yang didukung ke Apigee Edge cocok dengan encoding
format yang ditentukan di header
Content-Encoding
- Salah satu
encoding yang didukung sebagai nilai untuk header
- Pada contoh yang dibahas di atas, payload permintaan memiliki format ZIP tetapi header permintaan
menentukan
Content-Encoding: gzip
. Anda dapat memperbaiki masalah ini dengan mengirim permintaan header sebagaiContent-Encoding: gzip
dan payload permintaan juga digzip
format:curl -v "https://HOSTALIAS/v1/testgzip" -H "Content-Encoding: gzip" -X POST -d @request_payload.gz
Spesifikasi
Apigee Edge merespons dengan kode status 400 Bad Request
dengan kode error
messaging.adaptors.http.flow.DecompressionFailureAtRequest
sesuai dengan RFC berikut
spesifikasi:
Spesifikasi |
---|
RFC 7231, bagian 6.5.1 |
RFC 7231, bagian 3.1.2.2 |
Jika Anda masih memerlukan bantuan dari Dukungan Apigee, buka Harus mengumpulkan informasi diagnostik.
Harus mengumpulkan informasi diagnostik
Kumpulkan informasi diagnostik berikut, lalu hubungi Dukungan Apigee Edge:
Jika Anda adalah pengguna Cloud Publik, berikan informasi berikut:
- Nama organisasi
- Nama lingkungan
- Nama Proxy API
- Menyelesaikan perintah
curl
yang digunakan untuk mereproduksi error400
- File rekaman aktivitas untuk permintaan API
Jika Anda adalah pengguna Private Cloud, berikan informasi berikut:
- Pesan error lengkap yang diamati untuk permintaan yang gagal
- Nama lingkungan
- Paket Proxy API
- File rekaman aktivitas untuk permintaan API
Log akses NGINX
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
Di mana: ORG, ENV, dan PORT# diganti dengan nilai aktual.
- Log sistem Pemroses Pesan
/opt/apigee/var/log/edge-message-processor/logs/system.log