אתם צופים במסמכי התיעוד של Apigee Edge.
כדאי לעיין במסמכי התיעוד של Apigee X. מידע
תיאור הבעיה
אפליקציית הלקוח מקבלת קוד סטטוס של HTTP 500 Internal Server Error עם קוד השגיאה protocol.http.BadPath כתגובה לקריאות ל-API.
הודעת שגיאה
אפליקציית הלקוח מקבלת את קוד התגובה הבא:
HTTP/1.1 500 Internal Server Error
בנוסף, יכול להיות שתופיע הודעת השגיאה הבאה:
{
"fault":{
"faultstring":"Invalid request path",
"detail":{
"errorcode":"protocol.http.BadPath"
}
}
}גורמים אפשריים
השגיאה הזו מתרחשת אם כתובת ה-URL של הבקשה של השרת העורפי, שמיוצגת על ידי משתנה הזרימה target.url, מכילה path שמתחיל בסימן שאלה (?) במקום בקו נטוי (/), וזה לא תקין.
בהתאם למפרטים RFC 3986, section 3: Syntax Components and RFC 3986, section 3.3: Path:
התחביר של ה-URI כולל את הרכיבים הבאים:
foo://example.com:8042/over/there?name=ferret#nose \_/ \______________/\_________/ \_________/ \__/ | | | | | scheme authority path query fragment- רכיב
pathהוא חובה, והוא חייב להתחיל בקו נטוי (/) ולכלול אותו תמיד.
לכן, אם כתובת ה-URL של הבקשה לשרת העורפי כוללת רכיב path שמתחיל בסימן שאלה (?) במקום בקו נטוי (/), Apigee Edge מגיב עם 500 Internal Server Error וקוד השגיאה protocol.http.BadPath.
לדוגמה: אם הערך של target.url הוא https://www.mocktarget.apigee.net?json, השגיאה הזו מתרחשת כי הערך של path הוא לא תקין,כי הוא מתחיל בסימן שאלה (?) במקום בקו נטוי (/).
| סיבה | תיאור | הוראות לפתרון בעיות שרלוונטיות ל |
|---|---|---|
| הנתיב בכתובת ה-URL של שרת הקצה העורפי (target.url) לא תקין | רכיב הנתיב בכתובת ה-URL של השרת העורפי שמיוצג על ידי משתנה של זרימת נתונים target.url מתחיל בסימן שאלה (?) במקום בלוכסן (/). |
משתמשים ב-Edge Public Cloud וב-Edge Private Cloud |
שלבים נפוצים לאבחון
כדי לאבחן את השגיאה הזו, אפשר להשתמש באחד מהכלים או מהטכניקות הבאים:
API Monitoring
תהליך מספר 1: שימוש ב-API Monitoring
כדי לאבחן את השגיאה באמצעות הכלי 'מעקב אחר API':
- נכנסים לממשק המשתמש של Apigee Edge בתור משתמש עם תפקיד מתאים.
עוברים לארגון שבו רוצים לבדוק את הבעיה.
- עוברים לדף Analyze > API Monitoring > Investigate.
- בוחרים את מסגרת הזמן הספציפית שבה נתקלת בשגיאות.
משרטטים את קוד התקלה מול הזמן.
בוחרים תא עם קוד השגיאה
protocol.http.BadPathכמו שמוצג למטה:
המידע על קוד התקלה
protocol.http.BadPathמוצג כמו בדוגמה הבאה:
לוחצים על הצגת יומנים ומרחיבים את השורה של הבקשה שנכשלה.
- בחלון יומנים, רושמים את הפרטים הבאים:
- קוד סטטוס:
500 - מקור התקלה:
target - קוד תקלה:
protocol.http.BadPath
- קוד סטטוס:
- אם מקור השגיאה הוא
targetוקוד השגיאה הואprotocol.http.BadPath, זה מצביע על כך שלכתובת ה-URL של השרת העורפי יש נתיב לא תקין.
מעקב
תהליך מספר 2: שימוש בכלי המעקב
כדי לאבחן את השגיאה באמצעות הכלי Trace:
- מפעילים את trace session ואת אחת מהאפשרויות הבאות:
- ממתינים להתרחשות השגיאה
500 Internal Server Error, או - אם אפשר לשחזר את הבעיה, מבצעים את הקריאה ל-API כדי לשחזר את הבעיה
500 Internal Server Error
- ממתינים להתרחשות השגיאה
מוודאים שהאפשרות הצגת כל פרטי הזרימה מופעלת:

- בוחרים אחת מהבקשות שנכשלו ובודקים את המעקב.
- עוברים בין השלבים השונים של ה-trace ומאתרים את המקום שבו התרחשה הכשל.
בדרך כלל השגיאה מופיעה בתהליך אחרי השלב Target Request Flow Started כמו שמוצג בהמשך:

שימו לב לערך השגיאה מהמעקב:
error: Invalid request path
השגיאה מופקת על ידי Apigee Edge אחרי השלב Target Request Flow Started, ולכן היא מציינת שלכתובת ה-URL של שרת הקצה העורפי יש נתיב לא תקין. זה קורה בדרך כלל אם המשתנה של הזרימה
target.url(שמייצג את כתובת ה-URL של שרת הקצה העורפי) ב-Apigee Edge עודכן בנתיב לא תקין דרך אחת ממדיניות הבקשות בזרימת הבקשות של היעד.- בודקים את הקטע Variables Read and Assigned (משתנים שנקראו והוקצו) בכל אחד מהזרימות אחורה מהזרימה שבה התרחשה השגיאה לכיוון השלב Target Request Flow Started (התחילה זרימת בקשת היעד).
- מגדירים את המדיניות, שבה משתנה הזרימה
target.urlwas updated:דוגמה למעקב שמראה שמדיניות JavaScript עדכנה את משתנה הזרימה
target.url:
בדוגמה שלמעלה, שימו לב שהערך של משתנה הזרימה variable
target.urlמתעדכן במדיניות JavaScript בשםJS- SetTargetURLבאופן הבא:target.url : https://mocktarget.apigee.net?json - שימו לב שהערך ב-
target.urlכולל את הרכיבים הבאים:- scheme:
https - authority:
mocktarget.apigee.net - path:
?json
- scheme:
- מכיוון שרכיב הנתיב מתחיל בסימן שאלה (
?) ולא בקו נטוי (/), מוצגת השגיאהInvalid request path. - עוברים לשלב AX (נתוני Analytics שתועדו) בנתוני המעקב ולוחצים עליו.
גוללים למטה לקטע Phase Details - Error Headers וקובעים את הערכים של X-Apigee-fault-code ו-X-Apigee-fault-source כמו שמוצג בהמשך:

הערכים של X-Apigee-fault-code ו-X-Apigee-fault-source יהיו
protocol.http.BadPathו-targetבהתאמה, מה שמציין שהשגיאה הזו נגרמת כי הנתיב של כתובת ה-URL של שרת הקצה העורפי לא תקין.כותרות תגובה ערך X-Apigee-fault-code protocol.http.BadPathX-Apigee-fault-source target
NGINX
תהליך מספר 3: שימוש ביומני גישה של 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.BadPathבמהלך פרק זמן מסוים (אם הבעיה התרחשה בעבר) או אם יש בקשות שעדיין נכשלות עם500. אם מצאתם שגיאות
500עם X-Apigee-fault-code שמתאים לערך שלprotocol.http.BadPath, צריך לקבוע את הערך של X-Apigee-fault-source.דוגמה לשגיאה 500 מיומן הגישה של NGINX:
בדוגמה שלמעלה מיומן הגישה של NGINX, הערכים של X-Apigee-fault-code ושל X-Apigee-fault-source הם:
כותרות ערך X-Apigee-fault-code protocol.http.BadPathX-Apigee-fault-source targetשימו לב לערכים של X-Apigee-fault-code ו-X-Apigee-fault-source שהם
protocol.http.BadPathו-targetבהתאמה. הערכים האלה מציינים שהשגיאה נגרמת בגלל שכתובת ה-URL של שרת הקצה העורפי כוללת נתיב לא תקין.
הסיבה: הנתיב בכתובת ה-URL של שרת הקצה העורפי (target.url) לא תקין
אבחון
- קובעים את קוד השגיאה ואת מקור השגיאה של
500 Internal Server Errorבאמצעות API Monitoring, Trace Tool או יומני גישה של NGINX, כמו שמוסבר בשלבים נפוצים לאבחון. - אם קוד השגיאה הוא
protocol.http.BadPathולמקור השגיאה יש את הערךtarget, זה מצביע על כך שלכתובת ה-URL של שרת הקצה העורפי יש נתיב לא תקין. כתובת ה-URL של שרת הקצה העורפי מיוצגת על ידי משתנה הזרימה
target.urlב-Apigee Edge. השגיאה הזו מתרחשת בדרך כלל אם מנסים לעדכן את כתובת ה-URL של שרת הקצה העורפי (target.url) באופן דינמי באמצעות אחת ממדיניות (בתוך proxy/shared flow) בתהליך בקשת היעד, כך שיהיה לה נתיב לא תקין.כדי לקבוע אם משתנה הזרימה
target.urlאכן מכיל נתיב לא תקין ואת המקור של הערך שלו, אפשר להשתמש באחת מהשיטות הבאות:מעקב
שימוש בכלי Trace
אם צילמתם את הנתונים של השגיאה הזו, אתם יכולים לפעול לפי השלבים שמפורטים במאמר בנושא שימוש בכלי Trace .
- בודקים אם הנתיב של
target.urlלא תקין, כלומר אם הוא מתחיל בסימן שאלה (?) במקום בלוכסן (/). אם כן, צריך לברר איזו מדיניות שינתה או עדכנה את הערך של
target.urlכך שיכלול נתיב לא תקין.דוגמה למעקב שמראה שמדיניות JavaScript עדכנה את משתנה הזרימה
target.url
- בדוגמה שלמעלה של מעקב, אפשר לראות שמדיניות JavaScript שינתה או עדכנה את הערך של
target.urlכך שיכיל נתיב לא תקין. - שימו לב ש-
target.urlכולל את הרכיבים הבאים:- scheme:
https - authority:
mocktarget.apigee.net - path:
?json
הנתיב מתחיל בסימן שאלה (
?) במקום בקו נטוי קדימה (/), ולכן הוא לא תקין. - scheme:
יומנים
שימוש ביומנים בשרת היומנים
- אם אין לכם מעקב לשגיאה הזו (בעיה לסירוגין), אתם יכולים לבדוק אם רשמתם ביומן את המידע על הערך של משתנה הזרימה
target.url, באמצעות מדיניות כמו MessageLogging או ServiceCallout בשרת היומן. - אם יש לכם את היומנים, כדאי לעיין בהם ולנסות
- בודקים אם הנתיב ב-
target.urlלא תקין, ו - כדאי לבדוק אם אפשר לזהות את המידע לגבי המדיניות ששונתה
target.urlכך שתכלול נתיב לא תקין
- בודקים אם הנתיב ב-
proxy ל-API
בדיקת ה-proxy ל-API שנכשל
אם אין לכם מעקב או יומנים לגבי השגיאה הזו, כדאי לבדוק את שרת ה-proxy של ה-API שנכשל כדי לגלות מה שינה או עדכן את משתנה הזרימה
target.urlכך שיכיל נתיב לא תקין. בדוק את הפרטים הבאים:- המדיניות ב-proxy ל-API
- כל תהליכי העבודה המשותפים שמופעלים מה-proxy
- בודקים אם הנתיב של
צריך לבדוק בקפידה את המדיניות הספציפית (לדוגמה: AssignMessage או JavaScript) שמשנה או מעדכנת את משתנה הזרימה
target.urlולקבוע את הסיבה לעדכוןtarget.urlכך שיהיה לו נתיב לא תקין.הנה כמה דוגמאות למדיניות שמעדכנת את משתנה הזרימה
target.urlבאופן שגוי כך שיכיל נתיב לא תקין שמוביל לשגיאה הזו.דוגמה 1
דוגמה 1: משתנה
target.urlשל עדכון מדיניות JavaScriptvar url = "https://mocktarget.apigee.net?json" context.setVariable("target.url", url);
בדוגמה שלמעלה, שימו לב שמשתנה הזרימה
target.urlמתעדכן בערךhttps://mocktarget.apigee.net?jsonשכלול במשתנה אחרurl..שימו לב שהערך של
urlכולל את הרכיבים הבאים:- scheme:
https - authority:
mocktarget.apigee.net - path:
?json
הנתיב מתחיל בסימן שאלה (
?) במקום בקו נטוי קדימה (/), וזה לא תקין. לכן, Apigee Edge מחזיר500 Internal Server Errorעם קוד השגיאהprotocol.http.BadPath.דוגמה מס' 2
דוגמה 2: עדכון מדיניות JavaScript של המשתנה
target.urlעל סמך הערך ב-request headervar path = context.getVariable("request.header.Path"); var url = "https://mocktarget.apigee.net" + path context.setVariable("target.url", url);
בדוגמה שלמעלה, אפשר לראות שהמשתנה של הזרימה
target.urlמתעדכן על ידי שרשור הערךhttps://mocktarget.apigee.netשכלול במשתנהurlו הערך של משתנה אחרpath, שהערך שלו מאוחזר מ-request.header.Path.אם יש לכם גישה לבקשה או למעקב בפועל, תוכלו לאמת את הערך בפועל שהועבר אל
request.header.Path.בקשה לדוגמה שנשלחה על ידי המשתמש
curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token> -H "Path: ?user"
בדוגמה הזו, נתיב הכותרת לא נשלח כחלק מהבקשה. לכן, הערך של המשתנה
pathבמדיניות JavaScript הואnull.כך:
url = https://mocktarget.apigee.net + pathurl = https://mocktarget.apigee.net + "?user"target.url = https://mocktarget.apigee.net?user
שימו לב שהערך של
target.urlכולל את הרכיבים הבאים:- scheme:
https - authority:
mocktarget.apigee.net - path:
?user
הנתיב מתחיל בסימן שאלה (
?) במקום בקו נטוי קדימה (/), וזה לא תקין. לכן, Apigee Edge מחזיר500 Internal Server Errorעם קוד השגיאהprotocol.http.BadPath.דוגמה #3
דוגמה 3: עדכון המשתנה
target.urlבמדיניות AssignMessage<AssignMessage async="false" continueOnError="false" enabled="true" name="AM-SetTargetURL"> <DisplayName>AM-SetTargetURL</DisplayName> <AssignVariable> <Name>target.url</Name> <Value>https://mocktarget.apigee.net?echo</Value> </AssignVariable> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
שימו לב שהערך של
urlכולל את הרכיבים הבאים:- scheme:
https - authority:
mocktarget.apigee.net - path:
?echo
גם בדוגמה הזו, הנתיב מתחיל בסימן שאלה (
?) במקום בקו נטוי (/), מה שהופך אותו ללא תקין. לכן, Apigee Edge מחזיר את קוד השגיאה500 Internal Server Errorעם קוד השגיאהprotocol.http.BadPath.- scheme:
רזולוציה
בהתאם למפרט כתובות ה-URL,
RFC 3986, section 3: Syntax Components, הרכיב path נדרש
ותמיד צריך להתחיל ב-"/". לכן, צריך לבצע את השלבים הבאים כדי לפתור את הבעיה:
- חשוב לוודא שלכתובת ה-URL של השרת העורפי, שמיוצגת על ידי משתנה הזרימה
target.url, תמיד יש נתיב תקין ושהיא תמיד מתחילה בלוכסן (/).- במקרים מסוימים, יכול להיות שלא יהיה שם משאב בנתיב. במקרה כזה, צריך לוודא שבנתיב יש לפחות קו נטוי (
/). - אם משתמשים במשתנים אחרים כדי לקבוע את הערך של משתנה הזרימה
target.url, צריך לוודא שלמשתנים האחרים אין נתיב לא תקין. - אם מבצעים פעולות על מחרוזת כדי לקבוע את הערך של משתנה הזרימה
target.url, צריך לוודא שלתוצאה או לתוצאה של פעולות המחרוזת אין נתיב לא תקין.
- במקרים מסוימים, יכול להיות שלא יהיה שם משאב בנתיב. במקרה כזה, צריך לוודא שבנתיב יש לפחות קו נטוי (
בדוגמאות שצוינו למעלה, אפשר לפתור את הבעיה באופן הבא:
דוגמה 1
דוגמה 1: משתנה
target.urlשל עדכון מדיניות JavaScriptכדי לפתור את הבעיה, צריך להשתמש בקו נטוי (
/) במקום בסימן שאלה (?) במשתנהurl, כמו בדוגמה הבאה:var url = "https://mocktarget.apigee.net/json" context.setVariable("target.url", url);
דוגמה מס' 2
דוגמה 2: עדכון מדיניות JavaScript של משתנה
target.urlעל סמך הערך ב-request headervar path = context.getVariable("request.header.Path"); var url = "https://mocktarget.apigee.net" + path context.setVariable("target.url", url);
כדי לפתור את הבעיה הזו, צריך לוודא שמעבירים נתיב תקין, למשל:
/userכחלק מכותרת הבקשהPath, כמו שמוצג בהמשך:בקשה לדוגמה:
curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token> -H "Path: /user"
דוגמה #3
דוגמה 3: עדכון המשתנה
target.urlשל מדיניות AssignMessageמוסיפים נתיב תקין לרכיב
<Value>של מדיניות AssignMessage. כלומר, מחליפים את סימן השאלה (?) בקו נטוי (/) ברכיב<Value>ומגדירים אותו לערךhttps://mocktarget.apigee.net/echoכדי לפתור את הבעיה, כמו שמוצג בהמשך:<AssignMessage async="false" continueOnError="false" enabled="true" name="AM-SetTargetURL"> <DisplayName>AM-SetTargetURL</DisplayName> <AssignVariable> <Name>target.url</Name> <Value>https://mocktarget.apigee.net/echo</Value> </AssignVariable> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
מפרט
ב-Apigee Edge, הרכיב
pathבכתובת ה-URL של שרת הקצה העורפי חייב תמיד להתחיל ב קו נטוי (/) כמו שמופיע במפרטים הבאים:מפרט RFC 3986, section 3: Syntax Components RFC 3986, section 3.3: Path אם עדיין דרושה לך עזרה מצוות התמיכה של Apigee, אפשר לעבור אל איסוף חובה של מידע לאבחון.
צריך לאסוף פרטי אבחון
אם הבעיה נמשכת גם אחרי שמבצעים את ההוראות שלמעלה, צריך לאסוף את פרטי האבחון הבאים ואז לפנות לתמיכה של Apigee Edge:
אם אתם משתמשי ענן ציבורי, עליכם לספק את הפרטים הבאים:
- שם הארגון
- שם הסביבה
- שם ה-proxy ל-API
- פקודת
curlמלאה ששימשה לשחזור500 Internal Server Errorעם קוד השגיאהprotocol.http.BadPath - קובץ מעקב לבקשות ה-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
קובצי עזר