מוצג המסמך של Apigee Edge.
עוברים אל
מסמכי תיעוד של Apigee X. מידע
תיאור הבעיה
אפליקציית הלקוח מקבלת קוד סטטוס HTTP של 500 Internal Server Error עם
את קוד השגיאה protocol.http.EmptyPath כתגובה לקריאות ל-API.
הודעת שגיאה
אפליקציית הלקוח מקבלת את קוד התגובה הבא:
HTTP/1.1 500 Internal Server Error
בנוסף, יכול להיות שתופיע הודעת השגיאה הבאה:
{
"fault":{
"faultstring":"Request path cannot be empty",
"detail":{
"errorcode":"protocol.http.EmptyPath"
}
}
}גורמים אפשריים
השגיאה הזו מתקבלת אם כתובת ה-URL של הבקשה של שרת הקצה העורפי מיוצגת על ידי משתנה הזרימה
target.url, מכיל נתיב ריק.
בהתאם למפרט RFC 3986, סעיף 3: רכיבי תחביר וגם RFC 3986, סעיף 3.3: נתיב:
תחביר ה-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.EmptyPath
לדוגמה: אם target.url מכיל את הערך
https://www.mocktarget.apigee.net, השגיאה הזו מתרחשת
path הרכיב ריק או חסר.
| סיבה | תיאור | הוראות לפתרון בעיות עבור |
|---|---|---|
| בכתובת ה-URL של שרת הקצה העורפי (target.url) יש נתיב ריק | כתובת ה-URL של שרת הקצה העורפי שמיוצגת על ידי משתנה הזרימה target.url מכילה נתיב ריק. |
משתמשי Edge בענן הציבורי והפרטי |
שלבי אבחון נפוצים
יש להשתמש באחד מהכלים או השיטות הבאים כדי לאבחן את השגיאה:
מעקב API
הליך מס' 1: שימוש במעקב API
כדי לאבחן את השגיאה באמצעות API Monitoring:
- נכנסים לממשק המשתמש של Apigee Edge כמשתמש עם תפקיד מתאים.
עוברים לארגון שבו רוצים לחקור את הבעיה.

- מנווטים אל ניתוח > מעקב API > לחקור את הדף.
- בוחרים את מסגרת הזמן הספציפית שבה הבחנתם בשגיאות.
הציגו את קוד התקלה ביחס ל-Time.
צריך לבחור תא עם קוד השגיאה
protocol.http.EmptyPath, כמו בדוגמה הבאה:
מידע על קוד התקלה
protocol.http.EmptyPathמוצג כך מוצגת למטה:
לוחצים על צפייה ביומנים כדי להרחיב את השורה של הבקשה שנכשלה.
- בחלון יומנים שימו לב לפרטים הבאים:
- קוד סטטוס:
500 - מקור התקלה:
target - קוד התקלה:
protocol.http.EmptyPath
- קוד סטטוס:
- אם מקור התקלה הוא
targetו-קוד השגיאה הואprotocol.http.EmptyPath, אז מציין שכתובת ה-URL של שרת הקצה העורפי כוללת נתיב ריק.
Trace
הליך מס' 2: שימוש בכלי המעקב
כדי לאבחן את השגיאה באמצעות כלי המעקב:
- להפעיל את סשן המעקב ואז
- צריך להמתין עד שהשגיאה
500 Internal Server Errorתתרחש, או - אם הצלחתם לשחזר את הבעיה, יש לבצע את הקריאה ל-API כדי לשחזר את הבעיה
500 Internal Server Error
- צריך להמתין עד שהשגיאה
מוודאים שהאפשרות Show all FlowInfos מופעלת:
- בוחרים אחת מהבקשות שנכשלו ובודקים את המעקב.
- צריך לעבור בין השלבים השונים במעקב ולאתר את מקום הכשל.
השגיאה בדרך כלל תופיע בתהליך אחרי שהתחיל תהליך היעד של הבקשה בשלב הבא:
בודקים את ערך השגיאה במעקב.
שגיאה: נתיב הבקשה לא יכול להיות ריק
מכיוון שהשגיאה נוצרה על ידי Apigee Edge אחרי השלב Target Request Flow Started, הוא מציין שה-
pathבכתובת ה-URL של שרת הקצה העורפי ריק. במקרה כזה מתרחשת סבירות גבוהה ביותר אם משתנה הזרימהtarget.url(המייצג את כתובת ה-URL של שרת עורפי ) אולי עודכן עם נתיב ריק דרך אחד מכללי המדיניות ב תהליך הבקשה.- לעיין בסעיף משתנים שנקראו והוקצו בכל אחד מהתהליכים שחוזרים אחורה ספציפית לשלב התחיל תהליך היעד של הבקשה.
קובעים את המדיניות שבה משתנה הזרימה
target.urlמתעדכן.דוח מעקב לדוגמה שמציג את המדיניות בנושא JavaScript עדכנה את משתנה הזרימה
target.url:
במעקב לדוגמה שלמעלה, שימו לב לערך של משתנה הזרימה
target.urlמעודכן במדיניות JavaScript בשם SetTargetURL בתור ככה:target.url : https://mocktarget.apigee.net
- לתשומת ליבכם:
target.urlכולל את הרכיבים הבאים:- סכימה:
https://mocktarget.apigee.net - path: ריק
- סכימה:
- במקרה כזה, תקבלו את השגיאה
Request path cannot be empty. - מנווטים לשלב AX (נתוני Analytics מתועדים) במעקב ולוחצים עליו.
גוללים למטה אל הקטע פרטי שלב - כותרות של שגיאות ומזהים את של X-Apigee-fault-code ו-X-Apigee-fault-source כפי שמוצג כאן:

- הערכים של X-Apigee-fault-code ו-X-Apigee-fault-source יוצגו בתור
protocol.http.EmptyPathו-targetבהתאמה, מציינים השגיאה הזו מתרחשת כי בכתובת ה-URL של שרת הקצה העורפי יש נתיב ריק.כותרות של תשובות ערך X-Apigee-fault-code protocol.http.EmptyPathX-Apigee-fault-source target
NGINX
הליך מס' 3: שימוש ביומני גישה ל-NGINX
כדי לאבחן את השגיאה באמצעות יומני הגישה של NGINX:
- אם אתם משתמשים של ענן פרטי, אתם יכולים להשתמש ביומני הגישה ל-NGINX כדי להבין
את המידע העיקרי על HTTP
500 Internal Server Error. בודקים את יומני הגישה ל-NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log- מחפשים אם יש שגיאות
500עם קוד שגיאהprotocol.http.EmptyPathבמהלך פרק זמן ספציפי (אם הבעיה התרחשה בעבר) או אם יש בקשות שעדיין נכשלות עם500. אם מופיעות שגיאות
500עם התאמה של X-Apigee-fault-code את הערך שלprotocol.http.EmptyPath, ואז קובעים את הערך X-Apigee-fault-source.דוגמה לשגיאה 500 ביומן הגישה ל-NGINX:
הרשומה לדוגמה שלמעלה מיומן הגישה ל-NGINX כוללת את הערכים הבאים עבור X- Apigee-fault-code ו-X-Apigee-fault-source:
כותרות ערך X-Apigee-fault-code protocol.http.EmptyPathX-Apigee-fault-source targetשימו לב שהערכים של X-Apigee-fault-code ו-X-Apigee-fault-source הם
protocol.http.EmptyPathו-targetבהתאמה, מציינים השגיאה הזו מתרחשת כי בכתובת ה-URL של שרת הקצה העורפי יש נתיב ריק.
הסיבה: בכתובת ה-URL של שרת הקצה העורפי (target.url) יש נתיב ריק
אבחון
- מגדירים את Fault Code ואת מקור התקלה של
500 Internal Server Errorבאמצעות API Monitoring, כלי מעקב או יומני גישה ל-NGINX, כמו שמוסבר ב שלבי האבחון הנפוצים. - אם קוד התקלה הוא
protocol.http.EmptyPathו-Fault Source כולל הערךtarget, אז הוא מציין שכתובת ה-URL של שרת הקצה העורפי ריקה . כתובת ה-URL של שרת הקצה העורפי מיוצגת על ידי משתנה הזרימה
target.urlב-Apigee קצה. בדרך כלל, השגיאה הזו קורית כשמנסים לעדכן את כתובת ה-URL של שרת הקצה העורפי, כלומרtarget.urlבאופן דינמי באמצעות כל אחד מכללי המדיניות (בתוך שרת proxy/תהליך משותף) בתהליך הבקשה ליעד, כלומר יש נתיב ריק.- בודקים אם משתנה הזרימה
target.urlאכן מכיל נתיב ריק את הערך של המקור באמצעות אחת מהשלבים הבאים:Trace
שימוש בכלי המעקב
אם תיעדתם מעקב אחרי השגיאה הזו, אתם יכולים לפעול לפי השלבים שמתוארים ב באמצעות כלי המעקב וגם:
- צריך לבדוק אם ב-
target.urlיש נתיב ריק. אם כן, עליך לבדוק איזו מדיניות שינתה או עדכנה את הערך של
target.urlכדי להכיל נתיב ריק.מעקב לדוגמה שמראה את מדיניות JavaScript עדכנה את משתנה הזרימה
target.url:
- במעקב לדוגמה שלמעלה, שימו לב שמדיניות JavaScript שונתה או
עודכן הערך של
target.urlכך שיכלול נתיב ריק. - לתשומת ליבכם:
target.urlכולל את הרכיבים הבאים:- סכימה:
https://mocktarget.apigee.net - path: ריק
- סכימה:
יומנים
שימוש ביומנים בשרת היומנים
- אם אין לך מעקב אחר השגיאה הזו (בעיה זמנית), עליך לבדוק כדי
לבדוק אם תיעדתם את המידע על הערך של משתנה הזרימה
target.url, באמצעות כללי מדיניות כמו MessageLogging או ServiceCallout לשרת היומנים. - אם יש לכם את היומנים, עליכם לבדוק אותם ואז:
- צריך לבדוק אם ב-
target.urlיש נתיב ריק, וגם - בדיקה אם אפשר לקבוע איזו מדיניות שונתה
target.urlלהכיל נתיב ריק
- צריך לבדוק אם ב-
API מסוג proxy
בדיקה של שרת ה-proxy ל-API שנכשלו
אם אין לכם מעקב או יומנים לגבי השגיאה הזו, אתם יכולים לבדוק את ה-API שנכשל שרת proxy כדי לקבוע מה שינה או עדכן את משתנה הזרימה
target.urlכדי להכיל נתיב לא חוקי. בדוק את הפרטים הבאים:- המדיניות בתוך שרת proxy ל-API
- כל תהליכי העבודה המשותפים שהופעלו על ידי שרת ה-proxy
- צריך לבדוק אם ב-
לבדוק את המדיניות הספציפית (לדוגמה, AssignMessage או JavaScript) שמשנה או מעדכנים את משתנה הזרימה
target.urlבקפידה וקובעים את הסיבה לעדכוןtarget.urlמכיל נתיב ריק.לפניכם מספר כללי מדיניות לדוגמה לעדכון משתנה הזרימה
target.urlכך שהוא לא מכיל נתיב ריק שמוביל לשגיאה הזו.דוגמא מס' 1
דוגמה ראשונה: עדכון של משתנה
target.urlבמדיניות JavaScriptvar url = "https://mocktarget.apigee.net" context.setVariable("target.url", url);
בדוגמה שלמעלה, ניתן לראות שמשתנה הזרימה
target.urlמעודכן עם הערךhttps://mocktarget.apigee.netשכלול במשתנה אחרurl.לתשומת ליבכם:
target.urlכולל את הרכיבים הבאים:- סכימה:
https://mocktarget.apigee.net - path: ריק
מכיוון שהנתיב ריק, Apigee Edge מחזירה
500 Internal Server Errorעם קוד שגיאהprotocol.http.EmptyPath.דוגמא מס' 2
דוגמה שנייה: עדכון של משתנה
target.urlבמדיניות JavaScriptvar 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>
בדוגמה הזו, נתיב הכותרת לא נשלח כחלק מהבקשה. לכן, הערך של נתיב המשתנה במדיניות JavaScript הוא
null.כך:
url = https://mocktarget.apigee.net + pathurl = https://mocktarget.apigee.net + nulltarget.url = https://mocktarget.apigee.netnull
לתשומת ליבכם:
target.urlכולל את הרכיבים הבאים:- סכימה:
https://mocktarget.apigee.netnull - path: ריק
דוגמא מס' 3
דוגמה מס' 3: עדכון המדיניות של assignMessage
target.urlבאמצעות משתנה אחר<AssignMessage async="false" continueOnError="false" enabled="true" name=">AM-SetTargetURL"> <DisplayName>AM-SetTargetURL</DisplayName> <AssignVariable> <Name>target.url</Name> <Value>https://mocktarget.apigee.net</Value> </AssignVariable> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
לתשומת ליבכם:
target.urlכולל את הרכיבים הבאים:- סכימה:
https://mocktarget.apigee.net - path: ריק
בכל הדוגמאות שלמעלה, הנתיב בכתובת ה-URL של שרת הקצה העורפי, השדה
target.urlריק, ולכן Apigee Edge מחזירה500 Internal Server Errorעם קוד השגיאהprotocol.http.EmptyPath.- סכימה:
רזולוציה
לפי המפרט
RFC 3986, סעיף 2: רכיבי התחביר, הרכיב path הוא
חובה ותמיד צריך להיות בו קו נטוי (/), גם אם אין
תווים אחרים כחלק מpath. צריך לבצע את השלבים הבאים כדי
כדי לפתור את הבעיה:
- עליך לוודא שכתובת האתר של שרת הקצה העורפי, שמיוצגת על ידי משתנה הזרימה
target.urlתמיד מכיל נתיב שאינו ריק.- במקרים מסוימים אין שם משאב בנתיב, ולכן יש לוודא שהנתיב
מכיל קו נטוי קדימה (
/) לפחות. - אם משתמשים במשתנים אחרים כדי לקבוע את הערך של משתנה הזרימה,
target.url, ולאחר מכן מוודאים שאין נתיב ריק במשתנים אחרים. - אם מבצעים פעולות מחרוזת כלשהן כדי לקבוע את הערך של משתנה הזרימה
target.url, ואז מוודאים שהתוצאה או התוצאה של המחרוזת אין נתיב ריק.
- במקרים מסוימים אין שם משאב בנתיב, ולכן יש לוודא שהנתיב
מכיל קו נטוי קדימה (
- בדוגמאות שמופיעות בקטע אבחון, אפשר לפתור את הבעיה כך:
כפי שמוסבר בהמשך:
דוגמא מס' 1
דוגמה ראשונה: עדכון של משתנה
target.urlבמדיניות JavaScriptכדי לתקן את הבעיה, צריך להוסיף קו נטוי קדימה (
/) למשתנהurlכפי שמוצג בהמשך:var url = "https://mocktarget.apigee.net/" context.setVariable("target.url", url);
דוגמא מס' 2
דוגמה שנייה: עדכון של משתנה
target.urlבמדיניות JavaScriptvar path = context.getVariable("request.header.Path"); var url = "https://mocktarget.apigee.net" + path context.setVariable("target.url", url);
חשוב להעביר נתיב תקין, לדוגמה,
/iloveapisכחלק מ כותרת הבקשהPathכדי לתקן את הבעיה הזו כפי שמוצג בהמשך:בקשה לדוגמה:
curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token> -H "Path: /iloveapis"
דוגמא מס' 3
דוגמה מס' 3: עדכון המדיניות של assignMessage
target.urlבאמצעות משתנה אחרצריך להוסיף נתיב חוקי לרכיב
<Value>של מדיניות AssignMessage. עבור לדוגמה, אפשר להגדיר את/jsonכנתיב של MockTarget API כלומר, לשנות את הרכיב<Value>ל-https://mocktarget.apigee.net/jsonכפי שמוצג בהמשך:<AssignMessage async="false" continueOnError="false" enabled="true" name="AM-SetTargetURL"> <DisplayName>AM-SetTargetURL</DisplayName> <AssignVariable> <Name>target.url</Name> <Value>https://mocktarget.apigee.net/json</Value> </AssignVariable> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
מפרט
Apigee Edge מצפה שלכתובת ה-URL של שרת הקצה העורפי אין נתיב ריק, בהתאם המפרטים הבאים:
| מפרט |
|---|
| RFC 3986, סעיף 3: רכיבי תחביר |
| RFC 3986, סעיף 3.3: נתיב |
אם עדיין דרושה לך עזרה מהתמיכה של Apigee, אפשר לעבור אל חובה לאסוף את פרטי האבחון.
צריך לאסוף את פרטי האבחון
אם הבעיה נמשכת גם לאחר ביצוע ההוראות שלמעלה, יש לאסוף את הפריטים הבאים את נתוני האבחון, ואז פונים לתמיכה של Apigee Edge.
אם אתם משתמשים ב-Public Cloud, עליכם לספק את הפרטים הבאים:
- שם הארגון
- שם הסביבה
- שם ה-API של ה-Proxy
- צריך להשלים את הפקודה
curlשמשמשת לשחזור500 Internal Server Errorעם קוד השגיאהprotocol.http.EmptyPath - קובץ מעקב אחר בקשות ה-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