شما در حال مشاهده اسناد 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 نمیتواند محموله را با استفاده از رمزگذاری مشخص شده رمزگشایی کند زیرا قالب بار با فرمت کدگذاری مشخص شده در سربرگ Content-Encoding
نیست.
در اینجا چند نمونه از مقادیر پشتیبانی شده Content-Encoding
و نحوه انتظار Apigee Edge از فرمت بارگذاری در این موارد وجود دارد:
سناریو | محتوا-رمزگذاری | قالب مورد انتظار Payload |
---|---|---|
رمزگذاری منفرد | gzip | فرمت یونیکس فرمت RFC1952 GZIP را ببینید. |
رمزگذاری منفرد | باد کردن | این فرمت از ساختار |
رمزگذاری چندگانه | رمزگذاری چندگانه به عنوان مثال، در مواردی که رمزگذاری دو بار انجام می شود، می تواند به صورت زیر باشد:
| کدگذاری چندگانه بر روی محموله به ترتیب داده شده همانطور که در هدر ظاهر می شود اعمال می شود. |
دلایل احتمالی این خطا به شرح زیر است:
علت | توضیحات | دستورالعمل های عیب یابی قابل اجرا برای |
---|---|---|
فرمت بار درخواستی با رمزگذاری مشخص شده در سرصفحه Content-Encoding مطابقت ندارد | قالب بار درخواست ارسال شده توسط مشتری یا کدگذاری نشده است یا با کدگذاری مشخص شده در سربرگ Content-Encoding مطابقت ندارد. | کاربران Edge Public و Private Cloud |
مراحل تشخیص رایج
برای تشخیص این خطا از یکی از ابزارها/تکنیک های زیر استفاده کنید:
مانیتورینگ API
برای تشخیص خطا با استفاده از API Monitoring:
- به عنوان کاربر با نقش مناسب وارد رابط کاربری Apigee Edge شوید .
به سازمانی که میخواهید در آن موضوع را بررسی کنید بروید.
- به صفحه Analyze > API Monitoring > Investigate بروید.
- بازه زمانی خاصی را که در آن خطاها را مشاهده کرده اید انتخاب کنید.
- مطمئن شوید که فیلتر پروکسی روی همه تنظیم شده باشد.
- کد خطا را در برابر زمان ترسیم کنید.
سلولی را انتخاب کنید که دارای کد خطای
messaging.adaptors.http.flow.DecompressionFailureAtRequest
است، همانطور که در زیر نشان داده شده است:اطلاعات مربوط به کد خطا
messaging.adaptors.http.flow.DecompressionFailureAtRequest
مطابق شکل زیر نمایش داده می شود:روی View logs کلیک کنید و ردیف با خطای
400
را بزرگ کنید.- از پنجره Logs به جزئیات زیر توجه کنید:
- کد وضعیت:
400
- منبع خطا:
proxy
- کد خطا:
messaging.adaptors.http.flow.DecompressionFailureAtRequest
.
- کد وضعیت:
- اگر منبع خطا دارای
proxy
مقدار باشد، این نشان میدهد که فرمت بار درخواست با کدگذاری پشتیبانیشده مشخصشده در سربرگContent-Encoding
مطابقت ندارد.
ابزار ردیابی
برای تشخیص خطا با استفاده از ابزار Trace:
- جلسه ردیابی را فعال کنید و یا:
- صبر کنید تا خطای
400 Bad Request
رخ دهد یا - اگر میتوانید مشکل را تکرار کنید، با API تماس بگیرید و
400 Bad Request
را بازتولید کنید.
- صبر کنید تا خطای
اطمینان حاصل کنید که نمایش همه FlowInfos فعال است:
- یکی از درخواست های ناموفق را انتخاب کنید و ردیابی را بررسی کنید.
- در مراحل مختلف ردیابی پیمایش کنید و محل وقوع شکست را پیدا کنید.
شما معمولاً خطا را در یک جریان درست بعد از مرحله درخواست دریافت شده از مشتری، همانطور که در زیر نشان داده شده است، پیدا خواهید کرد:
به مقادیر خصوصیات از trace توجه کنید:
- خطا:
Decompression failure at request
- error.class :
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 توجه کنید
به مرحله Response Sent to Client در ردیابی که در زیر نشان داده شده است:
به جزئیات زیر از ردیابی توجه کنید:
- کد وضعیت:
400 Bad Request
. - محتوای خطا:
{"fault":{"faultstring":"Decompression failure at request","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtRequest"}}}
- کد وضعیت:
به مرحله AX (Analytics Data Recorded) در Trace بروید و روی آن کلیک کنید.
- به قسمت 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
مطابقت ندارد. هدرContent-Encoding
سرصفحه های پاسخ ارزش X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtRequest
X-Apigee-fault-source policy
NGINX
برای تشخیص خطا با استفاده از گزارش های دسترسی 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-source را تعیین کنید.نمونه خطای 400 از گزارش دسترسی NGINX:
ورودی نمونه بالا از گزارش دسترسی NGINX دارای مقادیر زیر برای X-Apigee-fault-code و X-Apigee-fault-source است:
سرصفحه های پاسخ ارزش X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtRequest
X-Apigee-fault-source policy
علت: فرمت بار درخواستی با رمزگذاری مشخص شده در سرصفحه Content-Encoding مطابقت ندارد
اگر سرصفحه درخواست Content-Encoding
حاوی یک رمزگذاری معتبر و پشتیبانی شده باشد، به طور پیشفرض، Apigee Edge همیشه بار را از حالت فشرده خارج میکند. بنابراین، انتظار میرود که قالب محموله درخواستی باید با رمزگذاری مشخصشده در هدر درخواست Content-Encoding
مطابقت داشته باشد. اگر عدم تطابق وجود داشته باشد، این خطا را دریافت می کنید.
تشخیص
- کد خطا و منبع خطا را برای خطای مشاهده شده با استفاده از مانیتورینگ API، ابزار Trace یا گزارش های دسترسی NGINX همانطور که در مراحل تشخیص رایج توضیح داده شده است، تعیین کنید.
- اگر کد خطا
messaging.adaptors.http.flow.DecompressionFailureAtRequest
باشد و منبع خطا دارایpolicy
مقدار یاproxy
باشد، این نشان می دهد که درخواست ارسال شده توسط برنامه مشتری دارای باری است که با رمزگذاری پشتیبانی شده مشخص شده در هدر درخواست مطابقت ندارد.Content-Encoding
. می توانید عدم تطابق را به عنوان بخشی از درخواست HTTP با استفاده از یکی از روش های زیر تعیین کنید:
پیغام خطا
برای تأیید اعتبار با استفاده از پیام خطا:
اگر به پیام خطای کامل دریافت شده از Apigee Edge دسترسی دارید، به
faultstring
مراجعه کنید.نمونه پیغام خطا:
"faultstring":"Decompression failure at request"
- در پیغام خطای بالا،
"Decompression failure at request"
نمایش داده می شود که به این معنی است که درخواست را نمی توان با استفاده از رمزگذاری مشخص شده در هدرContent-Encoding
از حالت فشرده خارج کرد.
ردیابی
برای تأیید اعتبار با استفاده از 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 است. با این حال، درخواست payloadrequest_payload.zip
در قالب ZIP است. بنابراین، این درخواست با کد وضعیت400 Bad Request
و کد خطا:messaging.adaptors.http.flow.DecompressionFailureAtRequest
با شکست مواجه می شود.
گزارشهای پردازشگر پیام
برای تأیید اعتبار با استفاده از گزارشهای پردازشگر پیام:
اگر کاربر Private Cloud هستید، میتوانید از گزارشهای پردازشگر پیام برای تعیین اطلاعات کلیدی درباره خطاهای HTTP
400
استفاده کنید.- شناسه پیام درخواست ناموفق را با استفاده از مانیتورینگ API، ابزار ردیابی یا گزارشهای دسترسی NGINX همانطور که در مراحل تشخیص رایج توضیح داده شده است، تعیین کنید.
شناسه پیام را در گزارش پردازشگر پیام جستجو کنید:
/opt/apigee/var/log/edge-message-processor/logs/system.log
یکی از استثناهای زیر را خواهید دید:
سناریوی شماره 1
سناریوی شماره 1: وقتی درخواست 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() : 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 formatخط
java.util.zip.ZipException: Not in GZIP format
در پیام خطای بالا نشان می دهد که بار درخواست در قالب GZIP ارسال نشده است اگرچهContent-Encoding
به عنوان gzip مشخص شده است. بنابراین، Apigee Edge استثنا را ایجاد میکند و یک کد وضعیت400
با کد خطاmessaging.adaptors.http.flow.DecompressionFailureAtRequest
را به برنامههای کلاینت برمیگرداند.سناریوی شماره 2
سناریوی شماره 2: وقتی درخواست 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
در پیام خطای بالا نشان می دهد که بار درخواست در قالب deflate ارسال نشده و با کدگذاری مطابقت ندارد در هدرContent-Encoding
از deflate مشخص شده است. بنابراین، Apigee Edge استثنا را ایجاد میکند و یک کد وضعیت400
با کد خطاmessaging.adaptors.http.flow.DecompressionFailureAtRequest
را به برنامههای کلاینت برمیگرداند.
قطعنامه
- اگر در جریان پراکسی API در Apigee Edge و سرور backend نیازی به بار درخواست فشردهشده وجود ندارد، از هدر
Content-Encoding
عبور نکنید . در صورت نیاز به فشرده سازی بار درخواست، به مرحله 2 بروید. - اطمینان حاصل کنید که برنامه مشتری همیشه موارد زیر را ارسال می کند:
- هر یک از رمزگذاری های پشتیبانی شده به عنوان مقدار سرصفحه
Content-Encoding
در درخواست - بار درخواست در قالب پشتیبانی شده به Apigee Edge با قالب کدگذاری مشخص شده در سربرگ
Content-Encoding
مطابقت دارد.
- هر یک از رمزگذاری های پشتیبانی شده به عنوان مقدار سرصفحه
- در مثالی که در بالا مورد بحث قرار گرفت، بارگیری درخواست در قالب 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 نیاز دارید، به Must collect information diagnostic بروید.
باید اطلاعات تشخیصی را جمع آوری کرد
اطلاعات تشخیصی زیر را جمع آوری کنید و سپس با پشتیبانی Apigee Edge تماس بگیرید:
اگر کاربر Public Cloud هستید، اطلاعات زیر را ارائه دهید:
- نام سازمان
- نام محیط زیست
- نام پروکسی 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