أنت الآن بصدد الاطّلاع على مستندات 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 أو استجاباته.
نقل بيانات النموذج
- 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 لعلامة النسبة المئوية (%).
- إذا كان حجم بيانات النموذج صغيرًا، يتم إرسال البيانات كأزواج مفتاح/قيمة مع:
- Content-Type: multipart/form-data
إذا أردت نقل كميات كبيرة من البيانات الثنائية أو النصوص التي تحتوي على أحرف غير ASCII، يمكنك إرسال البيانات باستخدام
Content-Type:multipart/form-data كما هو موضّح في النماذج - القسم 17.13.4.2.
الأسباب المحتملة
يحدث هذا الخطأ فقط في حال استيفاء جميع الشروط التالية:
- يتضمّن طلب HTTP الذي يرسله العميل إلى Apigee Edge ما يلي:
-
Content-Type: application/x-www-form-urlencodedو - بيانات النموذج التي تتضمّن علامة النسبة المئوية (
%) أو علامة النسبة المئوية (%) متبوعة بأحرف ست عشرية غير صالحة وغير مسموح بها وفقًا للفقرة 17.13.4.1 من النماذج
-
يقرأ خادم وكيل واجهة برمجة التطبيقات في Apigee Edge مَعلمات النموذج المحدّدة التي تحتوي على أي أحرف غير مسموح باستخدامها في مسار الطلب باستخدام سياسة ExtractVariables أو AssignMessage.
على سبيل المثال، إذا كانت بيانات النموذج تحتوي على علامة النسبة المئوية (
%) كما هي (بدون ترميز) أو علامة النسبة المئوية (%) متبوعة بأي أحرف سداسية عشرية غير صالحة في المفتاح و/أو القيمة، سيظهر لك هذا الخطأ.في ما يلي الأسباب المحتملة لهذا الخطأ:
السبب الوصف تعليمات تحديد المشاكل وحلّها التي تنطبق على تحتوي مَعلمات النموذج في الطلب على أحرف غير مسموح بها تحتوي مَعلمات النموذج التي يتم تمريرها كجزء من طلب HTTP من قِبل العميل على أي أحرف غير مسموح باستخدامها. مستخدمو Edge Public Cloud وEdge Private Cloud
خطوات التشخيص الشائعة
استخدِم إحدى الأدوات أو التقنيات التالية لتشخيص هذا الخطأ:
API Monitoring
لتشخيص الخطأ باستخدام "مراقبة واجهة برمجة التطبيقات"، اتّبِع الخطوات التالية:
- سجِّل الدخول إلى واجهة مستخدم Apigee Edge بصفتك مستخدمًا لديه دور مناسب.
انتقِل إلى المؤسسة التي تريد التحقيق في المشكلة فيها.
- انتقِل إلى صفحة تحليل > مراقبة واجهة برمجة التطبيقات > التحقيق.
- اختَر الفترة الزمنية المحدّدة التي لاحظت فيها الأخطاء.
رسم بياني لرمز الخطأ مقابل الوقت
اختَر الخلية التي تحتوي على رمز الخطأ
protocol.http.BadFormDataكما هو موضح أدناه:
تظهر المعلومات حول رمز الخطأ
protocol.http.BadFormDataكما هو موضّح أدناه:
انقر على عرض السجلات ووسِّع صف الطلب الذي تعذّر تنفيذه.
- من نافذة السجلّات، سجِّل التفاصيل التالية:
- رمز الحالة:
500 - مصدر الخطأ:
proxy - رمز الخطأ:
protocol.http.BadFormData - سياسة الأعطال:
extractvariables/EV-ExtractFormParams
- رمز الحالة:
- إذا كان مصدر الخطأ هو
proxy، وكان رمز الخطأ هوprotocol.http.BadFormDataوكانت سياسة الخطأ غير فارغة، يشير ذلك إلى حدوث الخطأ أثناء قراءة أو استخراج البيانات من النموذج (مَعلمات النموذج) التي تتضمّن أي أحرف غير مسموح باستخدامها، وذلك وفقًا للسياسة المحدّدة في سياسة الخطأ. - في هذا المثال، قيمة X-Apigee-fault-policy هي
extractvariables/EV- ExtractFormParams,، ما يعني أنّ السياسة ExtractVariables التي تحمل الاسم EV-ExtractFormParams تعذّر تنفيذها أثناء قراءة مَعلمات النموذج أو استخراجها.
أداة التتبُّع
لتشخيص الخطأ باستخدام "أداة التتبُّع"، اتّبِع الخطوات التالية:
- فعِّل جلسة التتبُّع
وأي مما يلي:
- انتظِر إلى أن يظهر الخطأ
500 Internal Server Error، أو - إذا كان بإمكانك إعادة إظهار المشكلة، أرسِل طلب بيانات من واجهة برمجة التطبيقات لإعادة إظهار المشكلة
500 Internal Server Error
- انتظِر إلى أن يظهر الخطأ
تأكَّد من تفعيل خيار عرض جميع معلومات FlowInfo:
- اختَر أحد الطلبات التي تعذّر تنفيذها وافحص التتبُّع.
- تنقَّل بين مراحل التتبُّع المختلفة وحدِّد مكان حدوث الخطأ.
سيظهر الخطأ عادةً في إحدى السياسات كما هو موضّح أدناه:
في نموذج التتبُّع أعلاه، لاحظ أنّ الخطأ حدث في سياسة ExtractVariables المسماة
EV-ExtractFormParams.انتقِل إلى التدفق الذي يحمل الاسم Error بعد السياسة المحدّدة التي تعذّر تنفيذها:
- لاحظ قيم ما يلي من التتبُّع:
الخطأ:
Bad Form Dataالولاية:
PROXY_REQ_FLOWerror.class:
com.apigee.rest.framework.BadRequestException- تشير قيمة الخطأ
Bad Form Dataإلى أنّ مَعلمات النموذج تتضمّن بعض الأحرف التي لا يُسمح باستخدامها. - تشير قيمة الحالة
PROXY_REQ_FLOW,إلى أنّ الخطأ حدث في مسار الطلب لخادم وكيل واجهة برمجة التطبيقات.
- تشير قيمة الخطأ
- انتقِل إلى مرحلة AX (تسجيل بيانات الإحصاءات) في التتبُّع وانقر عليها.
انتقِل للأسفل إلى قسم تفاصيل المرحلة - عناوين الأخطاء وحدِّد قيم X-Apigee-fault-code وX-Apigee-fault-source وX-Apigee-fault-policy كما هو موضّح أدناه:
يُرجى العِلم أنّ قيمتَي 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.BadFormDataX-Apigee-fault-source policyX-Apigee-fault-policy extractvariables/EV-ExtractFormParams- في هذا المثال، قيمة X-Apigee-fault-policy هي
extractvariables/EV- ExtractFormParams,، ما يعني أنّ سياسة ExtractVariables التي تحمل الاسمEV-ExtractFormParamsتعذّر تنفيذها أثناء قراءة مَعلمات النموذج أو استخراجها.
NGINX
لتشخيص الخطأ باستخدام سجلّات الوصول إلى NGINX، اتّبِع الخطوات التالية:
- إذا كنت مستخدمًا في Private Cloud، يمكنك استخدام سجلات الوصول إلى NGINX لتحديد المعلومات الأساسية حول HTTP
500 Internal Server Error. تحقَّق من سجلّات الوصول إلى NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log- ابحث لمعرفة ما إذا كانت هناك أي أخطاء
500برمز الخطأprotocol.http.BadFormDataخلال مدة زمنية معيّنة (إذا حدثت المشكلة في الماضي) أو ما إذا كانت هناك أي طلبات لا تزال غير ناجحة مع500. إذا عثرت على أي أخطاء
500تتطابق مع قيمة X-Apigee-fault-codeprotocol.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.BadFormDataX-Apigee-fault-source policyX-Apigee-fault-policy extractvariables/EV-ExtractFormParams- يُرجى العِلم أنّ قيمتَي X-Apigee-fault-code وX-Apigee-fault-source هما
protocol.http.BadFormDataوpolicyعلى التوالي، وأنّ X-Apigee-fault-policy ليست فارغة. يشير ذلك إلى حدوث الخطأ أثناء قراءة أو استخراج بيانات النموذج (مَعلمات النموذج) التي تتضمّن أي أحرف غير مسموح باستخدامها، وذلك أثناء تنفيذ السياسة المحدّدة في X-Apigee-fault-policy. - في هذا المثال، قيمة X-Apigee-fault-policy هي
extractvariables/EV- ExtractFormParams,، ما يعني أنّ سياسة ExtractVariables المسماةEV-ExtractFormParamsتعذّر تنفيذها أثناء قراءة مَعلمات النموذج.
السبب: تحتوي مَعلمات النموذج في الطلب على أحرف غير مسموح بها
التشخيص
- حدِّد رمز الخطأ ومصدر الخطأ وسياسة الخطأ الخاصة بـ
500 Internal Server Errorباستخدام "مراقبة واجهة برمجة التطبيقات" أو أداة "التتبُّع" أو سجلّات الوصول إلى NGINX كما هو موضّح في خطوات التشخيص الشائعة. - إذا كان رمز الخطأ هو
protocol.http.BadFormData، وكان مصدر الخطأ يتضمّن القيمةproxyأوpolicy، وكانت سياسة الخطأ غير فارغة، يشير ذلك إلى أنّ السياسة المحدّدة في سياسة الخطأ تعذّر تنفيذها أثناء قراءة بيانات النموذج أو استخراجها (مَعلمات النموذج). - راجِع السياسة الموضّحة في سياسة الخطأ وحدِّد المعلومات التالية:
- المصدر: حدِّد ما إذا كانت السياسة تقرأ البيانات أو تستخرجها من الطلب أو الرد.
- مَعلمات النموذج: حدِّد مَعلمات النموذج المحدّدة التي تتم قراءتها في السياسة.
العيّنة رقم 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، تحتوي على أي أحرف غير مسموح باستخدامها.
تحقَّق مما إذا كانت هناك أي أحرف غير مسموح باستخدامها في مَعلمات النموذج المحدّدة في الخطوة 3، وذلك باتّباع إحدى الطريقتَين التاليتَين:
أداة التتبُّع
لإثبات صحة البيانات باستخدام أداة "التتبُّع"، اتّبِع الخطوات التالية:
- إذا كنت قد سجّلت التتبُّع للطلب الذي تعذّر تنفيذه كما هو موضّح في خطوات التشخيص الشائعة، اختَر أحد الطلبات التي تعذّر تنفيذها.
- إذا تبيّن لك أنّ مَعلمات النموذج التي تحتوي على أي أحرف غير مسموح باستخدامها هي جزء من طلب HTTP في الخطوة 3 أعلاه، اتّبِع الخطوات التالية:
- انتقِل إلى المرحلة تم استلام الطلب من العميل.
انتقِل إلى قسم تفاصيل المرحلة وراجِع محتوى الطلب.
- في المثال أعلاه، لاحظ أنّ مَعلمة النموذج
passwordتحتوي على علامة النسبة المئوية (%). - بما أنّ علامة النسبة المئوية (
%) تُستخدَم أيضًا في ترميز النسبة المئوية للأحرف الخاصة، لا يمكن استخدامها كما هي في بيانات النموذج. - لذلك، تستجيب Apigee Edge بالرمز
500 Internal Server Errorمع رمز الخطأprotocol.http.BadFormData.
الطلب الفعلي
لإثبات صحة الرمز باستخدام الطلب الفعلي، اتّبِع الخطوات التالية:
- إذا لم يكن بإمكانك الوصول إلى الطلب الفعلي المقدَّم إلى الخادم المستهدف، انتقِل إلى الحلّ.
- إذا كان بإمكانك الوصول إلى الطلب الفعلي الذي تم إرساله إلى Apigee Edge، اتّبِع الخطوات التالية:
- راجِع محتوى بيانات النموذج لمعرفة ما إذا كان يتضمّن أي أحرف غير مسموح باستخدامها، مثل علامة النسبة المئوية (
%) أو علامة النسبة المئوية (%) متبوعة بأحرف سداسية عشرية غير صالحة.العيّنة رقم 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يحتوي على علامة النسبة المئوية (%)، والتي يجب عدم تمريرها كما هي في بيانات النموذج.
- راجِع محتوى بيانات النموذج لمعرفة ما إذا كان يتضمّن أي أحرف غير مسموح باستخدامها، مثل علامة النسبة المئوية (
- في المثالَين أعلاه، تحتوي بيانات النموذج التي تم إرسالها كجزء من طلب HTTP إلى Apigee Edge على أحرف لا يُسمح باستخدامها.
- لذلك، تستجيب Apigee Edge بالرمز
500 Internal Server Errorمع رمز الخطأprotocol.http.BadFormData.
الدقة
- تأكَّد من أنّ أي أحرف خاصة في كل من المفاتيح والقيم الخاصة ببيانات النموذج أو المَعلمات التي يتم إرسالها كجزء من طلب HTTP من خلال العميل يتم ترميزها دائمًا على النحو الموضّح في بيانات النموذج - application/x-www-form-urlencoded.
- بالنسبة إلى الأمثلة الموضّحة أعلاه، يمكنك حلّ المشاكل على النحو التالي:
العيّنة رقم 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