שגיאה לא ידועה בחלונית 'נסה את ממשק ה-API הזה'

אתם צופים במסמכי התיעוד של 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

הסיבה: תקלה במדיניות שלא טופלה

אבחון

  1. מוודאים שהבעיה מתרחשת רק אם צפויה תגובה שאינה 2XX.
  2. אם הבקשות נכשלות, צריך לוודא שיש מדיניות בתהליך של ה-proxy.
  3. עוקבים אחרי הבקשה ובודקים אם מדיניות עם continueOnError="false" נכשלת ומעלה שגיאה.
    1. אם כן, צריך לבדוק אם AssignMessage CORS policy הופעלה או לא בתהליך של תשובת השגיאה.
    2. אם לא, זה המקור לבעיה.
      הסיבה לכך היא שכאשר מדיניות כלשהי עם הרכיב continueOnError="false" נכשלת, הבקשה נכנסת לתהליך של תשובת שגיאה. אם אין טיפול מפורש בשגיאות בתהליך של תגובת השגיאה, תגובת השגיאה שמוגדרת כברירת מחדל בהתאם למדיניות תישלח בחזרה. תגובת השגיאה הזו לא כוללת כותרות CORS. כתוצאה מכך, הקריאה ל-API מפורטל המפתחים המשולב נכשלת עם Unknown error.

בצילומי המסך הבאים מוצגות דוגמאות להודעות שגיאה ולהודעות הצלחה.

דוגמה להודעת שגיאה בחלונית Try this API בפורטל המשולב ובחלון Trace של ה-proxy:

דוגמה להודעת שגיאה, לוחצים כדי להציג תמונה גדולה יותר הודעת שגיאה לדוגמה

דוגמה להודעת הצלחה בחלונית Try this API בפורטל המשולב ובחלון Trace של ה-proxy:

דוגמה להודעת הצלחה, לחצו כדי לראות תמונה גדולה יותר הודעת הצלחה לדוגמה

רזולוציה

  1. במקום להסתמך על הודעת השגיאה שמוגדרת כברירת מחדל, צריך להטמיע כלל שגיאה כדי לטפל בתגובת השגיאה. כוללים AssignMessage CORS policy עם הכותרות המתאימות ומפעילים אותו ב- FaultRule.
  2. לפעמים לא ניתן להגדיר כלל שגיאה לכל שגיאה, ולכן אפשר להטמיע כלל שגיאה שמוגדר כברירת מחדל כדי להפעיל את מדיניות ה-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

אבחון

  1. בודקים את הערך של הכותרת Access-Control-Allow-Origin ב פעילות מעקב.
  2. אפשר להגדיר רק ערך אחד לכותרת Access-Control-Allow-Origin. הגדרת יותר מערך אחד עלולה לגרום לבעיה ב-CORS, ופורטל המפתחים לא יציג תגובות.
  3. אם הערך של הכותרת Access-Control-Allow-Origin במעקב נראה כך:
    *,*
    המשמעות היא שגם שרת היעד וגם מדיניות ה-CORS של AssignMessage מגדירים את הערך שלה.
  4. זה יכול לקרות אם משתמש השתמש ב- <Add> element בשביל Access-Control-Allow-Origin במדיניות, או אם ה-backend עצמו מגדיר כמה ערכים.

דוגמה ל-Access-Control-Allow-Origin ששווה ל-*,*:

דוגמה לשימוש בכמה ערכים, לחיצה להצגת תמונה גדולה יותר דוגמה לשימוש בכמה ערכים

דוגמה ל-Access-Control-Allow-Origin ששווה ל-*:

דוגמה לערך יחיד שבו נעשה שימוש, לוחצים כדי לראות תמונה גדולה יותר ערך יחיד לדוגמה שנעשה בו שימוש

דוגמה לשימוש ב-<Add>:

דוגמה לשימוש באפשרות 'הוספה', לוחצים כדי לראות תמונה גדולה יותר דוגמה לשימוש בפונקציה Add

דוגמה לשימוש ב-<Set>:

דוגמה לשימוש בפונקציה Set, לוחצים כדי לראות תמונה גדולה יותר דוגמה לשימוש ב-Set

רזולוציה

  1. הגישה המומלצת היא להשתמש ב- <Set> element (במקום ב- <Add> element) בשביל Access-Control-Allow-Origin, כי מותר להשתמש רק בערך אחד.
  2. אפשרות אחרת היא להגדיר את הכותרת 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)