شما در حال مشاهده مستندات Apigee Edge هستید.
به مستندات Apigee X مراجعه کنید . اطلاعات
علامت
برنامهی کلاینت، کد وضعیت HTTP با 500 Internal Server Error را به همراه کد خطای protocol.http.BadFormData به عنوان پاسخی برای فراخوانیهای API دریافت میکند.
پیام خطا
برنامهی کلاینت کد پاسخ زیر را دریافت میکند:
HTTP/1.1 500 Internal Server Error
علاوه بر این، ممکن است پیام خطای زیر را مشاهده کنید:
{
"fault":{
"faultstring":"Bad Form Data",
"detail":{
"errorcode":"protocol.http.BadFormData"
}
}
}دادههای فرم
قبل از اینکه به جزئیات عیبیابی این مشکل بپردازیم، بیایید بفهمیم که دادههای فرم چیستند.
دادههای فرم، اطلاعاتی هستند که توسط کاربر معمولاً از طریق یک فرم HTML که دارای عناصری مانند کادر ورودی متن، دکمه یا کادر انتخاب است، ارائه میشوند. دادههای فرم معمولاً به صورت مجموعهای از جفتهای کلید-مقدار به عنوان بخشی از درخواستها یا پاسخهای HTTP ارسال میشوند.
انتقال داده از طریق فرم
- نوع محتوا: application/x-www-form-urlencoded
- اگر اندازه دادههای فرم کوچک باشد، دادهها به صورت جفتهای کلید-مقدار با موارد زیر ارسال میشوند:
- کاراکترهای هر دو کلید طبق قوانین توضیح داده شده در Forms - بخش 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 برای کاراکتر علامت درصد (%) است.
- اگر اندازه دادههای فرم کوچک باشد، دادهها به صورت جفتهای کلید-مقدار با موارد زیر ارسال میشوند:
- نوع محتوا: چندبخشی/فرم-داده
اگر میخواهید حجم زیادی از دادههای دودویی یا متن حاوی کاراکترهای غیر ASCII را ارسال کنید، میتوانید دادهها را با
Content-Type:چندبخشی/فرم-داده، همانطور که در فرمها - بخش 17.13.4.2 توضیح داده شده است، ارسال کنید.
علل احتمالی
این خطا فقط و فقط در صورتی رخ میدهد که تمام شرایط زیر برقرار باشد:
- درخواست HTTP ارسال شده توسط کلاینت به Apigee Edge شامل موارد زیر است:
-
Content-Type: application/x-www-form-urlencodedو - دادههای فرم با علامت درصد (
%) یا علامت درصد (%) و به دنبال آن کاراکترهای هگزادسیمال نامعتبر که طبق فرمها مجاز نیستند - بخش 17.13.4.1 .
-
پروکسی API در Apigee Edge پارامترهای فرم خاص حاوی هر کاراکتری را که استفاده از آن در جریان درخواست با استفاده از ExtractVariables یا سیاست AssignMessage مجاز نیست، میخواند.
برای مثال، اگر دادههای فرم حاوی علامت درصد (
%) به همان صورت (بدون کدگذاری) یا علامت درصد (%) باشند، اگر به دنبال آن کاراکترهای هگزادسیمال نامعتبر در کلید و/یا مقدار وجود داشته باشد، این خطا را دریافت خواهید کرد.در اینجا علل احتمالی این خطا آورده شده است:
علت توضیحات دستورالعملهای عیبیابی قابل اجرا برای پارامترهای فرم در درخواست دارای کاراکترهای غیرمجاز هستند پارامترهای فرم که به عنوان بخشی از درخواست HTTP توسط کلاینت ارسال میشوند، شامل هر کاراکتری هستند که مجاز به استفاده از آنها نیستیم . کاربران فضای ابری عمومی و خصوصی Edge
مراحل تشخیص مشترک
برای تشخیص این خطا از یکی از ابزارها/تکنیکهای زیر استفاده کنید:
نظارت بر API
برای تشخیص خطا با استفاده از مانیتورینگ API:
- به عنوان کاربری با نقش کاربری مناسب، وارد Apigee Edge UI شوید .
به سازمانی که میخواهید مشکل را در آن بررسی کنید، مراجعه کنید.

- به صفحه Analyze > API Monitoring > Investigate بروید.
- بازه زمانی خاصی را که در آن خطاها را مشاهده کردهاید، انتخاب کنید.
رسم کد خطا در مقابل زمان .
سلولی را انتخاب کنید که کد خطا
protocol.http.BadFormDataمانند تصویر زیر داشته باشد:
اطلاعات مربوط به کد خطا
protocol.http.BadFormDataبه صورت زیر نمایش داده میشود:
روی «مشاهده گزارشها» کلیک کنید و ردیف مربوط به درخواست ناموفق را باز کنید.

- از پنجره Logs ، جزئیات زیر را یادداشت کنید:
- کد وضعیت:
500 - منبع خطا:
proxy - کد خطا:
protocol.http.BadFormData - خطمشی خطا:
extractvariables/EV-ExtractFormParams
- کد وضعیت:
- اگر منبع خطا
proxy، کد خطاprotocol.http.BadFormDataو خطمشی خطا غیرتهی باشد، نشان میدهد که خطا در حالی رخ داده است که خطمشی خاص مشخصشده در خطمشی خطا ، در حال خواندن یا استخراج دادههای فرم (پارامترهای فرم) بوده است که دارای کاراکترهای غیرمجاز برای استفاده بودهاند. - در این مثال، X-Apigee-fault-policy برابر است
extractvariables/EV- ExtractFormParams,که به این معنی است که سیاست ExtractVariables با نام EV-ExtractFormParams هنگام خواندن یا استخراج پارامترهای فرم با شکست مواجه شده است.
ابزار ردیابی
برای تشخیص خطا با استفاده از ابزار Trace:
- جلسه ردیابی را فعال کنید و یکی از موارد زیر را انجام دهید:
- منتظر بمانید تا خطای
500 Internal Server Errorرخ دهد، یا - اگر میتوانید مشکل را دوباره ایجاد کنید، فراخوانی API را برای ایجاد مجدد مشکل
500 Internal Server Errorانجام دهید.
- منتظر بمانید تا خطای
مطمئن شوید که گزینهی Show all FlowInfos فعال است:

- یکی از درخواستهای ناموفق را انتخاب کنید و مسیر پیگیری را بررسی کنید.
- مراحل مختلف ردیابی را طی کنید و محل وقوع خرابی را پیدا کنید.
معمولاً خطا را در یکی از سیاستهایی که در زیر نشان داده شده است، خواهید یافت:

در ردیابی نمونه بالا، توجه داشته باشید که خرابی در سیاست ExtractVariables با نام
EV-ExtractFormParamsرخ داده است.به جریانی با نام خطا (Error) پس از خطمشی خاصی که با شکست مواجه شده است، بروید:

- به مقادیر زیر از مسیر ردیابی توجه کنید:
خطا:
Bad Form Dataحالت:
PROXY_REQ_FLOWکلاس خطا:
com.apigee.rest.framework.BadRequestException- مقدار خطای
Bad Form Dataنشان میدهد که پارامترهای فرم دارای کاراکترهایی هستند که استفاده از آنها مجاز نیست . - مقدار وضعیت
PROXY_REQ_FLOW ,نشان میدهد که خطایی در جریان درخواست پروکسی API رخ داده است.
- مقدار خطای
- در مسیر ردیابی، به مرحله AX (دادههای تحلیلی ثبتشده) بروید و روی آن کلیک کنید.
به پایین اسکرول کنید تا به بخش Phase Details - Error Headers برسید و مقادیر 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 خالی نیست. این نشان میدهد که خطا زمانی رخ داده است که policy خاص مشخص شده در X-Apigee-fault-policy در حال خواندن یا استخراج دادههای فرم (پارامترهای فرم) بوده است، که شامل کاراکترهای غیرمجاز برای استفاده بودهاند.هدرهای پاسخ ارزش کد خطای X-Apigee protocol.http.BadFormDataمنبع گسل X-Apigee policyسیاست تقصیر X-Apigee extractvariables/EV-ExtractFormParams- در این مثال، X-Apigee-fault-policy برابر است
extractvariables/EV- ExtractFormParams,که به این معنی است که سیاست ExtractVariables با نامEV-ExtractFormParamsهنگام خواندن یا استخراج پارامترهای فرم با شکست مواجه شده است.
انجینکس
برای تشخیص خطا با استفاده از گزارشهای دسترسی NGINX:
- اگر شما یک کاربر Private Cloud هستید، میتوانید از گزارشهای دسترسی NGINX برای تعیین اطلاعات کلیدی در مورد
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-code که با مقدارprotocol.http.BadFormDataمطابقت دارد، پیدا کردید، مقدار X-Apigee-fault-source و X-Apigee-fault-policy را تعیین کنید.نمونه خطای ۵۰۰ از لاگ دسترسی NGINX:

ورودی نمونه بالا از لاگ دسترسی NGINX دارای مقادیر زیر برای X-Apigee-fault-code و X-Apigee-fault-source است:
سربرگها ارزش کد خطای X-Apigee protocol.http.BadFormDataمنبع گسل X-Apigee policyسیاست تقصیر X-Apigee extractvariables/EV-ExtractFormParams- توجه داشته باشید که مقادیر X-Apigee-fault-code و X-Apigee-fault-source به
protocol.http.BadFormDataوpolicyهستند.policyبه ترتیب و X-Apigee-fault-policy خالی نیست. این نشان میدهد که خطا در حالی رخ داده است که سیاست خاص مشخص شده در X-Apigee-fault-policy، در حال خواندن یا استخراج دادههای فرم (پارامترهای فرم) بوده است، که دارای کاراکترهایی بودهاند که استفاده از آنها مجاز نیست . - در این مثال، X-Apigee-fault-policy برابر است
extractvariables/EV- ExtractFormParams,که به این معنی است که سیاست ExtractVariables با نامEV-ExtractFormParamsهنگام خواندن پارامترهای فرم با شکست مواجه شده است.
علت: پارامترهای فرم در درخواست دارای کاراکترهای غیرمجاز هستند
تشخیص
- کد خطا ، منبع خطا و سیاست خطا را برای
500 Internal Server Errorبا استفاده از مانیتورینگ API، ابزار Trace یا گزارشهای دسترسی NGINX، همانطور که در مراحل تشخیص مشترک توضیح داده شده است، تعیین کنید. - اگر کد خطا
protocol.http.BadFormDataباشد، منبع خطا مقدارproxyیاpolicyداشته باشد و Fault Policy خالی نباشد ، این نشان میدهد که سیاست مشخص شده در Fault Policy هنگام خواندن یا استخراج دادههای فرم (پارامترهای فرم) با شکست مواجه شده است. - سیاست ذکر شده در سیاست خطا را بررسی کنید و اطلاعات زیر را تعیین کنید:
- منبع: تعیین میکند که آیا سیاست، دادهها را از درخواست یا پاسخ میخواند یا استخراج میکند.
- پارامترهای فرم: پارامترهای فرم خاصی را که در خطمشی خوانده میشوند، تعیین کنید.
نمونه شماره ۱
نمونه شماره ۱: سیاست 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 ارسال شدهاند، حاوی کاراکترهایی هستند که مجاز به استفاده از آنها نیستیم .نمونه شماره ۲
نمونه شماره ۲: سیاست 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 ارسال میشوند، حاوی کاراکترهایی هستند که مجاز به استفاده از آنها نیستیم .
با استفاده از یکی از روشهای زیر، بررسی کنید که آیا کاراکترهایی وجود دارند که استفاده از آنها در پارامترهای فرم مشخص شده در مرحله ۳ مجاز نباشد :
ابزار ردیابی
برای اعتبارسنجی با استفاده از ابزار Trace:
- اگر همانطور که در مراحل تشخیص مشترک توضیح داده شد، ردپای درخواست ناموفق را ثبت کردهاید، یکی از درخواستهای ناموفق را انتخاب کنید.
- اگر تشخیص دادهاید که پارامترهای فرم حاوی کاراکترهایی هستند که مجاز به استفاده نیستند ، بخشی از درخواست HTTP در مرحله 3 بالا هستند، پس
- به مرحلهی «درخواست دریافتی از کلاینت» بروید.
به بخش جزئیات فاز (Phase Details) بروید و محتوای درخواست (Request Content) را بررسی کنید.

- در مثال بالا، توجه داشته باشید که پارامتر فرم
passwordشامل علامت درصد (%) است. - از آنجایی که علامت درصد (
%) برای کدگذاری درصد کاراکترهای ویژه نیز استفاده میشود، نمیتوان آن را به همین صورت در دادههای فرم استفاده کرد. - بنابراین، Apigee Edge با
500 Internal Server Errorو کد خطایprotocol.http.BadFormDataپاسخ میدهد.
درخواست واقعی
برای اعتبارسنجی با استفاده از درخواست واقعی:
- اگر به درخواست واقعی ارسال شده به سرور هدف دسترسی ندارید، به Resolution بروید.
- اگر به درخواست واقعی ارسال شده به Apigee Edge دسترسی دارید، مراحل زیر را انجام دهید:
- محتوای دادههای فرم را بررسی کنید و ببینید آیا حاوی کاراکترهایی است که استفاده از آنها مجاز نیست ، مانند علامت درصد (
%) یا علامت درصد (%) و به دنبال آن کاراکترهای هگزادسیمال نامعتبر قرار میگیرد.نمونه شماره ۱
نمونه درخواست شماره ۱: دادههای فرم به عنوان بخشی از درخواست
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.نمونه شماره ۲
نمونه درخواست شماره ۲: دادههای فرم در یک فایل ارسال میشوند:
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عنصرpasswordشامل علامت درصد (%) است که نباید به همین صورت در دادههای فرم ارسال شود.
- محتوای دادههای فرم را بررسی کنید و ببینید آیا حاوی کاراکترهایی است که استفاده از آنها مجاز نیست ، مانند علامت درصد (
- در دو مثال بالا، دادههای فرم ارسال شده به عنوان بخشی از درخواست HTTP به Apigee Edge حاوی کاراکترهایی هستند که استفاده از آنها مجاز نیست .
- بنابراین، Apigee Edge با
500 Internal Server Errorو کد خطایprotocol.http.BadFormDataپاسخ میدهد.
وضوح تصویر
- اطمینان حاصل کنید که هرگونه کاراکتر خاص در کلیدها و مقادیر دادههای فرم یا پارامترهای ارسالی به عنوان بخشی از درخواست HTTP توسط کلاینت، همیشه مطابق آنچه در Form Data - application/x-www-form-urlencoded توضیح داده شده است، کدگذاری میشوند.
- برای مثالهای مورد بحث در بالا، میتوانید مشکلات را به صورت زیر برطرف کنید:
نمونه شماره ۱
نمونه شماره ۱: دادههای فرم به عنوان بخشی از درخواست ارسال میشوند:
از کاراکترهای هگزادسیمال معتبری استفاده کنید که با کد ASCII برای یک کاراکتر خاص مطابقت داشته باشند. برای مثال، اگر میخواهید علامت دلار (
$) را ارسال کنید،%24مانند تصویر زیر استفاده کنید:curl -X GET "https://HOSTALIAS/myproxy -H "Content-Type: application/x-www-form-urlencoded" -d "client_id=123456abc123&client_secret=c23578%24"
نمونه شماره ۲
نمونه درخواست شماره ۲: دادههای فرم در یک فایل ارسال میشوند:
curl -X GET "https://HOSTALIAS/myproxy -H "Content-Type: application/x-www-form-urlencoded" -d @form_data.xml
محتویات form_data.xml:
از کدگذاری درصد برای علامت درصد (
%) استفاده کنید، یعنی فایل را طوری تغییر دهید که%25داشته باشد.%25همانطور که در زیر نشان داده شده است:xml=<user><username>abc1234@google.com</username><password>qwerty12345!!@#$%25</password></user>
مشخصات
Apigee Edge انتظار دارد که دادههای فرم طبق مشخصات زیر ارسال شوند:
| مشخصات |
|---|
| دادههای فرم - application/x-www-form-urlencoded |
اگر هنوز به هرگونه کمکی از پشتیبانی Apigee نیاز دارید، به بخش «باید اطلاعات تشخیصی را جمعآوری کنید» بروید.
باید اطلاعات تشخیصی جمعآوری کند
اگر مشکل حتی پس از دنبال کردن دستورالعملهای بالا ادامه داشت، اطلاعات تشخیصی زیر را جمعآوری کنید و سپس با پشتیبانی Apigee Edge تماس بگیرید:
اگر کاربر فضای ابری عمومی هستید، اطلاعات زیر را ارائه دهید:
- نام سازمان
- نام محیط
- نام پروکسی API
- دستور
curlکامل که برای تولید مجدد500 Internal Server Errorبا کد خطاprotocol.http.BadFormDataاستفاده میشود. - فایل ردیابی برای درخواستهای API
اگر کاربر Private Cloud هستید، اطلاعات زیر را ارائه دهید:
- پیام خطای کامل مشاهده شده برای درخواستهای ناموفق
- نام محیط
- بسته پروکسی API
- فایل ردیابی برای درخواستهای API
گزارشهای دسترسی 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