אתם צופים במסמכי התיעוד של 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
- אם גודל נתוני הטופס קטן, הנתונים נשלחים כצמדי מפתח/ערך עם:
- התווים בשני המפתחות מקודדים לפי הכללים שמוסברים ב טפסים – קטע 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, כמו שמוסבר ב Forms - Section 17.13.4.2
גורמים אפשריים
השגיאה הזו מתרחשת רק אם מתקיימים כל התנאים הבאים:
- בקשת ה-HTTP שנשלחת מהלקוח אל Apigee Edge מכילה:
-
Content-Type: application/x-www-form-urlencodedוגם - נתוני טופס עם סימן האחוז (
%), או סימן האחוז (%) ואחריו תווים הקסדצימליים לא תקינים שאסורים לפי טפסים – סעיף 17.13.4.1.
-
ה-API proxy ב-Apigee Edge קורא את הפרמטרים הספציפיים של הטופס שמכילים תווים שאסור להשתמש בהם בתהליך הבקשה באמצעות ExtractVariables או מדיניות AssignMessage.
לדוגמה, אם נתוני הטופס מכילים את סימן האחוז (
%) כמו שהוא (ללא קידוד) או את סימן האחוז (%) ואחריו תווים הקסדצימליים לא תקינים במפתח או בערך, תוצג השגיאה הזו.אלה הסיבות האפשריות לשגיאה הזו:
סיבה תיאור הוראות לפתרון בעיות שרלוונטיות ל פרמטרים של טופס בבקשה מכילים תווים שאסור להשתמש בהם פרמטרים של הטופס שמועברים כחלק מבקשת ה-HTTP על ידי הלקוח מכילים תווים שאסור להשתמש בהם. משתמשים ב-Edge Public Cloud וב-Edge Private Cloud
שלבים נפוצים לאבחון
כדי לאבחן את השגיאה הזו, אפשר להשתמש באחד מהכלים או מהטכניקות הבאים:
API Monitoring
כדי לאבחן את השגיאה באמצעות הכלי 'מעקב אחר API':
- נכנסים לממשק המשתמש של Apigee Edge כמשתמש עם תפקיד מתאים.
עוברים לארגון שבו רוצים לבדוק את הבעיה.
- עוברים לדף Analyze > API Monitoring > Investigate.
- בוחרים את מסגרת הזמן הספציפית שבה נתקלת בשגיאות.
משרטטים את קוד התקלה מול הזמן.
בוחרים תא עם קוד השגיאה
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 נכשלה במהלך קריאה או חילוץ של פרמטרים של הטופס.
כלי המעקב
כדי לאבחן את השגיאה באמצעות הכלי Trace:
- מפעילים את trace session
ואחת מהאפשרויות הבאות:
- ממתינים להתרחשות השגיאה
500 Internal Server Error, או - אם אפשר לשחזר את הבעיה, מבצעים את הקריאה ל-API כדי לשחזר את הבעיה
500 Internal Server Error
- ממתינים להתרחשות השגיאה
מוודאים שהאפשרות הצגת כל פרטי הזרימה מופעלת:
- בוחרים אחת מהבקשות שנכשלו ובודקים את המעקב.
- אפשר לנווט בין השלבים השונים של ה-trace ולמצוא את המקום שבו הכשל התרחש.
השגיאה בדרך כלל מופיעה באחת מהמדיניות, כמו שמוצג בהמשך:
בדוגמה שלמעלה, שימו לב שהכשל התרחש במדיניות ExtractVariables שנקראת
EV-ExtractFormParams.עוברים אל הרכיב של הזרימה שנקרא Error אחרי המדיניות הספציפית שנכשלה:
- שימו לב לערכים הבאים מהמעקב:
שגיאה:
Bad Form Datastate:
PROXY_REQ_FLOWerror.class:
com.apigee.rest.framework.BadRequestException- הערך של השגיאה
Bad Form Dataמציין שבפרמטרים של הטופס היו תווים שאסור להשתמש בהם. - הערך של המצב
PROXY_REQ_FLOW,מציין שהשגיאה התרחשה בתהליך הבקשה של proxy ל-API.
- הערך של השגיאה
- עוברים לשלב AX (נתוני Analytics שתועדו) במעקב ולוחצים עליו.
גוללים למטה לקטע 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 לא ריק. השגיאה הזו מציינת שהיא התרחשה בזמן שהמדיניות הספציפית שצוינה ב-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-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.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באמצעות API Monitoring, הכלי Trace או יומני הגישה של NGINX, כמו שמוסבר בשלבים נפוצים לאבחון. - אם Fault Code הוא
protocol.http.BadFormData, Fault Source הואproxyאוpolicy, ו-Fault Policy לא ריק, המשמעות היא שהמדיניות שצוינה ב-Fault 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:
אם אתם משתמשי ענן ציבורי, עליכם לספק את הפרטים הבאים:
- שם הארגון
- שם הסביבה
- שם ה-proxy ל-API
- הפקודה
curlהמלאה ששימשה לשחזור500 Internal Server Errorעם קוד השגיאהprotocol.http.BadFormData - קובץ מעקב לבקשות ה-API
אם אתם משתמשים ב-Private Cloud, עליכם לספק את הפרטים הבאים:
- הודעת השגיאה המלאה שזוהתה בבקשות שנכשלו
- שם הסביבה
- חבילת proxy ל-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