أنت الآن بصدد الاطّلاع على مستندات Apigee Edge.
انتقِل إلى
مستندات Apigee X. info
المشكلة
يتلقّى تطبيق العميل رمز حالة 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 أن يكون تنسيق الحمولة في هذه الحالات:
| السيناريو | Content-Encoding | تنسيق الحمولة المتوقّع |
|---|---|---|
| الترميز الفردي | gzip | تنسيق Unix |
| الترميز الفردي | deflate | يستخدم هذا التنسيق بنية |
| الترميز المتعدد | الترميز المتعدد على سبيل المثال، في الحالات التي يتم فيها الترميز مرتين، يمكن أن يكون:
|
تم تطبيق ترميز متعدّد على الحمولة بالترتيب المحدّد كما يظهر في العنوان. |
في ما يلي الأسباب المحتملة لهذا الخطأ:
| السبب | الوصف | تعليمات تحديد المشاكل وحلّها التي تنطبق على |
|---|---|---|
| لا يتطابق تنسيق حمولة الطلب مع الترميز المحدّد في عنوان Content-Encoding | لم يتم ترميز تنسيق حمولة الطلب التي أرسلها العميل أو لا يتطابق مع الترميز المحدّد في العنوان Content-Encoding. |
مستخدمو Edge Public Cloud وEdge Private Cloud |
خطوات التشخيص الشائعة
استخدِم إحدى الأدوات أو التقنيات التالية لتشخيص هذا الخطأ:
API Monitoring
لتشخيص الخطأ باستخدام "مراقبة واجهة برمجة التطبيقات"، اتّبِع الخطوات التالية:
- سجِّل الدخول إلى واجهة مستخدم 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.
- انتظِر إلى أن يظهر الخطأ
تأكَّد من تفعيل خيار عرض جميع معلومات FlowInfo:
- اختَر أحد الطلبات التي تعذّر تنفيذها وافحص التتبُّع.
- تنقَّل بين مراحل التتبُّع المختلفة وحدِّد مكان حدوث الخطأ.
عادةً ما يظهر الخطأ في مسار الإحالة الناجحة بعد مرحلة تلقّي الطلب من العميل كما هو موضّح أدناه:
-
دوِّن قيم الخصائص من التتبُّع:
- الخطأ:
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") في التتبُّع وانقر عليها.
- انتقِل للأسفل إلى قسم تفاصيل المرحلة وعناوين الأخطاء، وحدِّد قيمتَي 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-fault-code messaging.adaptors.http.flow.DecompressionFailureAtRequestX-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.DecompressionFailureAtRequestX-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 كما هو موضّح في خطوات التشخيص الشائعة.
في ما يلي القيم من التتبُّع النموذجي:
- Content-Encoding:
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مدرَجة في قائمة الترميز المتوافق، ولكن تنسيق حمولة الطلب لا يتطابق مع الترميز المحدّد في العنوان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.
سجلّات "معالج الرسائل"
لإثبات صحة البيانات باستخدام سجلّات "معالج الرسائل"، اتّبِع الخطوات التالية:
إذا كنت مستخدمًا في Private Cloud، يمكنك استخدام سجلّات "معالج الرسائل" لتحديد المعلومات الأساسية حول أخطاء HTTP
400.- حدِّد رقم تعريف الرسالة للطلب الذي تعذّر تنفيذه باستخدام "أداة تتبُّع" أو "مراقبة واجهة برمجة التطبيقات" أو سجلّات الوصول إلى NGINX، كما هو موضّح في خطوات التشخيص الشائعة.
ابحث عن معرّف الرسالة في سجلّ "معالج الرسائل" (Message Processor) باتّباع الخطوات التالية:
/opt/apigee/var/log/edge-message-processor/logs/system.logسيظهر لك أحد الاستثناءات التالية:
السيناريو 1
السيناريو 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() : 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لتطبيقات العميل.السيناريو 2
السيناريو 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:
إذا كنت مستخدمًا لخدمة السحابة الإلكترونية العامة، يُرجى تقديم المعلومات التالية:
- اسم المؤسسة
- اسم البيئة
- اسم خادم وكيل لواجهة برمجة التطبيقات
- أمر
curlالكامل المستخدَم لإعادة إنتاج الخطأ400 - ملف التتبُّع لطلبات البيانات من واجهة برمجة التطبيقات
إذا كنت مستخدمًا في Private 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