شما در حال مشاهده مستندات Apigee Edge هستید.
به مستندات Apigee X مراجعه کنید . اطلاعات
علامت
برنامهی کلاینت، کد وضعیت HTTP با مقدار 400 Bad Request و کد خطای messaging.adaptors.http.flow.DecompressionFailureAtRequest را به عنوان پاسخی به فراخوانیهای API دریافت میکند.
پیام خطا
برنامهی کلاینت کد پاسخ زیر را دریافت میکند:
HTTP/1.1 400 Bad Request
علاوه بر این، ممکن است پیام خطایی مشابه آنچه در زیر نشان داده شده است را مشاهده کنید:
{
"fault":{
"faultstring":"Decompression failure at request",
"detail":{
"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtRequest"
}
}
}علل احتمالی
این خطا فقط در صورتی رخ میدهد که:
- کدگذاری مشخص شده در سربرگ درخواست HTTP،
Content-Encodingمعتبر است و توسط Apigee Edge پشتیبانی میشود . - قالب بار داده ارسالی توسط کلاینت به عنوان بخشی از درخواست HTTP با قالب کدگذاری مشخص شده در سربرگ
Content-Encodingمطابقت ندارد.
اما
دلیل این امر آن است که Apigee Edge نمیتواند payload را با استفاده از کدگذاری مشخصشده رمزگشایی کند، زیرا فرمت payload با کدگذاری مشخصشده در سربرگ Content-Encoding یکسان نیست.
در اینجا چند نمونه از مقادیر پشتیبانیشدهی Content-Encoding و نحوهی انتظار Apigee Edge از فرمت payload در این موارد آورده شده است:
| سناریو | کدگذاری محتوا | قالب بار مفید مورد انتظار |
|---|---|---|
| رمزگذاری تکی | gzip | فرمت به فرمت GZIP در RFC1952 مراجعه کنید. |
| رمزگذاری تکی | باد کردن | این فرمت از ساختار |
| رمزگذاری چندگانه | رمزگذاری چندگانه برای مثال، در مواردی که کدگذاری دو بار انجام میشود، میتواند به صورت زیر باشد:
| کدگذاری چندگانه به ترتیبی که در هدر نشان داده شده است، روی محموله اعمال میشود. |
علل احتمالی این خطا به شرح زیر است:
| علت | توضیحات | دستورالعملهای عیبیابی قابل اجرا برای |
|---|---|---|
| فرمت بار درخواست با کدگذاری مشخص شده در سربرگ Content-Encoding مطابقت ندارد. | قالب درخواست ارسالی توسط کلاینت یا کدگذاری نشده است یا با کدگذاری مشخص شده در سربرگ Content-Encoding مطابقت ندارد. | کاربران فضای ابری عمومی و خصوصی Edge |
مراحل تشخیص مشترک
برای تشخیص این خطا از یکی از ابزارها/تکنیکهای زیر استفاده کنید:
نظارت بر API
برای تشخیص خطا با استفاده از مانیتورینگ API:
- به عنوان کاربری با نقش کاربری مناسب، وارد Apigee Edge UI شوید .
به سازمانی که میخواهید مشکل را در آن بررسی کنید، مراجعه کنید.

- به صفحه Analyze > API Monitoring > Investigate بروید.
- بازه زمانی خاصی را که در آن خطاها را مشاهده کردهاید، انتخاب کنید.
- مطمئن شوید که فیلتر پروکسی روی «همه» تنظیم شده است.
- رسم کد خطا در مقابل زمان .
سلولی را انتخاب کنید که کد خطای
messaging.adaptors.http.flow.DecompressionFailureAtRequestدر آن قرار دارد، همانطور که در زیر نشان داده شده است:
اطلاعات مربوط به کد خطا
messaging.adaptors.http.flow.DecompressionFailureAtRequestمطابق شکل زیر نمایش داده میشود:
روی «مشاهده گزارشها» کلیک کنید و ردیفی را که با خطای
400مواجه شده است، باز کنید.
- از پنجره Logs ، جزئیات زیر را یادداشت کنید:
- کد وضعیت:
400 - منبع خطا:
proxy - کد خطا:
messaging.adaptors.http.flow.DecompressionFailureAtRequest.
- کد وضعیت:
- اگر منبع خطا مقدار
proxyداشته باشد، نشان میدهد که فرمت بار داده درخواست با کدگذاری پشتیبانیشده مشخصشده در سرآیندContent-Encodingمطابقت ندارد.
ابزار ردیابی
برای تشخیص خطا با استفاده از ابزار Trace:
- جلسه ردیابی را فعال کنید و یکی از موارد زیر را انجام دهید:
- منتظر بمانید تا خطای
400 Bad Requestرخ دهد، یا - اگر میتوانید مشکل را دوباره ایجاد کنید، فراخوانی API را انجام دهید و خطای
400 Bad Requestدوباره ایجاد کنید.
- منتظر بمانید تا خطای
مطمئن شوید که گزینهی Show all FlowInfos فعال است:

- یکی از درخواستهای ناموفق را انتخاب کنید و مسیر پیگیری را بررسی کنید.
- مراحل مختلف ردیابی را طی کنید و محل وقوع خرابی را پیدا کنید.
معمولاً خطا را در جریانی درست پس از مرحله درخواست دریافت شده از کلاینت، مطابق شکل زیر، مشاهده خواهید کرد:

به مقادیر ویژگیها از مسیر ردیابی توجه کنید:
- خطا:
Decompression failure at request - کلاس خطا :
com.apigee.rest.framework.BadRequestException - error.cause:
Not in GZIP format
error.cause بیان میکند که فایل درخواست با فرمت GZIP نیست. این بدان معناست که Apigee Edge انتظار داشته که فایل درخواست با فرمت GZIP باشد، همانطور که در هدر
Content-Encodingمشخص شده است.- خطا:
مقدار هدر درخواست
Content-Encodingرا تعیین کنید. برای این کار، مطابق شکل زیر به مرحله درخواست دریافت شده از کلاینت بروید:
توجه داشته باشید که مقدار هدر درخواست
Content-Encodingدر واقعgzipاست.ردیابی نمونه بالا نشان میدهد که کدگذاری مشخص شده در هدر درخواست
Content-Encoding،gzipاست؛ با این حال، فایل درخواست در قالب GZIP نیست. بنابراین، Apigee نمیتواند فایل را با استفاده از gzip از حالت فشرده خارج کند و خطایDecompression failure at requestرا برمیگرداند.- با پیمایش به کد وضعیت و پیام خطایی که توسط Apigee Edge برگردانده میشود، توجه کنید.
به مرحله پاسخ ارسال شده به کلاینت در ردیابی، همانطور که در زیر نشان داده شده است:

به جزئیات زیر از ردیابی توجه کنید:
- کد وضعیت:
400 Bad Request. - محتوای خطا:
{"fault":{"faultstring":"Decompression failure at request","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtRequest"}}}
- کد وضعیت:
در مسیر ردیابی، به مرحله AX (دادههای تحلیلی ثبتشده) بروید و روی آن کلیک کنید.
- به پایین صفحه و بخش Phase Details و Error Headers بروید و مقادیر X-Apigee-fault-code و X-Apigee-fault-source را مطابق شکل زیر تعیین کنید:

- مقادیر X-Apigee-fault-code و X-Apigee-fault-source را به صورت
messaging.adaptors.http.flow.DecompressionFailureAtRequestوpolicyمشاهده خواهید کرد که نشان میدهد فرمت بار داده درخواست با کدگذاری مشخص شده در سربرگContent-Encodingمطابقت ندارد.هدرهای پاسخ ارزش کد خطای X-Apigee messaging.adaptors.http.flow.DecompressionFailureAtRequestمنبع گسل X-Apigee policy
انجینکس
برای تشخیص خطا با استفاده از گزارشهای دسترسی NGINX:
- اگر شما یک کاربر Private Cloud هستید، میتوانید از گزارشهای دسترسی NGINX برای تعیین اطلاعات کلیدی در مورد خطاهای HTTP
400استفاده کنید. گزارشهای دسترسی NGINX را بررسی کنید:
/opt/apigee/var/log/edge-router/nginx/ ORG ~ ENV . PORT# _access_logکه در آن: ORG ، ENV و PORT# با مقادیر واقعی جایگزین شدهاند.
- جستجو کنید تا ببینید آیا در یک بازه زمانی خاص (اگر مشکل در گذشته رخ داده است) خطای
400وجود دارد یا خیر، یا اینکه آیا درخواستهایی با400همچنان با شکست مواجه میشوند یا خیر. اگر هرگونه خطای
400با کد خطای X-Apigee-fault-code که با مقدارmessaging.adaptors.http.flow.DecompressionFailureAtRequestمطابقت دارد، پیدا کردید، مقدار منبع خطای X-Apigee-fault را تعیین کنید.نمونه خطای ۴۰۰ از لاگ دسترسی NGINX:

ورودی نمونه بالا از لاگ دسترسی NGINX دارای مقادیر زیر برای X-Apigee-fault-code و X-Apigee-fault-source است:
هدرهای پاسخ ارزش کد خطای X-Apigee messaging.adaptors.http.flow.DecompressionFailureAtRequestمنبع گسل X-Apigee policy
علت: فرمت بار درخواست با کدگذاری مشخص شده در هدر Content-Encoding مطابقت ندارد.
به طور پیشفرض، Apigee Edge همیشه در صورتی که هدر درخواست Content-Encoding حاوی یک کدگذاری معتبر و پشتیبانیشده باشد، payload را از حالت فشرده خارج میکند. بنابراین، انتظار میرود که قالب payload درخواست با کدگذاری مشخصشده در Content-Encoding هدر درخواست مطابقت داشته باشد . اگر عدم تطابق وجود داشته باشد، این خطا را دریافت میکنید.
تشخیص
- کد خطا و منبع خطا را برای خطای مشاهده شده با استفاده از API Monitoring، ابزار Trace یا گزارشهای دسترسی NGINX، همانطور که در مراحل تشخیص مشترک توضیح داده شده است، تعیین کنید.
- اگر کد خطا
messaging.adaptors.http.flow.DecompressionFailureAtRequestباشد و منبع خطا دارای مقدارpolicyیاproxyباشد، این نشان میدهد که درخواست ارسال شده توسط برنامه کلاینت دارای payload است که با کدگذاری پشتیبانی شده مشخص شده در هدر درخواستContent-Encodingمطابقت ندارد. شما میتوانید عدم تطابق را به عنوان بخشی از درخواست HTTP با استفاده از یکی از روشهای زیر تعیین کنید:
پیام خطا
برای اعتبارسنجی با استفاده از پیام خطا:
اگر به پیام خطای کامل دریافتی از Apigee Edge دسترسی دارید، به
faultstringمراجعه کنید.نمونه پیام خطا:
"faultstring":"Decompression failure at request"
- در پیام خطای بالا، عبارت
"Decompression failure at request"نمایش داده میشود که نشان میدهد درخواست با استفاده از کدگذاری مشخص شده در سربرگContent-Encodingقابل decompress شدن نیست.
ردیابی
برای اعتبارسنجی با استفاده از Trace:
- مقدار هدر درخواست Content-Encoding و ویژگی error.cause را با استفاده از Trace همانطور که در مراحل تشخیص مشترک توضیح داده شده است، تعیین کنید.
مقادیر حاصل از ردیابی نمونه به شرح زیر است:
- رمزگذاری محتوا:
gzip - error.cause:
Not in GZIP format
مقدار موجود در هدر درخواست Content-Encoding برابر با gzip است؛ با این حال، فایل درخواست در قالب GZIP نیست (همانطور که با error.cause نشان داده شده است). بنابراین، Apigee Edge با
400 Bad Requestو کد خطایmessaging.adaptors.http.flow.DecompressionFailureAtRequestپاسخ میدهد.- رمزگذاری محتوا:
درخواست واقعی
برای اعتبارسنجی با استفاده از درخواست واقعی:
اگر به درخواست واقعی ارسال شده توسط برنامه کلاینت دسترسی دارید، مراحل زیر را انجام دهید:
- مقدار ارسالی به هدر درخواست
Content-Encodingرا تعیین کنید. - قالب بار داده ارسالی به عنوان بخشی از درخواست را تعیین کنید.
اگر مقدار هدر
Content-Encodingدر لیست کدگذاریهای پشتیبانیشده باشد اما قالب بار داده درخواست با کدگذاری مشخصشده در هدرContent-Encodingمطابقت نداشته باشد، دلیل مشکل همین است.نمونه درخواست:
curl -v "http://HOSTALIAS/v1/testgzip"
-H "Content-Encoding: gzip"-X POST -d @request_payload.zipدرخواست نمونه بالا مقدار
gzipبه هدرContent-Encodingارسال میکند که یک کدگذاری پشتیبانی شده در Apigee Edge است. با این حال، فایل درخواستrequest_payload.zipدر قالب ZIP است. بنابراین، این درخواست با کد وضعیت400 Bad Requestو کد خطایmessaging.adaptors.http.flow.DecompressionFailureAtRequestبا شکست مواجه میشود.
گزارشهای پردازنده پیام
برای اعتبارسنجی با استفاده از گزارشهای پردازشگر پیام:
اگر شما یک کاربر ابر خصوصی هستید، میتوانید از گزارشهای پردازشگر پیام برای تعیین اطلاعات کلیدی در مورد خطاهای HTTP
400استفاده کنید.- شناسه پیام درخواست ناموفق را با استفاده از API Monitoring، ابزار Trace یا گزارشهای دسترسی NGINX، همانطور که در مراحل تشخیص مشترک توضیح داده شده است، تعیین کنید.
شناسه پیام را در گزارش پردازشگر پیام جستجو کنید:
/opt/apigee/var/log/edge-message-processor/logs/system.logیکی از استثنائات زیر را مشاهده خواهید کرد:
سناریوی شماره ۱
سناریوی شماره ۱: وقتی درخواست API دارای هدر 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 formatخط
java.util.zip.ZipException: Not in GZIP formatدر پیام خطای بالا نشان میدهد که درخواست ارسالی با فرمت GZIP ارسال نمیشود، اگرچهContent-Encodingبه صورت gzip مشخص شده است. بنابراین، Apigee Edge این استثنا را ایجاد میکند و کد وضعیت400را با کد خطایmessaging.adaptors.http.flow.DecompressionFailureAtRequestبه برنامههای کلاینت برمیگرداند.سناریوی شماره ۲
سناریوی شماره ۲: وقتی درخواست API دارای هدر 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)خطوط
java.util.zip.ZipException: incorrect header checkوCaused by: java.util.zip.DataFormatException: incorrect header checkدر پیام خطای بالا نشان میدهند که payload درخواست با فرمت deflate ارسال نشده و با کدگذاری مشخص شده در هدرContent-Encodingمربوط به deflate مطابقت ندارد. بنابراین، Apigee Edge این استثنا را ایجاد میکند و کد وضعیت400با کد خطایmessaging.adaptors.http.flow.DecompressionFailureAtRequestبه برنامههای کلاینت برمیگرداند.
وضوح تصویر
- اگر در جریان پروکسی API در Apigee Edge و در سرور backend نیازی به فشردهسازی payload درخواست نیست، هدر
Content-Encodingرا ارسال نکنید . اگر نیاز به فشردهسازی payload درخواست است، به مرحله ۲ بروید. - مطمئن شوید که برنامه کلاینت همیشه موارد زیر را ارسال میکند:
- هر یک از کدگذاریهای پشتیبانیشده به عنوان مقدار هدر
Content-Encodingدر درخواست - بار داده درخواست در قالب پشتیبانیشده توسط Apigee Edge با قالب کدگذاری مشخصشده در سربرگ
Content-Encodingمطابقت دارد.
- هر یک از کدگذاریهای پشتیبانیشده به عنوان مقدار هدر
- در مثالی که در بالا مورد بحث قرار گرفت، فایل درخواست (payload) با فرمت ZIP است، اما هدر درخواست به صورت
Content-Encoding: gzipمشخص شده است. میتوانید با ارسال هدر درخواست به صورتContent-Encoding: gzipو همچنین فایل درخواست با فرمتgzip، مشکل را برطرف کنید:curl -v "https://HOSTALIAS/v1/testgzip" -H "Content-Encoding: gzip" -X POST -d @request_payload.gz
مشخصات
Apigee Edge با کد وضعیت 400 Bad Request و کد خطای messaging.adaptors.http.flow.DecompressionFailureAtRequest مطابق با مشخصات RFC زیر پاسخ میدهد:
| مشخصات |
|---|
| RFC 7231، بخش 6.5.1 |
| RFC 7231، بخش 3.1.2.2 |
اگر هنوز به هرگونه کمکی از پشتیبانی Apigee نیاز دارید، به بخش «باید اطلاعات تشخیصی را جمعآوری کنید» بروید.
باید اطلاعات تشخیصی جمعآوری کند
اطلاعات تشخیصی زیر را جمعآوری کنید و سپس با پشتیبانی Apigee Edge تماس بگیرید:
اگر کاربر فضای ابری عمومی هستید، اطلاعات زیر را ارائه دهید:
- نام سازمان
- نام محیط
- نام پروکسی API
- دستور
curlکامل که برای بازتولید خطای400استفاده میشود - فایل ردیابی برای درخواستهای API
اگر کاربر Private Cloud هستید، اطلاعات زیر را ارائه دهید:
- پیام خطای کامل مشاهده شده برای درخواستهای ناموفق
- نام محیط
- بسته پروکسی API
- فایل ردیابی برای درخواستهای API
گزارشهای دسترسی NGINX
/opt/apigee/var/log/edge-router/nginx/ ORG ~ ENV . PORT# _access_logکه در آن: ORG ، ENV و PORT# با مقادیر واقعی جایگزین شدهاند.
- گزارشهای سیستم پردازشگر پیام
/opt/apigee/var/log/edge-message-processor/logs/system.log