400 - طلب غير صالح - إلغاء الضغط وفك التشفير

أنت الآن بصدد الاطّلاع على مستندات 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 gzip

راجِع تنسيق GZIP وفقًا لمعيار RFC1952.

الترميز الفردي deflate

يستخدم هذا التنسيق بنية zlib مع خوارزمية ضغط deflate.

راجِع RFC1950 و RFC1951.

الترميز المتعدد

الترميز المتعدد

على سبيل المثال، في الحالات التي يتم فيها الترميز مرتين، يمكن أن يكون:

  • gzip, deflate
  • gzip, gzip
  • deflate وgzip
  • deflate, deflate
تم تطبيق ترميز متعدّد على الحمولة بالترتيب المحدّد كما يظهر في العنوان.

في ما يلي الأسباب المحتملة لهذا الخطأ:

السبب الوصف تعليمات تحديد المشاكل وحلّها التي تنطبق على
لا يتطابق تنسيق حمولة الطلب مع الترميز المحدّد في عنوان Content-Encoding لم يتم ترميز تنسيق حمولة الطلب التي أرسلها العميل أو لا يتطابق مع الترميز المحدّد في العنوان Content-Encoding. مستخدمو Edge Public Cloud وEdge Private Cloud

خطوات التشخيص الشائعة

استخدِم إحدى الأدوات أو التقنيات التالية لتشخيص هذا الخطأ:

API Monitoring

لتشخيص الخطأ باستخدام "مراقبة واجهة برمجة التطبيقات"، اتّبِع الخطوات التالية:

  1. سجِّل الدخول إلى واجهة مستخدم Apigee Edge بصفتك مستخدمًا لديه دور مناسب.
  2. انتقِل إلى المؤسسة التي تريد التحقيق في المشكلة فيها.

  3. انتقِل إلى صفحة تحليل > مراقبة واجهة برمجة التطبيقات > التحقيق.
  4. اختَر الفترة الزمنية المحدّدة التي لاحظت فيها الأخطاء.
  5. تأكَّد من ضبط فلتر الخادم الوكيل على الكل.
  6. رسم بياني لرمز الخطأ مقابل الوقت
  7. اختَر الخلية التي تحتوي على رمز الخطأ messaging.adaptors.http.flow.DecompressionFailureAtRequest كما هو موضح أدناه:

    ( عرض صورة أكبر)

  8. تظهر معلومات حول رمز الخطأ messaging.adaptors.http.flow.DecompressionFailureAtRequest كما هو موضّح أدناه:

    ( عرض صورة أكبر)

  9. انقر على عرض السجلات ووسِّع الصف الذي يتعذّر تنفيذه بسبب الخطأ 400.

    ( عرض صورة أكبر)

  10. من نافذة السجلّات، سجِّل التفاصيل التالية:
    • رمز الحالة: 400
    • مصدر الخطأ: proxy
    • رمز الخطأ: messaging.adaptors.http.flow.DecompressionFailureAtRequest
  11. إذا كانت قيمة مصدر الخطأ هي proxy، يشير ذلك إلى أنّ تنسيق حمولة الطلب لم يتطابق مع ترميز متوافق محدّد في العنوان Content-Encoding.

أداة التتبُّع

لتشخيص الخطأ باستخدام "أداة التتبُّع"، اتّبِع الخطوات التالية:

  1. فعِّل جلسة التتبُّع وأي مما يلي:
    1. انتظِر إلى أن يظهر الخطأ 400 Bad Request، أو
    2. إذا كان بإمكانك إعادة إظهار المشكلة، أجرِ طلب البيانات من واجهة برمجة التطبيقات وأعِد إظهار 400 Bad Request.
  2. تأكَّد من تفعيل خيار عرض جميع معلومات FlowInfo:

  3. اختَر أحد الطلبات التي تعذّر تنفيذها وافحص التتبُّع.
  4. تنقَّل بين مراحل التتبُّع المختلفة وحدِّد مكان حدوث الخطأ.
  5. عادةً ما يظهر الخطأ في مسار الإحالة الناجحة بعد مرحلة تلقّي الطلب من العميل كما هو موضّح أدناه:

    ( عرض صورة أكبر)

  6. دوِّن قيم الخصائص من التتبُّع:

    • الخطأ: 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.

  7. تحديد قيمة عنوان الطلب Content-Encoding لإجراء ذلك، انتقِل إلى المرحلة تم تلقّي الطلب من العميل كما هو موضّح أدناه:

    ( عرض صورة أكبر)

    يُرجى العِلم أنّ قيمة عنوان الطلب Content-Encoding هي gzip.

    يوضّح نموذج التتبُّع أعلاه أنّ الترميز المحدّد في عنوان الطلب Content-Encoding هو gzip، ولكن حمولة الطلب ليست بتنسيق GZIP. لذلك، لا يمكن لخدمة Apigee فك ضغط الحمولة باستخدام gzip، وتعرض الخطأ Decompression failure at request.

  8. دوِّن رمز الحالة ورسالة الخطأ التي تعرضها Apigee Edge من خلال الانتقال إلى

    إلى مرحلة تم إرسال الردّ إلى العميل في التتبُّع كما هو موضّح أدناه:

    ( عرض صورة أكبر)

    يُرجى ملاحظة التفاصيل التالية من التتبُّع:

    • رمز الحالة: 400 Bad Request
    • محتوى الخطأ: {"fault":{"faultstring":"Decompression failure at request","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtRequest"}}}
  9. انتقِل إلى مرحلة AX (تسجيل بيانات "إحصاءات Google") في التتبُّع وانقر عليها.

  10. انتقِل للأسفل إلى قسم تفاصيل المرحلة وعناوين الأخطاء، وحدِّد قيمتَي X-Apigee-fault-code وX-Apigee-fault-source كما هو موضّح أدناه:

    ( عرض صورة أكبر)

  11. ستظهر لك قيم X-Apigee-fault-code وX-Apigee-fault-source على النحو messaging.adaptors.http.flow.DecompressionFailureAtRequest و policy، ما يشير إلى أنّ تنسيق حمولة الطلب لم يتطابق مع الترميز المحدّد في العنوان Content-Encoding.
    عناوين الاستجابة القيمة
    X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtRequest
    X-Apigee-fault-source policy

NGINX

لتشخيص الخطأ باستخدام سجلّات الوصول إلى NGINX، اتّبِع الخطوات التالية:

  1. إذا كنت مستخدمًا في Private Cloud، يمكنك استخدام سجلّات الوصول إلى NGINX لتحديد المعلومات الأساسية حول أخطاء HTTP 400.
  2. تحقَّق من سجلّات الوصول إلى NGINX:

    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    المكان: يتم استبدال ORG وENV وPORT# بالقيم الفعلية.

  3. ابحث لمعرفة ما إذا كانت هناك أي أخطاء 400 خلال مدة زمنية معيّنة (إذا حدثت المشكلة في الماضي) أو إذا كانت هناك أي طلبات لا تزال غير ناجحة مع 400.
  4. إذا عثرت على أي أخطاء 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

تزيل Apigee Edge الضغط عن الحمولة تلقائيًا إذا كان عنوان الطلب Content-Encoding يحتوي على ترميز صالح ومتوافق. لذلك، من المتوقّع أن يتطابق تنسيق حمولة الطلب مع الترميز المحدّد في عنوان الطلب Content-Encoding. إذا كان هناك عدم تطابق، سيظهر لك هذا الخطأ.

التشخيص

  1. حدِّد رمز الخطأ ومصدر الخطأ للخطأ الذي تم رصده باستخدام أداة مراقبة واجهة برمجة التطبيقات أو أداة التتبُّع أو سجلّات الوصول إلى NGINX كما هو موضّح في خطوات التشخيص الشائعة.
  2. إذا كان رمز الخطأ هو messaging.adaptors.http.flow.DecompressionFailureAtRequest وكان مصدر الخطأ يتضمّن القيمة policy أو proxy، يشير ذلك إلى أنّ الطلب الذي أرسله تطبيق العميل يتضمّن حمولة لا تتطابق مع ترميز متوافق محدّد في عنوان الطلب Content-Encoding.
  3. يمكنك تحديد عدم التطابق كجزء من طلب HTTP باستخدام إحدى الطريقتَين التاليتَين:

    رسالة الخطأ

    لإثبات صحة المعلومات باستخدام رسالة الخطأ، اتّبِع الخطوات التالية:

    1. إذا كان بإمكانك الوصول إلى رسالة الخطأ الكاملة التي تلقّيتها من Apigee Edge، يُرجى الرجوع إلى faultstring.

      نموذج رسالة الخطأ:

      "faultstring":"Decompression failure at request"
    2. في رسالة الخطأ أعلاه، يظهر "Decompression failure at request"، ما يعني أنّه تعذّر فك ضغط الطلب باستخدام الترميز المحدّد في العنوان Content-Encoding.

    التتبّع

    لإثبات صحة البيانات باستخدام "التتبُّع"، اتّبِع الخطوات التالية:

    1. حدِّد قيمة عنوان الطلب Content-Encoding والسمة error.cause باستخدام Trace كما هو موضّح في خطوات التشخيص الشائعة.
    2. في ما يلي القيم من التتبُّع النموذجي:

      • 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.

    الطلب الفعلي

    لإثبات صحة الرمز باستخدام الطلب الفعلي، اتّبِع الخطوات التالية:

    إذا كان بإمكانك الوصول إلى الطلب الفعلي الذي أرسله تطبيق العميل، اتّبِع الخطوات التالية:

    1. تحديد القيمة التي تم تمريرها إلى عنوان الطلب Content-Encoding
    2. تحديد تنسيق الحمولة المُرسَلة كجزء من الطلب
    3. إذا كانت قيمة العنوان 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.

    1. حدِّد رقم تعريف الرسالة للطلب الذي تعذّر تنفيذه باستخدام "أداة تتبُّع" أو "مراقبة واجهة برمجة التطبيقات" أو سجلّات الوصول إلى NGINX، كما هو موضّح في خطوات التشخيص الشائعة.
    2. ابحث عن معرّف الرسالة في سجلّ "معالج الرسائل" (Message Processor) باتّباع الخطوات التالية:

      /opt/apigee/var/log/edge-message-processor/logs/system.log

    3. سيظهر لك أحد الاستثناءات التالية:

      السيناريو 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() :
      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: عندما يتضمّن طلب البيانات من واجهة برمجة التطبيقات العنوان 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 لتطبيقات العميل.

الدقة

  1. إذا لم تكن هناك حاجة إلى حمولة الطلب المضغوطة في مسار خادم وكيل لواجهة برمجة التطبيقات في Apigee Edge وفي خادم الخلفية، لا تمرِّر العنوان Content-Encoding. إذا كان من الضروري ضغط حمولة الطلب، انتقِل إلى الخطوة 2.
  2. تأكَّد من أنّ تطبيق العميل يرسل دائمًا ما يلي:
    • أي من الترميزات المتوافقة كقيمة لعنوان Content-Encoding في الطلب
    • يتطابق نص الطلب بتنسيقه المتوافق مع Apigee Edge مع تنسيق الترميز المحدّد في العنوان Content-Encoding
  3. في المثال المذكور أعلاه، تكون حمولة الطلب بتنسيق 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