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 panggilan
API.
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 ditunjukkan 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 di header permintaan HTTP
Content-Encodingvalid 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 sama dengan format encoding yang ditentukan di header
Content-Encoding.
Berikut 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 RFC1952 GZIP Format. |
| Encoding Tunggal | mengempiskan | Format ini menggunakan struktur |
| Encoding Ganda | Encoding Ganda Misalnya, dalam kasus ketika encoding dilakukan dua kali, hasilnya dapat 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 yang 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 di 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.
Beralih ke organisasi tempat Anda ingin menyelidiki masalah.
- Buka halaman Analyze > API Monitoring > Investigate.
- Pilih jangka waktu tertentu saat Anda mengamati error.
- Pastikan filter Proxy disetel ke Semua.
- Petakan Kode Kesalahan terhadap Waktu.
Pilih sel yang memiliki kode kesalahan
messaging.adaptors.http.flow.DecompressionFailureAtRequestseperti yang ditunjukkan di bawah:( lihat gambar yang lebih besar)
Informasi tentang kode kesalahan
messaging.adaptors.http.flow.DecompressionFailureAtRequestditampilkan seperti yang ditunjukkan di bawah:( lihat gambar yang lebih besar)
Klik Lihat log dan luaskan baris yang gagal dengan error
400.( lihat gambar yang lebih besar)
- Dari jendela Logs, catat detail berikut:
- Kode Status:
400 - Sumber Kesalahan:
proxy - Kode Kesalahan:
messaging.adaptors.http.flow.DecompressionFailureAtRequest.
- Kode Status:
- Jika Fault Source memiliki nilai
proxy, hal itu menunjukkan bahwa format payload permintaan tidak cocok dengan encoding yang didukung yang ditentukan di headerContent-Encoding.
Alat rekaman aktivitas
Untuk mendiagnosis error menggunakan alat Trace:
- Aktifkan sesi rekaman aktivitas
dan salah satu dari:
- Tunggu hingga terjadi error
400 Bad Request, atau - Jika Anda dapat mereproduksi masalah, lakukan panggilan API dan reproduksi
400 Bad Request.
- Tunggu hingga terjadi error
Pastikan Show all FlowInfos diaktifkan:
- Pilih salah satu permintaan yang gagal dan periksa rekaman aktivitas.
- Telusuri berbagai fase rekaman aktivitas dan temukan tempat terjadinya kegagalan.
Biasanya, Anda akan menemukan error dalam alur tepat setelah fase Permintaan Diterima dari Klien seperti yang ditunjukkan di bawah:
( lihat gambar yang lebih besar)
-
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. Artinya, Apigee Edge mengharapkan payload permintaan dalam format GZIP seperti yang akan ditentukan di header
Content-Encoding. - error:
Tentukan nilai header permintaan
Content-Encoding. Untuk melakukannya, buka fase Permintaan Diterima dari Klien seperti yang ditunjukkan di bawah:( lihat gambar yang lebih besar)
Perhatikan bahwa nilai header permintaan
Content-Encodingmemanggzip.Rekaman aktivitas contoh di atas menunjukkan bahwa encoding yang ditentukan di header permintaan
Content-Encodingadalahgzip; namun, payload permintaan tidak dalam format GZIP. Oleh karena itu, Apigee tidak dapat mendekompresi payload menggunakan gzip dan menampilkan errorDecompression failure at request.- Perhatikan kode status dan pesan error yang ditampilkan oleh Apigee Edge dengan membuka
ke fase Respons Dikirim ke Klien dalam rekaman aktivitas seperti yang ditunjukkan di bawah:
( 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) dalam rekaman aktivitas lalu klik.
- Scroll ke bawah ke bagian Phase Details, Error Headers, dan
tentukan nilai X-Apigee-fault-code dan X-Apigee-fault-source
seperti yang ditunjukkan di bawah:
( lihat gambar yang lebih besar)
- Anda akan melihat nilai X-Apigee-fault-code dan X-Apigee-fault-source
sebagai
messaging.adaptors.http.flow.DecompressionFailureAtRequestdanpolicy, yang menunjukkan bahwa format payload permintaan tidak cocok dengan encoding yang ditentukan di headerContent-Encoding.Header respons Nilai X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtRequestX-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 utama tentang error HTTP
400. Periksa log akses NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logKeterangan: ORG, ENV, dan PORT# diganti dengan nilai sebenarnya.
- Cari untuk melihat apakah ada error
400selama durasi tertentu (jika masalah terjadi di masa lalu) atau apakah ada permintaan yang masih gagal dengan400. Jika Anda menemukan error
400dengan X-Apigee-fault-code yang cocok dengan nilaimessaging.adaptors.http.flow.DecompressionFailureAtRequest, tentukan nilai X-Apigee-fault-source.Contoh error 400 dari log akses NGINX:
Entri contoh 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.DecompressionFailureAtRequestX-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 encoding yang valid dan
didukung. Oleh karena itu, format payload permintaan
diharapkan cocok dengan encoding yang ditentukan di header permintaan Content-Encoding.
Jika ada ketidakcocokan, Anda akan mendapatkan error ini.
Diagnosis
- Tentukan Kode Kesalahan dan Sumber Kesalahan untuk error yang diamati menggunakan Pemantauan API, alat Trace, atau log akses NGINX seperti yang dijelaskan dalam Langkah-langkah diagnosis umum.
- Jika Kode Error adalah
messaging.adaptors.http.flow.DecompressionFailureAtRequestdan Sumber Error memiliki nilaipolicyatauproxy, maka hal ini menunjukkan bahwa permintaan yang dikirim oleh aplikasi klien memiliki payload yang tidak cocok dengan encoding yang didukung yang ditentukan di header permintaanContent-Encoding. Anda dapat menentukan ketidakcocokan sebagai bagian dari permintaan HTTP menggunakan salah satu metode berikut:
Pesan error
Untuk memvalidasi menggunakan pesan error:
-
Jika Anda memiliki akses ke pesan error lengkap yang diterima dari Apigee Edge, maka lihat
faultstring.Contoh pesan error:
"faultstring":"Decompression failure at request"
- Dalam pesan error di atas, ditampilkan
"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 properti error.cause menggunakan Trace seperti yang dijelaskan dalam Langkah-langkah diagnosis umum.
Nilai dari rekaman aktivitas sampel adalah sebagai berikut:
- Content-Encoding:
gzip - error.cause:
Not in GZIP format
Nilai di header permintaan Content-Encoding adalah gzip; namun, payload permintaan tidak dalam format GZIP (seperti yang ditunjukkan oleh error.cause). Oleh karena itu, Apigee Edge merespons dengan
400 Bad Requestdan kode errormessaging.adaptors.http.flow.DecompressionFailureAtRequest.- Content-Encoding:
Permintaan sebenarnya
Untuk memvalidasi menggunakan permintaan sebenarnya:
Jika Anda memiliki akses ke permintaan sebenarnya yang dibuat oleh aplikasi klien, 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-Encodingada dalam daftar encoding yang didukung, tetapi format payload permintaan tidak cocok dengan encoding yang ditentukan di headerContent-Encoding, maka itulah penyebab masalahnya.Contoh permintaan:
curl -v "http://HOSTALIAS/v1/testgzip"
-H "Content-Encoding: gzip"-X POST -d @request_payload.zipContoh permintaan di atas mengirimkan nilai
gzipke headerContent-Encodingyang merupakan encoding yang didukung di Apigee Edge. Namun, payload permintaanrequest_payload.zipdalam format ZIP. Oleh karena itu, permintaan ini gagal dengan kode status400 Bad Requestdan kode error:messaging.adaptors.http.flow.DecompressionFailureAtRequest.
Log Message Processor
Untuk memvalidasi menggunakan log Message Processor:
Jika Anda adalah pengguna Private Cloud, Anda dapat menggunakan log Message Processor untuk menentukan informasi utama tentang error HTTP
400.- Tentukan ID pesan 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 Message Processor:
/opt/apigee/var/log/edge-message-processor/logs/system.logAnda akan melihat salah satu pengecualian berikut:
Skenario #1
Skenario #1: Saat 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() : Exceptionjava.util.zip.ZipException: Not in GZIP formatoccurred 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 formatdalam pesan error di atas menunjukkan bahwa payload permintaan tidak dikirim dalam format GZIP meskipunContent-Encodingditentukan sebagai gzip. Oleh karena itu, Apigee Edge akan memunculkan pengecualian dan menampilkan kode status400dengan kode kesalahanmessaging.adaptors.http.flow.DecompressionFailureAtRequestke 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)Baris
java.util.zip.ZipException: incorrect header checkdanCaused by: java.util.zip.DataFormatException: incorrect header checkdalam pesan error di atas menunjukkan bahwa payload permintaan tidak dikirim dalam format deflate dan tidak cocok dengan encoding yang ditentukan dalam headerContent-Encodingdeflate. Oleh karena itu, Apigee Edge akan memunculkan pengecualian dan menampilkan kode status400dengan kode kesalahanmessaging.adaptors.http.flow.DecompressionFailureAtRequestke aplikasi klien.
-
Resolusi
- Jika tidak ada kebutuhan untuk payload permintaan terkompresi dalam alur proxy API di Apigee Edge
dan di server backend, maka jangan teruskan header
Content-Encoding. Jika ada kebutuhan untuk mengompresi payload permintaan, lanjutkan ke langkah 2. - Pastikan aplikasi klien selalu mengirimkan hal berikut:
- Salah satu
encoding yang didukung sebagai nilai untuk header
Content-Encodingdalam permintaan - Payload permintaan dalam format yang didukung ke Apigee Edge cocok dengan format encoding yang ditentukan di header
Content-Encoding
- Salah satu
encoding yang didukung sebagai nilai untuk header
- Dalam contoh yang dibahas di atas, payload permintaan dalam format ZIP, tetapi header permintaan
menentukan
Content-Encoding: gzip. Anda dapat memperbaiki masalah ini dengan mengirimkan header permintaan sebagaiContent-Encoding: gzipdan payload permintaan juga dalam formatgzip: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 spesifikasi RFC
berikut:
| Spesifikasi |
|---|
| RFC 7231, bagian 6.5.1 |
| RFC 7231, bagian 3.1.2.2 |
Jika Anda masih memerlukan bantuan dari Dukungan Apigee, buka 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
- Perintah
curllengkap yang digunakan untuk memunculkan kembali 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_logTempat: ORG, ENV, dan PORT# diganti dengan nilai sebenarnya.
- Log sistem Message Processor
/opt/apigee/var/log/edge-message-processor/logs/system.log