אתם צופים במסמכי התיעוד של Apigee Edge.
כדאי לעיין במסמכי התיעוד של Apigee X. מידע
תיאור הבעיה
הקריאה ל-API מפורטל המפתחים המשולב נכשלת עם
Unknown Error או עם תגובה ריקה בחלונית Try this API.
הודעות שגיאה
יכול להיות שתראו תשובה ריקה או את הודעת השגיאה הבאה לבקשות ה-API בפורטל המשולב:
Unknown Error
בכרטיסייה כלים למפתחים > מסוף תופיע השגיאה הבאה:
Access to XMLHTTPRequest at 'API_URL' from origin 'URL_of_Integrated_DevPortal' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
הודעת שגיאה גנרית שמופיעה ב כלים למפתחים > הכרטיסייה 'מסוף' היא:
גורמים אפשריים
| סיבה | תיאור | הוראות לפתרון בעיות שרלוונטיות ל |
|---|---|---|
| Unhandled policy fault | תגובת השגיאה שמוגדרת כברירת מחדל נשלחת ללא כותרות CORS, אם מדיניות כלשהי נכשלת בתהליך זמן הריצה של בקשת ה-API. | משתמשים ב-Edge Public Cloud |
| ערכים מרובים של Access-Control-Allow-Origin | שימוש בפעולה Add במקום בפעולה Set בהקצאת מדיניות הודעות. | משתמשים ב-Edge Public Cloud |
הסיבה: תקלה במדיניות שלא טופלה
אבחון
- מוודאים שהבעיה מתרחשת רק אם צפויה תגובה שאינה
2XX. - אם הבקשות נכשלות, צריך לוודא שיש מדיניות בתהליך של ה-proxy.
-
עוקבים אחרי הבקשה ובודקים אם מדיניות עם
continueOnError="false"נכשלת ומעלה שגיאה. - אם כן, צריך לבדוק אם AssignMessage CORS policy הופעלה או לא בתהליך של תשובת השגיאה.
- אם לא, זה המקור לבעיה.
הסיבה לכך היא שכאשר מדיניות כלשהי עם הרכיבcontinueOnError="false"נכשלת, הבקשה נכנסת לתהליך של תשובת שגיאה. אם אין טיפול מפורש בשגיאות בתהליך של תגובת השגיאה, תגובת השגיאה שמוגדרת כברירת מחדל בהתאם למדיניות תישלח בחזרה. תגובת השגיאה הזו לא כוללת כותרות CORS. כתוצאה מכך, הקריאה ל-API מפורטל המפתחים המשולב נכשלת עםUnknown error.
בצילומי המסך הבאים מוצגות דוגמאות להודעות שגיאה ולהודעות הצלחה.
דוגמה להודעת שגיאה בחלונית Try this API בפורטל המשולב ובחלון Trace של ה-proxy:
דוגמה להודעת הצלחה בחלונית Try this API בפורטל המשולב ובחלון Trace של ה-proxy:
רזולוציה
- במקום להסתמך על הודעת השגיאה שמוגדרת כברירת מחדל, צריך להטמיע כלל שגיאה כדי לטפל בתגובת השגיאה. כוללים AssignMessage CORS policy עם הכותרות המתאימות ומפעילים אותו ב- FaultRule.
- לפעמים לא ניתן להגדיר כלל שגיאה לכל שגיאה, ולכן אפשר להטמיע כלל שגיאה שמוגדר כברירת מחדל כדי להפעיל את מדיניות ה-CORS של AssignMessage:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ProxyEndpoint name="proxy-endpoint-name">
<Description/>
<!-- Add a default fault rule to add CORS -->
<DefaultFaultRule name="fault-rule">
<Step>
<Name>add-cors</Name>
</Step>
</DefaultFaultRule>
<FaultRules/>
<!--
<Flows />
Rest of the proxy definition
-->
</ProxyEndpoint>הסיבה: יש כמה ערכים עבור Access-Control-Allow-Origin
אבחון
- בודקים את הערך של הכותרת Access-Control-Allow-Origin ב פעילות מעקב.
- אפשר להגדיר רק ערך אחד לכותרת Access-Control-Allow-Origin. הגדרת יותר מערך אחד עלולה לגרום לבעיה ב-CORS, ופורטל המפתחים לא יציג תגובות.
- אם הערך של הכותרת Access-Control-Allow-Origin במעקב
נראה כך:
*,*המשמעות היא שגם שרת היעד וגם מדיניות ה-CORS של AssignMessage מגדירים את הערך שלה. - זה יכול לקרות אם משתמש השתמש ב-
<Add> elementבשביל Access-Control-Allow-Origin במדיניות, או אם ה-backend עצמו מגדיר כמה ערכים.
דוגמה ל-Access-Control-Allow-Origin ששווה ל-*,*:
דוגמה ל-Access-Control-Allow-Origin ששווה ל-*:
דוגמה לשימוש ב-<Add>:
דוגמה לשימוש ב-<Set>:
רזולוציה
- הגישה המומלצת היא להשתמש ב-
<Set> element(במקום ב-<Add> element) בשביל Access-Control-Allow-Origin, כי מותר להשתמש רק בערך אחד. - אפשרות אחרת היא להגדיר את הכותרת Access-Control-Allow-Origin רק במקום אחד: או ב מדיניות ה-CORS של AssignMessage או בשרת היעד.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <AssignMessage async="false" continueOnError="false" enabled="true" name="set-cors"> <DisplayName>Set CORS</DisplayName> <FaultRules/> <Properties/> <Set> <Headers> <Header name="Access-Control-Allow-Origin">*</Header> </Headers> </Set> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="response"/> </AssignMessage>
אם עדיין דרושה לך עזרה מצוות התמיכה של Apigee, אפשר לעבור אל איסוף מידע לצורך אבחון.
צריך לאסוף פרטי אבחון
אוספים את נתוני האבחון הבאים ופונים אל התמיכה של Apigee Edge:
- שם הארגון
- שם הסביבה
- שם ה-proxy ל-API
- פקודת curl מלאה שמשמשת לשחזור השגיאה
- קובץ מעקב לבקשות ה-API
- פלט מלא של התגובה משרת היעד או השרת העורפי, כולל גודל המטען הייעודי (payload)