מוצג המסמך של 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, כמו שמוסבר טפסים – סעיף 17.13.4.2
גורמים אפשריים
השגיאה הזו מתקבלת רק אם כל התנאים הבאים מתקיימים:
- בקשת ה-HTTP שהלקוח שולח ל-Apigee Edge מכילה:
Content-Type: application/x-www-form-urlencoded
, וגם- נתוני טופס עם סימן האחוז (
%
) או סימן האחוז (%
) ולאחר מכן תווים הקסדצימליים לא חוקיים שאינם מותרים לפי טפסים – סעיף 17.13.4.1.
שרת ה-proxy ל-API ב-Apigee Edge קורא את הפרמטרים הספציפיים של הטופס שמכילים תווים כלשהם אי אפשר להשתמש בהם בתהליך הבקשה באמצעות משתני החילוץ או מדיניות AssignMessage.
לדוגמה, אם נתוני הטופס מכילים סימן אחוז (
%
) כפי שהוא (ללא קידוד) או סימן האחוז (%
) ואחריו קוד הקסדצימלי לא חוקי תווים במפתח ו/או בערך, מקבלים את השגיאה הזו.אלה הסיבות האפשריות לשגיאה הזו:
סיבה תיאור הוראות לפתרון בעיות עבור הפרמטרים של הטופס בבקשה כוללים תווים שאסור להשתמש בהם הפרמטרים של הטופס שמועברים כחלק מבקשת ה-HTTP על ידי הלקוח מכילים תווים אסורים לשימוש. משתמשי Edge בענן הציבורי והפרטי
שלבי אבחון נפוצים
יש להשתמש באחד מהכלים או השיטות הבאים כדי לאבחן את השגיאה:
מעקב API
כדי לאבחן את השגיאה באמצעות API Monitoring:
- נכנסים ל-Apigee Edge UI כמשתמש עם תפקיד מתאים.
עוברים לארגון שבו רוצים לחקור את הבעיה.
- מנווטים אל ניתוח > מעקב API > לחקור את הדף.
- בוחרים את מסגרת הזמן הספציפית שבה הבחנתם בשגיאות.
הציגו את קוד התקלה ביחס ל-Time.
צריך לבחור תא עם קוד התקלה
protocol.http.BadFormData
בתור למטה:מידע על קוד התקלה
protocol.http.BadFormData
הוא מוצגת כפי שמוצג כאן:לוחצים על הצגת היומנים ומרחיבים את השורה של הבקשה שנכשלה.
- בחלון יומנים שימו לב לפרטים הבאים:
- קוד סטטוס:
500
- מקור התקלה:
proxy
- קוד התקלה:
protocol.http.BadFormData
- מדיניות תקלות:
extractvariables/EV-ExtractFormParams
- קוד סטטוס:
- אם מקור התקלה הוא
proxy
, קוד השגיאה הוא השדהprotocol.http.BadFormData
ו-Fault Policy לא ריקים, ואז מציין שהשגיאה אירעה בזמן שהמדיניות הספציפית מצוינת בקטע תקלה מדיניות קראה או חילצת את נתוני הטופס (פרמטרים של טופס) שמכילים תווים אסורים לשימוש. - בדוגמה הזו, המדיניות X-Apigee-fault-policy היא
extractvariables/EV- ExtractFormParams,
, והמשמעות היא שמדיניות extractVariables נקראת הפונקציה EV-ExtractFormParams נכשלה במהלך הקריאה או החילוץ של הטופס .
כלי המעקב
כדי לאבחן את השגיאה באמצעות כלי המעקב:
- מפעילים את סשן המעקב
וגם:
- צריך להמתין עד שהשגיאה
500 Internal Server Error
תתרחש, או - אם הצלחתם לשחזר את הבעיה, יש לבצע את הקריאה ל-API כדי לשחזר את הבעיה
500 Internal Server Error
- צריך להמתין עד שהשגיאה
מוודאים שהאפשרות Show all FlowInfos מופעלת:
- בוחרים אחת מהבקשות שנכשלו ובודקים את המעקב.
- לעבור בין השלבים השונים במעקב ולאתר את מקום התקלה אירעה שגיאה.
השגיאה בדרך כלל מופיעה באחד מכללי המדיניות הבאים:
במעקב לדוגמה שלמעלה, שימו לב שהכשל התרחש מדיניות extractVariables בשם
EV-ExtractFormParams
.מנווטים אל התהליך שנקרא שגיאה אחרי המדיניות הספציפית שנכשלה:
- שימו לב לערכים הבאים במעקב:
שגיאה:
Bad Form Data
מדינה (State):
PROXY_REQ_FLOW
error.class:
com.apigee.rest.framework.BadRequestException
- הערך של השגיאה
Bad Form Data
מציין שהטופס כלל כמה תווים אסור להשתמש בהם. - הערך של המצב
PROXY_REQ_FLOW,
מציין השגיאה אירעה בתהליך הבקשה של שרת ה-proxy ל-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.BadFormData
X-Apigee-fault-source policy
X-Apigee-fault-policy extractvariables/EV-ExtractFormParams
- בדוגמה הזו, המדיניות X-Apigee-fault-policy היא
extractvariables/EV- ExtractFormParams,
, והמשמעות היא שמדיניות extractVariables נקראת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:
כותרות ערך 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 היא
extractvariables/EV- ExtractFormParams,
, והמשמעות היא שמדיניות extractVariables נקראתEV-ExtractFormParams
נכשלה במהלך קריאת הטופס .
הסיבה: בפרמטרים של טופס בבקשה יש תווים שאסור להשתמש בהם
אבחון
- מגדירים את Fault Code, Fault Source ומדיניות Fault של
500 Internal Server Error
באמצעות API Monitoring, כלי מעקב או יומני גישה ל-NGINX, כפי שמוסבר בשלבי האבחון הנפוצים. - אם קוד השגיאה הוא
protocol.http.BadFormData
, המאפיין Fault Source כולל הערךproxy
או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
דוגמה שנייה: הקצאה של פרמטרים של טופס להעתקת מדיניות של 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 שלמעלה, ואז
- עוברים לשלב Requested from Client (בקשה שהתקבלה מהלקוח).
גוללים למטה לקטע פרטי השלב ומעיינים בקשת תוכן.
- בדוגמה שלמעלה, שימו לב שפרמטר הטופס
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
דוגמה ראשונה: נתוני טופס שהועברו כחלק מהבקשה:
צריך להשתמש ב-תקינים תווים הקסדצימליים שתואמים לקוד 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:
אם אתם משתמשים ב-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