מוצג המסמך של 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.EmptyPath
X-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.EmptyPath
X-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 + path
url = https://mocktarget.apigee.net + null
target.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