שגיאה לא ידועה בחלונית 'נסה את ממשק ה-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.

זוהי הודעת שגיאה כללית שמופיעה בכרטיסייה 'כלים למפתחים' > 'מסוף':

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

גורמים אפשריים

סיבה התיאור ההוראות לפתרון בעיות הרלוונטיות עבור
אשמת מדיניות שלא טופלה תגובת השגיאה שמוגדרת כברירת מחדל נשלחת ללא כותרות CORS, אם מדיניות כלשהי נכשלת בתהליך זמן הריצה של בקשת ה-API. משתמשי Edge Public Cloud
ערכים מרובים של Access-Control-Allow-Origin שימוש ב'הוספה' במקום באפשרות 'הגדרה' ב-'הקצאת מדיניות הודעות'. משתמשי Edge Public Cloud

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

אבחון

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

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

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

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

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

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

רזולוציה

  1. במקום להסתמך על הודעת השגיאה שמוגדרת כברירת מחדל, צריך להטמיע כלל תקלה כדי לטפל בתגובת השגיאה. צריך לכלול מדיניות של assignMessage CORS בכותרות מתאימות, ולהפעיל אותה ב- FaultRule.
  2. לפעמים לא ניתן להגדיר כלל ברירת מחדל לכל תקלה. לכן, ניתן להטמיע כלל ברירת מחדל שבעזרתו תוכלו להפעיל את מדיניות assignMessage CORS:
<?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 במעקב נראה כך:
    *,*
    , המשמעות היא ששרת היעד והמדיניות assignMessage CORS מגדירים את הערך שלו.
  4. מצב כזה יכול לקרות אם משתמש השתמש ב- <Add> element ל-Access-Control-Allow-Origin במדיניות, או אם בקצה העורפי עצמו הוגדרו כמה ערכים.

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

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

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

דוגמה לערך יחיד, לחץ להצגת תמונה גדולה יותר דוגמה לערך יחיד

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

דוגמה באמצעות &#39;הוסף&#39;, &#39;לחץ&#39; להצגת תמונה גדולה יותר דוגמה לשימוש בהוספה

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

דוגמה לשימוש ב-Set, לחץ להצגת תמונה גדולה יותר דוגמה לשימוש ב-Set

רזולוציה

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