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 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 pada 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 bagaimana 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 | mengempis | Format ini menggunakan struktur |
Beberapa Encoding | Beberapa Encoding Misalnya, jika encoding dilakukan dua kali, hal ini 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 sesuai dengan encoding yang ditentukan pada header Content-Encoding . |
Pengguna Edge Publik dan Private Cloud |
Langkah-langkah diagnosis umum
Gunakan salah satu alat/teknik berikut untuk mendiagnosis error ini:
Pemantauan API
Untuk mendiagnosis error menggunakan API Monitoring:
- Login ke UI Apigee Edge sebagai pengguna dengan peran yang sesuai.
Beralihlah ke organisasi tempat Anda ingin menyelidiki masalah.
- Buka halaman Analyze > API Monitoring > Menyelidiki.
- Pilih jangka waktu spesifik saat Anda melihat error.
- Pastikan filter Proxy disetel ke Semua.
- Tempatkan Kode Kesalahan terhadap Waktu.
Pilih sel yang memiliki kode kesalahan
messaging.adaptors.http.flow.DecompressionFailureAtRequest
seperti yang ditunjukkan 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 itu menunjukkan bahwa format payload permintaan tidak sesuai dengan encoding yang didukung yang ditentukan dalam headerContent-Encoding
.
Alat pelacak
Untuk mendiagnosis error menggunakan alat Trace:
- Aktifkan sesi perekaman aktivitas
dan:
- Tunggu hingga error
400 Bad Request
terjadi, atau - Jika Anda dapat merekonstruksi masalah, lakukan panggilan API dan reproduksi
400 Bad Request
.
- Tunggu hingga error
Pastikan Show all FlowInfos diaktifkan:
- Pilih salah satu permintaan yang gagal dan periksa rekaman aktivitas.
- Jelajahi berbagai fase rekaman aktivitas dan temukan lokasi terjadinya kegagalan.
Biasanya Anda akan menemukan error dalam alur tepat setelah fase Request Received from Client seperti yang ditunjukkan di bawah ini:
-
Catat 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 karena telah ditentukan dalam header
Content-Encoding
. - error:
Tentukan nilai header permintaan
Content-Encoding
. Untuk melakukannya, buka fase Request Received from Client seperti yang ditunjukkan di bawah ini:( lihat gambar yang lebih besar)
Perhatikan bahwa nilai header permintaan
Content-Encoding
memanggzip
.Contoh rekaman aktivitas di atas menunjukkan bahwa encoding yang 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
.- Perhatikan kode status dan pesan error yang ditampilkan oleh Apigee Edge dengan menavigasi
ke fase Response Sent to Client dalam pelacakan 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 Dicatat) dalam rekaman aktivitas tersebut, lalu klik.
- Scroll ke bawah ke bagian Phase Details, Error Headers, lalu tentukan nilai X-Apigee-fault-code dan X-Apigee-fault-source seperti yang 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 utama tentang error
400
HTTP. Periksa log akses NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
Tempat: ORG, ENV, dan PORT# diganti dengan nilai sebenarnya.
- Telusuri untuk melihat apakah ada error
400
selama durasi tertentu (jika masalah terjadi di masa lalu) atau apakah ada permintaan yang masih gagal dengan400
. Jika Anda menemukan error
400
dengan X-Apigee-fault-code yang cocok dengan nilaimessaging.adaptors.http.flow.DecompressionFailureAtRequest
, maka 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
encoding yang valid dan didukung. Oleh karena itu, format payload permintaan
harus sesuai 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 Pemantauan API, Alat Pelacakan, atau log akses NGINX seperti yang dijelaskan dalam Langkah-langkah diagnosis umum.
- Jika Fault Code adalah
messaging.adaptors.http.flow.DecompressionFailureAtRequest
dan Fault Source memiliki nilaipolicy
atauproxy
, hal ini menunjukkan bahwa permintaan yang dikirim oleh aplikasi klien memiliki payload yang tidak sesuai dengan encoding yang didukung yang ditentukan dalam header permintaanContent-Encoding
. Anda dapat menentukan ketidakcocokan ini 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, lihat
faultstring
.Contoh pesan error:
"faultstring":"Decompression failure at request"
- Dalam pesan error di atas, kode menampilkan
"Decompression failure at request"
yang menyiratkan bahwa permintaan tidak dapat didekompresi menggunakan encoding yang ditentukan dalam headerContent-Encoding
.
Rekaman aktivitas
Untuk melakukan validasi 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:
- Encoding Konten:
gzip
- error.cause:
Not in GZIP format
Nilai dalam 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 Request
dan kode errormessaging.adaptors.http.flow.DecompressionFailureAtRequest
.- Encoding Konten:
Permintaan sebenarnya
Untuk memvalidasi menggunakan permintaan yang sebenarnya:
Jika Anda memiliki akses ke permintaan aktual 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-Encoding
ada dalam daftar encoding yang didukung tetapi format payload permintaan tidak sesuai dengan encoding yang ditentukan dalam headerContent-Encoding
, maka itulah 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 Pelacakan, 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.log
Anda 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() : 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
pada pesan error di atas menunjukkan bahwa payload permintaan 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
ke 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 check
danCaused by: java.util.zip.DataFormatException: incorrect header check
pada pesan error di atas menunjukkan bahwa payload permintaan tidak dikirim dalam format deflate dan tidak sesuai dengan encoding yang ditentukan dalam header deflateContent-Encoding
. Oleh karena itu, Apigee Edge akan menampilkan pengecualian dan menampilkan kode status400
dengan kode kesalahanmessaging.adaptors.http.flow.DecompressionFailureAtRequest
ke 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 mengirim hal berikut:
- Salah satu
encoding yang didukung sebagai nilai untuk header
Content-Encoding
dalam permintaan - Payload permintaan dalam format yang didukung ke Apigee Edge cocok dengan format encoding
yang ditentukan dalam 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: gzip
dan 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 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 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
- Selesaikan 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
Tempat: ORG, ENV, dan PORT# diganti dengan nilai sebenarnya.
- Log sistem Pemroses Pesan
/opt/apigee/var/log/edge-message-processor/logs/system.log