כרגע מוצג התיעוד של 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
- לכן, למרות שסימן האחוז (
%
) מותר בנתוני הטופס, הוא מפורש כהתחלה של רצף בריחה מיוחד. לכן, אם נתוני הטופס צריכים לכלול את סימן האחוז (%
) במפתח או בערך, יש להעביר אותם בפורמט%25,
שמייצג את קוד ה-ASCII של תו סימן האחוז (%
).
- אם גודל נתוני הטופס קטן, הנתונים נשלחים כצמדי מפתח/ערך עם:
- Content-Type: multi-part/form-data
אם אתם רוצים להעביר כמויות גדולות של נתונים בינאריים או טקסט שמכיל תווים שאינם ASCII, אפשר לשלוח את הנתונים עם
Content-Type:
multipart/form-data כפי שמוסבר טפסים – סעיף 17.13.4.2
גורמים אפשריים
שגיאה זו מתרחשת אך ורק אם כל התנאים הבאים מתקיימים:
- בקשת ה-HTTP שנשלחה על ידי הלקוח ל-Apigee Edge מכילה:
Content-Type: application/x-www-form-urlencoded
, וגם- נתוני טופס עם סימן האחוז (
%
) או סימן האחוז (%
) ואחריו תווים הקסדצימליים לא חוקיים, שאינם מותרים לפי Forms – סעיף 17.13.4.1.
שרת ה-API של ממשק ה-API ב-Apigee Edge קורא את הפרמטרים הספציפיים של הטופס שמכילים תווים שאסור להשתמש בהם בתהליך הבקשה, באמצעות extracts או המדיניות assignMessage.
לדוגמה, אם נתוני הטופס מכילים את סימן האחוז (
%
) כפי שהוא (ללא קידוד) או את סימן האחוז (%
) ולאחריו תווים הקסדצימליים לא חוקיים במפתח ו/או בערך, השגיאה הזו תופיע.אלה הסיבות האפשריות לשגיאה הזו:
סיבה תיאור ההוראות לפתרון בעיות הרלוונטיות עבור בפרמטרים של הטופס בבקשה יש תווים שאסור להשתמש בהם הפרמטרים של הטופס שמועברים כחלק מבקשת ה-HTTP על ידי הלקוח מכילים תווים שאסור להשתמש בהם. משתמשי Edge הציבוריים והפרטיים
שלבים נפוצים באבחון
אפשר להשתמש באחד מהכלים/הטכניקות הבאים כדי לאבחן את השגיאה הזו:
מעקב באמצעות API
כדי לאבחן את השגיאה באמצעות API Monitoring:
- נכנסים לממשק המשתמש של Apigee Edge בתור משתמשים עם תפקיד מתאים.
עוברים לארגון שבו רוצים לבדוק את הבעיה.
- עוברים לדף ניתוח > API Monitoring > חקירה.
- בוחרים את מסגרת הזמן הספציפית שבה הבחנתם בשגיאות.
יש להציב את קוד השגיאה ביחס ל-Time.
צריך לבחור תא שמכיל את קוד השגיאה
protocol.http.BadFormData
כפי שמוצג כאן:מידע על קוד התקלה
protocol.http.BadFormData
מוצג באופן שמוצג למטה:לוחצים על View Logs (הצגת היומנים) ומרחיבים את השורה של הבקשה שנכשלה.
- בחלון Logs, שימו לב לפרטים הבאים:
- קוד סטטוס:
500
- מקור התקלה:
proxy
- קוד שגיאה:
protocol.http.BadFormData
- מדיניות תקלות:
extractvariables/EV-ExtractFormParams
- קוד סטטוס:
- אם Fault Source הוא
proxy
, Fault Code לא יכולה להיות ריקה, זה אומר שהשגיאה אירעה בזמן שהמדיניות הספציפית שצוינה ב-Fault Policy הייתה קריאה או חילוץ של נתוני הטופס (פרמטרים של הטופס), שכוללים תווים שאסור להשתמש בהם.protocol.http.BadFormData
- בדוגמה הזו, הערך של X-Apigee-fault-policy הוא
extractvariables/EV- ExtractFormParams,
, והמשמעות היא שהמדיניות extracts שנקראת EV-extractFormParams נכשלה במהלך הקריאה או החילוץ של הפרמטרים של הטופס.
כלי המעקב
כדי לאבחן את השגיאה באמצעות כלי המעקב:
- מפעילים את הפעלת המעקב
וגם:
- להמתין עד שהשגיאה
500 Internal Server Error
תתרחש, או - אם הצלחת לשחזר את הבעיה, יש לבצע את הקריאה ל-API כדי לשחזר את הבעיה
500 Internal Server Error
- להמתין עד שהשגיאה
יש לוודא שהאפשרות Show allflowInfos מופעלת:
- בוחרים אחת מהבקשות שנכשלו ובודקים את המעקב.
- אפשר לנווט בין השלבים השונים של המעקב ולאתר את המיקום שבו אירעה הכשל.
השגיאה מופיעה בדרך כלל באחד מכללי המדיניות באופן הבא:
במעקב לדוגמה שלמעלה, יש לשים לב שהכשל אירע במדיניות חילוץ משתנים בשם
EV-ExtractFormParams
.מנווטים לתהליך שנקרא שגיאה אחרי המדיניות הספציפית שנכשלה:
- שימו לב לערכים הבאים מהמעקב:
שגיאה:
Bad Form Data
מדינה:
PROXY_REQ_FLOW
error.class:
com.apigee.rest.framework.BadRequestException
- הערך של השגיאה
Bad Form Data
מציין שבפרמטרים של הטופס היו כמה תווים שאסור להשתמש בהם. - הערך של המצב
PROXY_REQ_FLOW,
מציין שהשגיאה אירעה בתהליך הבקשה של שרת ה-API של שרת ה-proxy.
- הערך של השגיאה
- מנווטים לשלב 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 קראה או חלצה את נתוני הטופס (פרמטרים של הטופס), שכוללים תווים שאסור להשתמש בהם.כותרות תגובה Value X-Apigee-fault-code protocol.http.BadFormData
X-Apigee-fault-source policy
X-Apigee-fault-policy extractvariables/EV-ExtractFormParams
- בדוגמה הזו, X-Apigee-fault-policy הוא
extractvariables/EV- ExtractFormParams,
, והמשמעות היא שהמדיניות extracts בשםEV-ExtractFormParams
נכשלה במהלך הקריאה או החילוץ של הפרמטרים של הטופס.
NGINX
כדי לאבחן את השגיאה באמצעות יומני הגישה של NGINX:
- אם אתם משתמשים בענן פרטי, אתם יכולים להשתמש ביומני הגישה של 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:
כותרות Value X-Apigee-fault-code protocol.http.BadFormData
X-Apigee-fault-source policy
X-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, להשתמש בהם. - בדוגמה הזו, הערך של X-Apigee-fault-policy הוא
extractvariables/EV- ExtractFormParams,
, והמשמעות היא שהמדיניות ex-Variables שנקראתEV-ExtractFormParams
נכשלה בזמן קריאת הפרמטרים של הטופס.
הסיבה: בפרמטרים של הטופס בבקשה יש תווים שאסור להשתמש בהם
אבחון
- קובעים את קוד התקלה, מקור התקלה ומדיניות התקלה עבור
500 Internal Server Error
באמצעות מעקב API, כלי המעקב או יומני גישה של NGINX, כמו שמוסבר בשלבים נפוצים לאבחון. - אם Fault Code (קוד תקלה) הוא
protocol.http.BadFormData
, FaultSource מכילים את הערךproxy
אוpolicy
, ו-Fault Policy לא ריקה, זה אומר שהמדיניות שצוינה ב-Fault Policy נכשלה במהלך הקריאה או החילוץ של נתוני הטופס (פרמטרים של טופס). - בודקים את המדיניות שצוינה במדיניות השגיאה וקובעים את הפרטים הבאים:
- Source: יש לקבוע אם המדיניות קוראת או מחלצת את הנתונים מהבקשה או מהתגובה.
- פרמטרים של טופס: קובעים את הפרמטרים הספציפיים של הטופס שנקראים במדיניות.
דוגמה מס' 1
דוגמה 1: המדיניות extracts לחילוץ פרמטרים של טופס:
<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>
במדיניות extracts שלמעלה:
מקור:
request
דבר זה מצוין על ידי הרכיב
<Source>
פרמטרים של הטופס:
username
ו-password
דבר זה מצוין על ידי הרכיב
<Pattern>
שבתוך הרכיב<FormParam>
המשמעות היא שהפרמטרים בטופס
username
ו/אוpassword
שהועברו כחלק מבקשת ה-HTTP על ידי הלקוח אל Apigee Edge מכילים תווים שאסור להשתמש בהם.דוגמה מס' 2
דוגמה 2: מדיניות הקצאה של העתקת פרמטרים של טופס:
<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>
במדיניות extracts שלמעלה:
מקור:
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
בקשה שנייה לדוגמה: נתוני טופס שמועברים בקובץ:
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 שהלקוח מקודד תמיד מקודדים כפי שמוסבר בקטע Form Data - application/x-www-form-urlencoded
- בדוגמאות שצוינו למעלה, תוכלו לתקן את הבעיות באופן הבא:
דוגמה מס' 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
בקשה שנייה לדוגמה: נתוני טופס שמועברים בקובץ:
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:
אם אתם משתמשים ב-Public Cloud, עליכם לספק את הפרטים הבאים:
- שם הארגון
- שם הסביבה
- שם שרת proxy ל-API
- משלימים את פקודת
curl
שמשמשת לשחזור500 Internal Server Error
עם קוד השגיאהprotocol.http.BadFormData
- קובץ מעקב לבקשות API
אם אתם משתמשים בענן פרטי, עליכם לספק את הפרטים הבאים:
- זוהתה הודעת שגיאה מלאה בבקשות שנכשלו
- שם הסביבה
- חבילת 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