כרגע מוצג התיעוד של 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 Monitoring
כדי לאבחן את השגיאה באמצעות API Monitoring:
- נכנסים לממשק המשתמש של Apigee Edge בתור משתמשים שיש להם תפקיד מתאים.
עוברים לארגון שבו רוצים לבדוק את הבעיה.
- עוברים לדף ניתוח > API Monitoring > חקירה.
- בוחרים את מסגרת הזמן הספציפית שבה הבחנתם בשגיאות.
יש להציב את קוד השגיאה ביחס ל-Time.
צריך לבחור תא שמכיל את קוד השגיאה
protocol.http.EmptyPath
כפי שמוצג כאן:מידע על קוד התקלה
protocol.http.EmptyPath
מוצג באופן הבא:לוחצים על View Logs (הצגת היומנים) כדי להרחיב את השורה של הבקשה שנכשלה.
- בחלון Logs, שימו לב לפרטים הבאים:
- קוד סטטוס:
500
- מקור התקלה:
target
- קוד שגיאה:
protocol.http.EmptyPath
- קוד סטטוס:
- אם Fault Source הוא
target
וקוד התקלה הואprotocol.http.EmptyPath
, המשמעות היא שכתובת ה-URL של שרת הקצה העורפי היא נתיב ריק.
נתוני מעקב
הליך מס' 2: שימוש בכלי המעקב
כדי לאבחן את השגיאה באמצעות כלי המעקב:
- מפעילים את סשן המעקב ואז
- להמתין עד שהשגיאה
500 Internal Server Error
תתרחש, או - אם הצלחת לשחזר את הבעיה, יש לבצע את הקריאה ל-API כדי לשחזר את הבעיה
500 Internal Server Error
- להמתין עד שהשגיאה
יש לוודא שהאפשרות Show allflowInfos מופעלת:
- בוחרים אחת מהבקשות שנכשלו ובודקים את המעקב.
- אפשר לנווט בשלבים השונים של המעקב ולאתר את המיקום שבו אירעה הכשל.
השגיאה מופיעה בדרך כלל בזרימה אחרי השלב התהליך של בקשת יעד שהתחיל כפי שמוצג כאן:
יש לשים לב לערך השגיאה מתוך המעקב.
שגיאה: נתיב הבקשה לא יכול להיות ריק
מכיוון ש-Apigee Edge יוצר את השגיאה אחרי השלב התחיל תהליך של בקשת יעד, המשמעות היא שה-
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) במעקב ולוחצים עליו.
גוללים למטה לקטע Phase Details – Error Headers ומוצאים את הערכים של X-Apigee-fault-code ו-X-Apigee-fault-source.
- הערכים של X-Apigee-fault-code ושל X-Apigee-fault-source יופיעו כ-
protocol.http.EmptyPath
וגםtarget
בהתאמה, כדי לציין שהשגיאה הזו נגרמת כי כתובת ה-URL של שרת הקצה העורפי מכילה נתיב ריק.כותרות תגובה Value 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:
כותרות Value 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)
אבחון
- קובעים את קוד התקלה ואת מקור התקלה של
500 Internal Server Error
באמצעות API Monitoring, כלי המעקב או יומני גישה של NGINX, כמו שמוסבר בשלבים הנפוצים לאבחון. - אם קוד ה-Fault הוא
protocol.http.EmptyPath
והמאפיין Fault Source כולל את הערךtarget
, זה אומר שבכתובת ה-URL של שרת הקצה העורפי יש נתיב ריק. כתובת ה-URL של שרת הקצה העורפי מיוצגת על ידי משתנה הזרימה
target.url
ב-Apigee Edge. השגיאה הזו מופיעה בדרך כלל כשמנסים לעדכן את כתובת ה-URL של שרת הקצה העורפי, כלומרtarget.url
באופן דינמי באמצעות אחד מכללי המדיניות (בתוך שרת ה-Proxy או בתהליך המשותף) בתהליך הבקשה ליעד, כלומר יש בו נתיב ריק.- כדי לבדוק אם משתנה הזרימה
target.url
אכן מכיל נתיב ריק ואת המקור של הערך שלו, יש לפעול לפי השלבים הבאים:נתוני מעקב
שימוש בכלי המעקב
אם תיעדתם נתוני מעקב לשגיאה הזו, עליכם לפעול לפי השלבים שמתוארים במאמר שימוש בכלי המעקב ואז:
- צריך לבדוק אם יש נתיב ריק ב-
target.url
. אם כן, צריך לבדוק איזו מדיניות שינתה או עדכנה את הערך של
target.url
כך שהכיל נתיב ריק.מעקב לדוגמה שמציג מדיניות JavaScript עדכן את משתנה הזרימה
target.url:
- בדוח לדוגמה שלמעלה, אפשר לראות שמדיניות JavaScript שינתה או עדכנה את הערך של
target.url
כך שהיא מכילה נתיב ריק. - שימו לב שהגרסה
target.url
כוללת את הרכיבים הבאים:- סכמה:
https://mocktarget.apigee.net
- path: ריק
- סכמה:
יומנים
שימוש ביומנים בשרת היומנים
- אם אין לכם נתוני מעקב לשגיאה הזו (בעיה זמנית), עליכם לבדוק
אם תיעדתם את המידע לגבי הערך של משתנה הזרימה
target.url
, באמצעות כללי מדיניות כמו MessageLogging או Servicedescription בשרת היומנים שלכם. - אם היומנים נמצאים אצלכם, כדאי לבדוק אותם, ואז:
- צריך לבדוק אם יש נתיב ריק ב-
target.url
. - בודקים אם אפשר לקבוע איזו מדיניות ששונתה ב-
target.url
כדי לכלול נתיב ריק
- צריך לבדוק אם יש נתיב ריק ב-
API מסוג proxy
בדיקת שרת ה-API שנכשל
אם אין לכם מעקב או יומנים לשגיאה הזו, בדקו את שרת ה-proxy הנכשל של ה-API כדי להבין מה שינה או עדכן את משתנה הזרימה
target.url
כך שמכיל נתיב לא חוקי. מומלץ לבדוק ולבצע את הדברים הבאים:- המדיניות בתוך שרת proxy ל-API
- תהליכי עבודה משותפים שהופעלו דרך שרת ה-proxy
- צריך לבדוק אם יש נתיב ריק ב-
יש לבדוק את המדיניות הספציפית (לדוגמה, assignMessage או JavaScript) שמשנה או מעדכנת בקפידה את משתנה הזרימה
target.url
, ולקבוע מה הסיבה לעדכון הנתיב שלtarget.url
כך שהנתיב ריק.הנה כמה כללי מדיניות לדוגמה שמעדכנים את משתנה הזרימה
target.url
בצורה שגויה כדי לכלול נתיב ריק שמוביל לשגיאה הזו.דוגמה מס' 1
דוגמה ראשונה: מדיניות JavaScript שמעדכנת את המשתנה
target.url
var 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
דוגמה שנייה: עדכון המדיניות בנושא JavaScript במשתנה
target.url
var 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
. עליך לבצע את הפעולות הבאות כדי
לפתור את הבעיה:
- חשוב לוודא שכתובת ה-URL של שרת הקצה העורפי, המיוצגת על ידי משתנה הזרימה
target.url
, תמיד כוללת נתיב שאינו ריק.- במקרים מסוימים יכול להיות שלא יהיה שם של משאב בנתיב, צריך לוודא שלפחות קו נטוי יש בנתיב (
/
). - אם אתם משתמשים במשתנים אחרים כדי לקבוע את הערך של משתנה הזרימה
target.url
, חשוב לוודא שלמשתנים אחרים אין נתיב ריק. - אם מבצעים פעולות מחרוזת כדי לקבוע את הערך של משתנה הזרימה
target.url
, צריך לוודא שאין נתיב ריק בתוצאה או בתוצאה של פעולות המחרוזת.
- במקרים מסוימים יכול להיות שלא יהיה שם של משאב בנתיב, צריך לוודא שלפחות קו נטוי יש בנתיב (
- בדוגמאות שנדונו באבחון, אפשר לתקן את הבעיה הזו כפי שמוסבר
בהמשך:
דוגמה מס' 1
דוגמה ראשונה: מדיניות JavaScript שמעדכנת את המשתנה
target.url
כדי לתקן את הבעיה, צריך להוסיף קו נטוי (
/
) למשתנהurl
:var url = "https://mocktarget.apigee.net/" context.setVariable("target.url", url);
דוגמה מס' 2
דוגמה שנייה: עדכון המדיניות בנושא JavaScript במשתנה
target.url
var 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, עליכם לספק את הפרטים הבאים:
- שם הארגון
- שם הסביבה
- שם שרת proxy ל-API
- צריך להשלים את פקודת
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