يتم الآن عرض مستندات Apigee Edge.
انتقِل إلى مستندات
Apigee X. المعلومات
المشكلة
يحصل تطبيق العميل على رمز حالة HTTP لـ 400 Bad Request
مع رمز الخطأ messaging.adaptors.http.flow.DecompressionFailureAtRequest
كاستجابة لطلبات البيانات من واجهة برمجة التطبيقات.
رسالة الخطأ
يتلقى تطبيق العميل رمز الاستجابة التالي:
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
تنسيق الحمولة في تلك الحالات:
السيناريو | ترميز المحتوى | تنسيق الحمولة المتوقع |
---|---|---|
ترميز فردي | gzip | تنسيق Unix راجِع تنسيق RFC1952 GZIP. |
ترميز فردي | انكماش | يستخدِم هذا التنسيق بنية |
الترميز المتعدد | الترميز المتعدد على سبيل المثال، في الحالات التي يتم فيها إجراء الترميز مرتين، يمكن أن يكون:
|
تم تطبيق ترميز متعدد على الحمولة بالترتيب المحدد الذي يظهر في العنوان. |
الأسباب المحتملة لهذا الخطأ هي كما يلي:
السبب | الوصف | تعليمات تحديد المشاكل وحلّها السارية على |
---|---|---|
لا يتطابق تنسيق حمولة الطلب مع الترميز المحدّد في العنوان Content-Encoding | إنّ تنسيق حمولة الطلب الذي أرسله العميل غير مرمّز أو لا
يتطابق مع الترميز المحدّد في عنوان Content-Encoding . |
مستخدمو Edge العام والخاص على السحابة الإلكترونية |
خطوات التشخيص الشائعة
استخدِم إحدى الأدوات/الأساليب التالية لتشخيص هذا الخطأ:
مراقبة واجهة برمجة التطبيقات
لتشخيص الخطأ باستخدام مراقبة واجهة برمجة التطبيقات:
- سجِّل الدخول إلى واجهة مستخدم Apigee Edge كمستخدم لديه دور مناسب.
انتقِل إلى المؤسسة التي تريد التحقيق في المشكلة فيها.
- انتقل إلى صفحة تحليل > مراقبة واجهة برمجة التطبيقات > التحقيق.
- اختَر الإطار الزمني المحدّد الذي لاحظت فيه الأخطاء.
- تأكّد من ضبط فلتر الخادم الوكيل على الكل.
- ارسم رمز الخطأ مقابل الوقت.
اختَر خلية تحتوي على رمز الخطأ
messaging.adaptors.http.flow.DecompressionFailureAtRequest
كما هو موضّح أدناه:يتم عرض المعلومات عن رمز الخطأ
messaging.adaptors.http.flow.DecompressionFailureAtRequest
كما هو موضّح أدناه:انقر على عرض السجلات ووسِّع الصف الذي يتعذّر عليه ظهور الخطأ
400
.- من نافذة السجلّات، دوِّن التفاصيل التالية:
- رمز الحالة:
400
- مصدر الخطأ:
proxy
- رمز الخطأ:
messaging.adaptors.http.flow.DecompressionFailureAtRequest
.
- رمز الحالة:
- إذا كانت القيمة
proxy
في مصدر الخطأ، هذا يشير إلى أنّ تنسيق حمولة الطلب لا يتطابق مع الترميز المتوافق المحدّد في العنوانContent-Encoding
.
أداة التتبُّع
لتشخيص الخطأ باستخدام أداة التتبُّع:
- فعِّل جلسة التتبُّع
وإمّا:
- انتظر حتى يحدث الخطأ
400 Bad Request
، أو - إذا كان بإمكانك إعادة إظهار المشكلة، عليك طلب بيانات من واجهة برمجة التطبيقات وإعادة إظهار المشكلة
400 Bad Request
.
- انتظر حتى يحدث الخطأ
تأكَّد من تفعيل Show all FlowInfos (إظهار جميع عمليات التدفق):
- اختَر أحد الطلبات التي تعذّر تنفيذها وافحص بيانات التتبّع.
- التنقّل خلال المراحل المختلفة لعملية التتبّع وتحديد مكان حدوث الخطأ.
سيظهر لك الخطأ عادةً في المسار مباشرةً بعد مرحلة تم استلام الطلب من العميل كما هو موضّح أدناه:
-
دوِّن قيم السمات من صفحة التتبّع:
- خطأ:
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 من خلال التنقّل
إلى مرحلة الرد المُرسَل إلى العميل في سجلّ التتبُّع كما هو موضَّح أدناه:
دوِّن التفاصيل التالية من صفحة التتبّع:
- رمز الحالة:
400 Bad Request
. - محتوى الخطأ:
{"fault":{"faultstring":"Decompression failure at request","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtRequest"}}}
- رمز الحالة:
انتقِل إلى مرحلة AX (بيانات "إحصاءات Google" المسجّلة) في التتبُّع وانقر عليها.
- انتقِل للأسفل إلى قسم Stage Details (تفاصيل المرحلة) وError Headers (عناوين الخطأ) وحدِّد قيمتَي X-Apigee-Error-code وX-Apigee-fulfillment-source كما هو موضّح أدناه:
- ستظهر لك قيمتا X-Apigee-fault-code وX-Apigee-fault-code، على أنّه
messaging.adaptors.http.flow.DecompressionFailureAtRequest
وpolicy
، ما يشير إلى أنّ تنسيق حمولة الطلب لم يتطابق مع الترميز المحدّد في عنوانContent-Encoding
.عناوين الاستجابة القيمة X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtRequest
X-Apigee-fault-source policy
NGINX
لتشخيص الخطأ باستخدام سجلات الوصول إلى NGINX:
- إذا كنت من مستخدمي السحابة الإلكترونية الخاصة، يمكنك استخدام سجلات وصول NGINX لتحديد المعلومات الأساسية حول أخطاء
400
في HTTP. تحقَّق من سجلات وصول 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-codeنموذج للخطأ 400 من سجلّ الوصول إلى NGINX:
يحتوي إدخال النموذج أعلاه من سجلّ الوصول إلى NGINX على القيم التالية للسمة X-Apigee-fault-code وX-Apigee-fault-code :
عناوين الاستجابة القيمة X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtRequest
X-Apigee-fault-source policy
السبب: لا يتطابق تنسيق حمولة الطلب مع الترميز المحدّد في العنوان Content-Encoding
وفقًا للإعدادات التلقائية، يفكّ Apigee Edge الحمولة دائمًا إذا كان عنوان الطلب Content-Encoding
يحتوي على
ترميز متوافق وصالح. وبالتالي، من المتوقّع أن يتطابق تنسيق حمولة الطلب مع الترميز المحدّد في عنوان الطلب Content-Encoding
.
وفي حال عدم التطابق، ستحصل على هذا الخطأ.
التشخيص
- حدِّد رمز الخطأ ومصدر الخطأ للخطأ الذي يتم رصده باستخدام مراقبة واجهة برمجة التطبيقات أو أداة التتبُّع أو سجلات الوصول إلى 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
.
التتبّع
للتحقق من استخدام التتبع:
- حدِّد قيمة عنوان الطلب 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
.
سجلّات "معالج الرسائل"
للتحقق من صحة استخدام سجلات معالج الرسائل:
إذا كنت من مستخدمي السحابة الإلكترونية الخاصة، يمكنك استخدام سجلات معالج الرسائل لتحديد المعلومات الأساسية حول أخطاء
400
في HTTP.- حدِّد رقم تعريف الرسالة للطلب الذي تعذّر تنفيذه باستخدام رصد واجهة برمجة التطبيقات أو أداة التتبُّع أو سجلات الوصول إلى NGINX كما هو موضّح في خطوات التشخيص الشائعة.
ابحث عن معرِّف الرسالة في سجلّ معالج الرسائل:
/opt/apigee/var/log/edge-message-processor/logs/system.log
سيظهر أحد الاستثناءات التالية:
السيناريو الأول
السيناريو 1: عندما يحتوي طلب واجهة برمجة التطبيقات على العنوان 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: عندما يحتوي طلب واجهة برمجة التطبيقات على العنوان 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
لتطبيقات العملاء.
-
درجة الدقّة
- إذا لم تكن هناك حاجة إلى حمولة الطلب المضغوطة في تدفق الخادم الوكيل لواجهة برمجة التطبيقات في Apigee Edge
وفي خادم الخلفية، يجب عدم تمرير الرأس
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، يُرجى الانتقال إلى ضرورة جمع معلومات التشخيص.
ضرورة جمع معلومات التشخيص
اجمع معلومات التشخيص التالية، ثم تواصَل مع فريق دعم Apigee Edge:
إذا كنت من مستخدمي Cloud Cloud، يُرجى تقديم المعلومات التالية:
- اسم المؤسسة
- اسم البيئة
- اسم الخادم الوكيل لواجهة برمجة التطبيقات
- أكمِل أمر
curl
المستخدَم لإعادة إظهار الخطأ400
. - ملف التتبُّع الخاص بطلبات واجهة برمجة التطبيقات
إذا كنت مستخدم Cloud خاصًا، يُرجى تقديم المعلومات التالية:
- رسالة الخطأ الكاملة التي تم رصدها للطلبات التي تعذّر تنفيذها
- اسم البيئة
- حزمة الخادم الوكيل لواجهة برمجة التطبيقات
- ملف التتبُّع الخاص بطلبات واجهة برمجة التطبيقات
سجلات وصول 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