درحال مشاهده اسناد 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 ارسال میشود.
انتقال دادههای فرم
- Content-Type: application/x-www-form-urlencoded
- اگر اندازه دادههای فرم کوچک باشد، دادهها بهصورت جفتهای کلید-مقدار با موارد زیر ارسال میشود:
- نویسههای هر دو کلید طبق قوانین توضیحدادهشده در «فرمها» - بخش ۱۷.۱۳.۴.۱ کدبندی میشوند.
- سرایند
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 ارسال کنید، همانطور که در «فرمها - بخش ۱۷.۱۳.۴.۲» توضیح داده شده است
علل احتمالی
این خطا فقط درصورتی رخ میدهد که همه شرایط زیر برقرار باشد:
- درخواست HTTP که توسط کارخواه به Apigee Edge ارسال میشود شامل موارد زیر است:
-
Content-Type: application/x-www-form-urlencoded، و - دادههای فرم با علامت درصد (
%)، یا علامت درصد (%) بهدنبال نویسههای هگزادسیمال نامعتبر که طبق «فرمها» - بخش ۱۷.۱۳.۴.۱ مجاز نیستند.
-
کارگزار API در Apigee Edge پارامترهای فرم خاصی را که حاوی هرگونه نویسه غیرمجاز برای استفاده در جریان درخواست است بااستفاده از خطمشی ExtractVariables یا AssignMessage میخواند.
برای مثال، اگر دادههای فرم حاوی علامت درصد (
%) بههمین شکل (بدون کدبندی) یا علامت درصد (%) بههمراه هر نویسه هگزادسیمال نامعتبر در کلید و/یا مقدار باشد، این خطا را دریافت میکنید.در اینجا دلایل احتمالی این خطا آورده شده است:
علت شرح دستورالعملهای عیبیابی برای موارد زیر قابلاجرا است پارامترهای فرم در درخواست دارای نویسههای غیرمجاز است پارامترهای فرم که بهعنوان بخشی از درخواست HTTP توسط مشتری ارسال میشوند، حاوی نویسههایی هستند که مجاز نیستند استفاده شوند. کاربران «فضای ابری خصوصی و عمومی لبهای»
مراحل متداول تشخیص خرابی
برای تشخیص این خطا، از یکی از ابزارها/تکنیکهای زیر استفاده کنید:
پایش میانای برنامهسازی کاربردی
برای تشخیص خطا بااستفاده از «پایش API»:
- بهعنوان کاربری با نقش مناسب به سیستم Apigee Edge UI وارد شوید.
به سازمانی که میخواهید مشکل را در آن بررسی کنید بروید.
- به صفحه تجزیهوتحلیل > پایش API > بررسی پیمایش کنید.
- بازه زمانی خاصی را که در آن خطاها را مشاهده کردهاید انتخاب کنید.
رسم کد خطا دربرابر زمان.
سلولی را که کد خطای
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رخ دهد، یا - اگر میتوانید مشکل را بازتولید کنید، برای بازتولید مشکل، تماس API برقرار کنید
500 Internal Server Error
- منتظر بمانید تا خطای
مطمئن شوید که نمایش همه FlowInfos فعال باشد:
- یکی از درخواستهای ناموفق را انتخاب کنید و ردیابی را بررسی کنید.
- در مراحل مختلف ردیابی پیمایش کنید و مکان وقوع خرابی را پیدا کنید.
معمولاً خطا را در یکی از خطمشیها، همانطور که در زیر نشان داده شده است، پیدا خواهید کرد:
در ردیابی نمونه بالا، توجه داشته باشید که خرابی در خطمشی ExtractVariables بهنام
EV-ExtractFormParamsرخ داده است.پساز خطمشی خاصی که ناموفق بوده است، به جاریسازی با نام Error پیمایش کنید:
- مقادیر زیر را از ردیابی یادداشت کنید:
خطا:
Bad Form Dataوضعیت:
PROXY_REQ_FLOWerror.class:
com.apigee.rest.framework.BadRequestException- مقدار خطای
Bad Form Dataنشان میدهد که پارامترهای فرم دارای برخیاز نویسههایی است که مجاز نیستند استفاده شوند. - مقدار وضعیت
PROXY_REQ_FLOW,نشان میدهد که خطا در جریان درخواست کارگزار API رخ داده است.
- مقدار خطای
- به فاز AX (دادههای Analytics ضبطشده) در ردیابی بروید و روی آن کلیک کنید.
به بخش جزئیات فاز - سرایندهای خطا در پایین پیمایش کنید و مقادیر 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:
- اگر کاربر «ابر خصوصی» هستید، میتوانید از گزارشهای دسترسی NGINX برای
تعیین اطلاعات کلیدی درباره
500 Internal Server ErrorHTTP استفاده کنید. گزارشهای دسترسی 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-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هنگام خواندن پارامترهای فرم ناموفق بوده است.
دلیل: پارامترهای فرم در درخواست دارای نویسههای غیرمجاز است
تشخیص
- بااستفاده از «پایش میانای برنامهسازی کاربردی»، ابزار «ردیابی»، یا گزارشهای دسترسی NGINX، همانطور که در مراحل تشخیص خرابی متداول توضیح داده شده است، کد خطا، منبع خطا، و خطمشی خطا را برای
500 Internal Server Errorتعیین کنید. - اگر کد خطا برابر با
protocol.http.BadFormDataباشد، منبع خطا مقدارproxyیا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 ارسال شده است حاوی هرگونه نویسههایی است که مجاز نیستند استفاده شوند.
بررسی کنید که آیا نویسههایی وجود دارد که مجاز نیستند بهعنوان نویسههای استفادهشده در پارامترهای فرم که در مرحله ۳ شناسایی شدهاند استفاده شوند یا نه، بااستفاده از یکی از روشهای زیر:
ابزار ردیابی
برای راستیآزمایی بااستفاده از ابزار «ردیابی»:
- اگر ردیابی درخواست ناموفق را همانطور که در مراحل تشخیص خرابی رایج توضیح داده شده است ضبط کردهاید، یکی از درخواستهای ناموفق را انتخاب کنید.
- اگر تشخیص دادهاید که پارامترهای فرم حاوی نویسههایی است که
استفاده از آنها مجاز نیست و بخشی از درخواست HTTP در
مرحله ۳ بالا است، سپس
- به مرحله درخواست دریافتشده از کارخواه پیمایش کنید.
به بخش جزئیات فاز پیمایش کنید و محتوای درخواست را بررسی کنید.
- در مثال بالا، توجه داشته باشید که پارامتر فرم
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حاوی علامت درصد (%) است که نباید بههمین شکل در دادههای فرم ارسال شود.
- محتوای دادههای فرم را مرور کنید و ببینید آیا حاوی نویسههایی است که
استفاده از آنها مجاز نیست، مثل علامت درصد (
- در دو مثال بالا، دادههای فرم که بهعنوان بخشی از درخواست HTTP به Apigee Edge ارسال شده است حاوی نویسههایی است که استفاده از آنها مجاز نیست.
- بنابراین، Apigee Edge با
500 Internal Server Errorبا کد خطایprotocol.http.BadFormDataپاسخ میدهد.
وضوح
- مطمئن شوید که همه نویسههای ویژه در کلیدها و مقادیر دادههای فرم یا پارامترهایی که بهعنوان بخشی از درخواست HTTP توسط مشتری ارسال میشوند، همیشه طبق آنچه در دادههای فرم - 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را داشته باشد، همانطور که در زیر نشان داده شده است: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استفاده شد - فایل ردیابی برای درخواستهای 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