500 خطأ في الخادم الداخلي - BadFormData

أنت الآن بصدد الاطّلاع على مستندات Apigee Edge.
انتقِل إلى مستندات Apigee X.
info

المشكلة

يتلقّى تطبيق العميل رمز حالة HTTP بقيمة 500 Internal Server Error مع رمز الخطأ protocol.http.BadFormData كاستجابة لطلبات البيانات من واجهة برمجة التطبيقات.

رسالة الخطأ

يتلقّى تطبيق العميل رمز الاستجابة التالي:

HTTP/1.1 500 Internal Server Error

بالإضافة إلى ذلك، قد تظهر لك رسالة الخطأ التالية:

{
   "fault":{
      "faultstring":"Bad Form Data",
      "detail":{
         "errorcode":"protocol.http.BadFormData"
      }
   }
}

بيانات النموذج

قبل أن ندخل في تفاصيل تحديد المشكلة وحلّها، لنفهم ما هي بيانات النماذج.

بيانات النماذج هي المعلومات التي يقدّمها المستخدم عادةً من خلال نموذج HTML يحتوي على عناصر مثل مربّع إدخال نص أو زر أو مربّع اختيار. يتم عادةً إرسال بيانات النموذج كسلسلة من أزواج المفتاح والقيمة كجزء من طلبات HTTP أو استجاباته.

نقل بيانات النموذج

  1. Content-Type: application/x-www-form-urlencoded
    • إذا كان حجم بيانات النموذج صغيرًا، يتم إرسال البيانات كأزواج مفتاح/قيمة مع:
      • يتم ترميز الأحرف في كلا المفتاحين وفقًا للقواعد الموضّحة في النماذج - القسم 17.13.4.1
      • العنوان Content-Type: application/x-www-form-urlencoded

      نموذج طلب يتضمّن بيانات نموذج:

      curl https://HOSTALIAS/somepath -H "Content-Type: application/x-www-form-urlencoded" -d "username=abc@google.com&pasword=secret123"
      
    • يتم ترميز النسبة المئوية لأي أحرف غير أبجدية رقمية في كل من المفاتيح والقيم، أي يتم تمثيلها على شكل ثلاثية أحرف %HH، تتألف من علامة النسبة المئوية متبوعة برقمين سداسيين عشريين يمثلان رمز ASCII للحرف المحدد.
    • وبالتالي، على الرغم من أنّ علامة النسبة المئوية (%) مسموح بها في بيانات النموذج، يتم تفسيرها على أنّها بداية تسلسل هروب خاص. لذلك، إذا كانت بيانات النموذج بحاجة إلى أن تحتوي على علامة النسبة المئوية (%) في المفتاح أو القيمة، يجب إرسالها بالشكل %25, الذي يمثّل رمز ASCII لعلامة النسبة المئوية (%).
  2. Content-Type: multipart/form-data

    إذا أردت نقل كميات كبيرة من البيانات الثنائية أو النصوص التي تحتوي على أحرف غير ASCII، يمكنك إرسال البيانات باستخدام Content-Type: multipart/form-data كما هو موضّح في النماذج - القسم 17.13.4.2.

الأسباب المحتملة

يحدث هذا الخطأ فقط في حال استيفاء جميع الشروط التالية:

  1. يتضمّن طلب HTTP الذي يرسله العميل إلى Apigee Edge ما يلي:
    1. Content-Type: application/x-www-form-urlencoded و
    2. بيانات النموذج التي تتضمّن علامة النسبة المئوية (%) أو علامة النسبة المئوية (%) متبوعة بأحرف ست عشرية غير صالحة وغير مسموح بها وفقًا للفقرة 17.13.4.1 من النماذج
  2. يقرأ خادم وكيل واجهة برمجة التطبيقات في Apigee Edge مَعلمات النموذج المحدّدة التي تحتوي على أي أحرف غير مسموح باستخدامها في مسار الطلب باستخدام سياسة ExtractVariables أو AssignMessage.

    على سبيل المثال، إذا كانت بيانات النموذج تحتوي على علامة النسبة المئوية (%) كما هي (بدون ترميز) أو علامة النسبة المئوية (%) متبوعة بأي أحرف سداسية عشرية غير صالحة في المفتاح و/أو القيمة، سيظهر لك هذا الخطأ.

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

    السبب الوصف تعليمات تحديد المشاكل وحلّها التي تنطبق على
    تحتوي مَعلمات النموذج في الطلب على أحرف غير مسموح بها تحتوي مَعلمات النموذج التي يتم تمريرها كجزء من طلب HTTP من قِبل العميل على أي أحرف غير مسموح باستخدامها. مستخدمو Edge Public Cloud وEdge Private Cloud

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

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

API Monitoring

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

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

  3. انتقِل إلى صفحة تحليل > مراقبة واجهة برمجة التطبيقات > التحقيق.
  4. اختَر الفترة الزمنية المحدّدة التي لاحظت فيها الأخطاء.
  5. رسم بياني لرمز الخطأ مقابل الوقت

  6. اختَر الخلية التي تحتوي على رمز الخطأ protocol.http.BadFormData كما هو موضح أدناه:

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

  7. تظهر المعلومات حول رمز الخطأ protocol.http.BadFormData كما هو موضّح أدناه:

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

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

  9. من نافذة السجلّات، سجِّل التفاصيل التالية:
    • رمز الحالة: 500
    • مصدر الخطأ: proxy
    • رمز الخطأ: protocol.http.BadFormData
    • سياسة الأعطال: extractvariables/EV-ExtractFormParams
  10. إذا كان مصدر الخطأ هو proxy، وكان رمز الخطأ هو protocol.http.BadFormData وكانت سياسة الخطأ غير فارغة، يشير ذلك إلى حدوث الخطأ أثناء قراءة أو استخراج البيانات من النموذج (مَعلمات النموذج) التي تتضمّن أي أحرف غير مسموح باستخدامها، وذلك وفقًا للسياسة المحدّدة في سياسة الخطأ.
  11. في هذا المثال، قيمة X-Apigee-fault-policy هي extractvariables/EV- ExtractFormParams, ، ما يعني أنّ السياسة ExtractVariables التي تحمل الاسم EV-ExtractFormParams تعذّر تنفيذها أثناء قراءة مَعلمات النموذج أو استخراجها.

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

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

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

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

    في نموذج التتبُّع أعلاه، لاحظ أنّ الخطأ حدث في سياسة ExtractVariables المسماة EV-ExtractFormParams.

  6. انتقِل إلى التدفق الذي يحمل الاسم Error بعد السياسة المحدّدة التي تعذّر تنفيذها:

  7. لاحظ قيم ما يلي من التتبُّع:

    الخطأ: Bad Form Data

    الولاية: PROXY_REQ_FLOW

    error.class: com.apigee.rest.framework.BadRequestException

    • تشير قيمة الخطأ Bad Form Data إلى أنّ مَعلمات النموذج تتضمّن بعض الأحرف التي لا يُسمح باستخدامها.
    • تشير قيمة الحالة PROXY_REQ_FLOW, إلى أنّ الخطأ حدث في مسار الطلب لخادم وكيل واجهة برمجة التطبيقات.
  8. انتقِل إلى مرحلة AX (تسجيل بيانات الإحصاءات) في التتبُّع وانقر عليها.
  9. انتقِل للأسفل إلى قسم تفاصيل المرحلة - عناوين الأخطاء وحدِّد قيم X-Apigee-fault-code وX-Apigee-fault-source وX-Apigee-fault-policy كما هو موضّح أدناه:

  10. يُرجى العِلم أنّ قيمتَي X-Apigee-fault-code وX-Apigee-fault-source هما protocol.http.BadFormData وpolicy على التوالي، وأنّ X-Apigee-fault-policy ليست فارغة. يشير ذلك إلى حدوث الخطأ أثناء قراءة أو استخراج البيانات من النموذج (مَعلمات النموذج) من خلال السياسة المحدّدة في X-Apigee-fault-policy، والتي كانت تتضمّن أي أحرف غير مسموح باستخدامها.

    عناوين الاستجابة القيمة
    X-Apigee-fault-code protocol.http.BadFormData
    X-Apigee-fault-source policy
    X-Apigee-fault-policy extractvariables/EV-ExtractFormParams
  11. في هذا المثال، قيمة X-Apigee-fault-policy هي extractvariables/EV- ExtractFormParams, ، ما يعني أنّ سياسة ExtractVariables التي تحمل الاسم EV-ExtractFormParams تعذّر تنفيذها أثناء قراءة مَعلمات النموذج أو استخراجها.

NGINX

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

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

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

  3. ابحث لمعرفة ما إذا كانت هناك أي أخطاء 500 برمز الخطأ protocol.http.BadFormData خلال مدة زمنية معيّنة (إذا حدثت المشكلة في الماضي) أو ما إذا كانت هناك أي طلبات لا تزال غير ناجحة مع 500.
  4. إذا عثرت على أي أخطاء 500 تتطابق مع قيمة X-Apigee-fault-code protocol.http.BadFormData، حدِّد قيمة X-Apigee-fault-source وX-Apigee-fault-policy.

    مثال على الخطأ 500 من سجلّ الوصول إلى NGINX:

    يحتوي إدخال النموذج أعلاه من سجلّ الوصول إلى NGINX على القيم التالية لكل من X-Apigee-fault-code وX-Apigee-fault-source:

    العناوين القيمة
    X-Apigee-fault-code protocol.http.BadFormData
    X-Apigee-fault-source policy
    X-Apigee-fault-policy extractvariables/EV-ExtractFormParams
  5. يُرجى العِلم أنّ قيمتَي X-Apigee-fault-code وX-Apigee-fault-source هما protocol.http.BadFormData وpolicy على التوالي، وأنّ X-Apigee-fault-policy ليست فارغة. يشير ذلك إلى حدوث الخطأ أثناء قراءة أو استخراج بيانات النموذج (مَعلمات النموذج) التي تتضمّن أي أحرف غير مسموح باستخدامها، وذلك أثناء تنفيذ السياسة المحدّدة في X-Apigee-fault-policy.
  6. في هذا المثال، قيمة X-Apigee-fault-policy هي extractvariables/EV- ExtractFormParams, ، ما يعني أنّ سياسة ExtractVariables المسماة EV-ExtractFormParams تعذّر تنفيذها أثناء قراءة مَعلمات النموذج.

السبب: تحتوي مَعلمات النموذج في الطلب على أحرف غير مسموح بها

التشخيص

  1. حدِّد رمز الخطأ ومصدر الخطأ وسياسة الخطأ الخاصة بـ 500 Internal Server Error باستخدام "مراقبة واجهة برمجة التطبيقات" أو أداة "التتبُّع" أو سجلّات الوصول إلى NGINX كما هو موضّح في خطوات التشخيص الشائعة.
  2. إذا كان رمز الخطأ هو protocol.http.BadFormData، وكان مصدر الخطأ يتضمّن القيمة proxy أو policy، وكانت سياسة الخطأ غير فارغة، يشير ذلك إلى أنّ السياسة المحدّدة في سياسة الخطأ تعذّر تنفيذها أثناء قراءة بيانات النموذج أو استخراجها (مَعلمات النموذج).
  3. راجِع السياسة الموضّحة في سياسة الخطأ وحدِّد المعلومات التالية:
    1. المصدر: حدِّد ما إذا كانت السياسة تقرأ البيانات أو تستخرجها من الطلب أو الرد.
    2. مَعلمات النموذج: حدِّد مَعلمات النموذج المحدّدة التي تتم قراءتها في السياسة.

      العيّنة رقم 1

      المثال 1: سياسة ExtractVariables لاستخراج مَعلمات النموذج:

            <ExtractVariables name="EV-ExtractFormParms">
               <DisplayName>EV-ExtractFormParams</DisplayName>
               <Source>request</Source>
               <FormParam name="username">
                  <Pattern ignoreCase="false">{username}</Pattern>
               </FormParam>
               <FormParam name="password">
                 <Pattern ignoreCase="false">{password}</Pattern>
               </FormParam>
               <VariablePrefix>forminfo</VariablePrefix>
             <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
            </ExtractVariables>
            

      في سياسة ExtractVariables أعلاه:

      • المصدر: request

        يتم الإشارة إلى ذلك من خلال العنصر <Source>

      • مَعلمات النموذج: username وpassword

        يتم الإشارة إلى ذلك باستخدام العنصر <Pattern> ضمن العنصر <FormParam>

      يشير ذلك إلى أنّ مَعلمات النموذج username و/أو password التي تم تمريرها كجزء من طلب HTTP من خلال العميل إلى Apigee Edge تحتوي على أحرف غير مسموح باستخدامها.

      النموذج رقم 2

      المثال 2: سياسة AssignMessage التي تنسخ مَعلمات النموذج:

            <AssignMessage continueOnError="false" enabled="true" name="AM-CopyFormParams">
              <Copy source="request">
                <FormParams>
                  <FormParam name="username"/>
                  <FormParam name="password"/>
                </FormParams>
              </Copy>
              <AssignTo createNew="true" transport="http" type="request"/>
            </AssignMessage>
            

      في سياسة ExtractVariables أعلاه:

      • المصدر: request

        يتم تحديد ذلك من خلال السمة source في العنصر <Copy>

      • مَعلمات النموذج: username وpassword

        يتم تحديد ذلك من خلال السمة name في العنصر <FormParam>

      يشير ذلك إلى أنّ مَعلمات النموذج username أو password أو كليهما، والتي تم تمريرها كجزء من طلب HTTP من خلال العميل إلى Apigee Edge، تحتوي على أي أحرف غير مسموح باستخدامها.

  4. تحقَّق مما إذا كانت هناك أي أحرف غير مسموح باستخدامها في مَعلمات النموذج المحدّدة في الخطوة 3، وذلك باتّباع إحدى الطريقتَين التاليتَين:

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

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

    1. إذا كنت قد سجّلت التتبُّع للطلب الذي تعذّر تنفيذه كما هو موضّح في خطوات التشخيص الشائعة، اختَر أحد الطلبات التي تعذّر تنفيذها.
    2. إذا تبيّن لك أنّ مَعلمات النموذج التي تحتوي على أي أحرف غير مسموح باستخدامها هي جزء من طلب HTTP في الخطوة 3 أعلاه، اتّبِع الخطوات التالية:
      1. انتقِل إلى المرحلة تم استلام الطلب من العميل.
      2. انتقِل إلى قسم تفاصيل المرحلة وراجِع محتوى الطلب.

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

      3. في المثال أعلاه، لاحظ أنّ مَعلمة النموذج password تحتوي على علامة النسبة المئوية (%).
      4. بما أنّ علامة النسبة المئوية (%) تُستخدَم أيضًا في ترميز النسبة المئوية للأحرف الخاصة، لا يمكن استخدامها كما هي في بيانات النموذج.
      5. لذلك، تستجيب Apigee Edge بالرمز 500 Internal Server Error مع رمز الخطأ protocol.http.BadFormData.

    الطلب الفعلي

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

    1. إذا لم يكن بإمكانك الوصول إلى الطلب الفعلي المقدَّم إلى الخادم المستهدف، انتقِل إلى الحلّ.
    2. إذا كان بإمكانك الوصول إلى الطلب الفعلي الذي تم إرساله إلى Apigee Edge، اتّبِع الخطوات التالية:
      1. راجِع محتوى بيانات النموذج لمعرفة ما إذا كان يتضمّن أي أحرف غير مسموح باستخدامها، مثل علامة النسبة المئوية (%) أو علامة النسبة المئوية (%) متبوعة بأحرف سداسية عشرية غير صالحة.

        العيّنة رقم 1

        نموذج الطلب 1: بيانات النموذج كجزء من الطلب

        curl -X GET "https://HOSTALIAS/myproxy -H "Content-Type: application/x-www-form-urlencoded" -d "client_id=123456abc123&client_secret=c23578%ZY"
        

        في هذا المثال، لاحظ أنّ العنصر client_secret يحتوي على علامة النسبة المئوية (%) متبوعة بأحرف سداسية عشرية غير صالحة ZY.

        النموذج رقم 2

        نموذج الطلب 2: بيانات النموذج التي تم تمريرها في ملف:

        curl -X GET "https://HOSTALIAS/myproxy -H "Content-Type: application/x-www-form-urlencoded" -d @form_data.xml
        

        محتوى ملف form_data.xml:

        xml=<user><username>abc1234@google.com</username><password>qwerty12345!@#$%</password></user>

        في هذا المثال، لاحظ أنّ العنصر password يحتوي على علامة النسبة المئوية (%)، والتي يجب عدم تمريرها كما هي في بيانات النموذج.

    3. في المثالَين أعلاه، تحتوي بيانات النموذج التي تم إرسالها كجزء من طلب HTTP إلى Apigee Edge على أحرف لا يُسمح باستخدامها.
    4. لذلك، تستجيب Apigee Edge بالرمز 500 Internal Server Error مع رمز الخطأ protocol.http.BadFormData.

الدقة

  1. تأكَّد من أنّ أي أحرف خاصة في كل من المفاتيح والقيم الخاصة ببيانات النموذج أو المَعلمات التي يتم إرسالها كجزء من طلب HTTP من خلال العميل يتم ترميزها دائمًا على النحو الموضّح في بيانات النموذج - application/x-www-form-urlencoded.
  2. بالنسبة إلى الأمثلة الموضّحة أعلاه، يمكنك حلّ المشاكل على النحو التالي:

    العيّنة رقم 1

    المثال 1: بيانات النموذج التي يتم تمريرها كجزء من الطلب:

    استخدِم أحرفًا سداسية عشرية صالحة تتطابق مع رمز ASCII لحرف معيّن. على سبيل المثال، إذا أردت إرسال علامة الدولار ($)، استخدِم %24 كما هو موضّح أدناه:

    curl -X GET "https://HOSTALIAS/myproxy -H "Content-Type: application/x-www-form-urlencoded" -d "client_id=123456abc123&client_secret=c23578%24"
    

    النموذج رقم 2

    نموذج الطلب 2: بيانات النموذج التي تم تمريرها في ملف:

    curl -X GET "https://HOSTALIAS/myproxy -H "Content-Type: application/x-www-form-urlencoded" -d @form_data.xml
    

    محتوى ملف form_data.xml:

    استخدِم الترميز بالنسبة المئوية لعلامة النسبة المئوية (%)، أي عدِّل الملف ليحتوي على %25 كما هو موضّح أدناه:

    xml=<user><username>abc1234@google.com</username><password>qwerty12345!!@#$%25</password></user>

المواصفات

تتوقّع Apigee Edge أن يتم إرسال بيانات النموذج وفقًا للمواصفات التالية:

المواصفات
بيانات النموذج - application/x-www-form-urlencoded

إذا كنت لا تزال بحاجة إلى أي مساعدة من فريق دعم Apigee، انتقِل إلى المعلومات التشخيصية التي يجب جمعها.

يجب جمع معلومات التشخيص

إذا استمرت المشكلة حتى بعد اتّباع التعليمات أعلاه، اجمع معلومات التشخيص التالية، ثم تواصَل مع فريق الدعم في Apigee Edge:

إذا كنت مستخدمًا لخدمة السحابة الإلكترونية العامة، يُرجى تقديم المعلومات التالية:

  • اسم المؤسسة
  • اسم البيئة
  • اسم خادم وكيل لواجهة برمجة التطبيقات
  • أكمِل الأمر curl المستخدَم لإعادة إنتاج 500 Internal Server Error مع رمز الخطأ protocol.http.BadFormData
  • ملف التتبُّع لطلبات البيانات من واجهة برمجة التطبيقات

إذا كنت مستخدمًا في 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

المراجع