הקצאת פתרון בעיות של שגיאות זמן ריצה בהודעות

אתם צופים במסמכי התיעוד של Apigee Edge.
כדאי לעיין במסמכי התיעוד של Apigee X.
מידע

UnresolvedVariable

קוד שגיאה

steps.assignmessage.UnresolvedVariable

גוף התגובה לשגיאה

{
    "fault": {
        "faultstring": "AssignMessage[policy_name]: unable to resolve variable [variable_name]",
        "detail": {
            "errorcode": "steps.assignmessage.UnresolvedVariable"
        }
    }
}

סיבה

השגיאה הזו מתרחשת אם משתנה שצוין במדיניות הקצאת ההודעות הוא:

  • מחוץ להיקף (לא זמין בתהליך הספציפי שבו המדיניות מופעלת) או
  • לא ניתן לפתור (לא מוגדר)

לדוגמה, השגיאה הזו מתרחשת אם המדיניות Assign Message מופעלת בתהליך הבקשה, אבל המאפיין source ברכיב <Copy> מוגדר למשתנה response או error או לכל משתנה מותאם אישית אחר שלא קיים בתהליך הבקשה.

אבחון

  1. מזהים את מדיניות Assign Message שבה אירעה השגיאה ואת שם המשתנה שלא זמין. אפשר למצוא את שני הפריטים האלה ברכיב faultstring של תגובת השגיאה.

    לדוגמה, ב-faultstring הבא, שם המדיניות הוא googleBook והמשתנה הוא var:

    "faultstring": "AssignMessage[googleBook]: unable to resolve variable var"
    
  2. ב-XML של מדיניות ההקצאה של ההודעה שנכשלה, מוודאים שהשם של המשתנה שבו נעשה שימוש זהה לשם המשתנה שזוהה במחרוזת השגיאה (שלב 1 למעלה). לדוגמה, המדיניות הבאה מגדירה את מאפיין המקור ברכיב <Copy> למשתנה בשם var, שתואם למה שמופיע ב-faultstring:

    <AssignMessage async="false" continueOnError="false" enabled="true" name="Assign-Message-1">
       <DisplayName>googleBook</DisplayName>
       <Properties />
       <Copy source="var">
          <Headers>
             <Header name="user-agent" />
          </Headers>
       </Copy>
       <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
       <AssignTo createNew="true" transport="http" type="request">googleBookReq</AssignTo>
    </AssignMessage>
    
  3. בודקים אם המשתנה מוגדר וזמין בתהליך שבו מופעלת המדיניות Assign Message.

  4. אם המשתנה הוא:

    1. מחוץ להיקף (לא זמין בתהליך הספציפי שבו המדיניות מופעלת) או
    2. לא ניתן לפתור (לא מוגדר)

    אז זו הסיבה לשגיאה.

    לדוגמה, נניח שמדיניות Assign Message שמוצגת למעלה מופעלת בתהליך הבקשה. בודקים אם המשתנה var מוגדר באחת מהמדיניות שמופעלות לפני מדיניות Assign Message בזרימת הבקשה. אם המשתנה לא הוגדר, תקבלו את קוד השגיאה:

    steps.assignmessage.UnresolvedVariable
    

רזולוציה

מוודאים שהמשתנה שאליו מתייחסים במדיניות קיים וזמין בתהליך הספציפי שבו מופעלת המדיניות Assign Message.

כדי לתקן את מדיניות הדוגמה שמוצגת למעלה, אפשר לשנות את מאפיין המקור ברכיב <Copy> למשתנה הבקשה או לכל משתנה מותאם אישית אחר מסוג הודעה שקיים בתהליך הבקשה.

<AssignMessage async="false" continueOnError="false" enabled="true" name="Assign-Message-1">
   <DisplayName>googleBook</DisplayName>
   <Properties />
   <Copy source="request">
      <Headers>
         <Header name="user-agent" />
      </Headers>
   </Copy>
   <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
   <AssignTo createNew="true" transport="http" type="request">googleBookReq</AssignTo>
</AssignMessage>

VariableOfNonMsgType

קוד שגיאה

steps.assignmessage.VariableOfNonMsgType

גוף התגובה לשגיאה

{
    "fault": {
        "faultstring": "AssignMessage[policy_name]: value of variable [variable] is not of type Message",
        "detail": {
            "errorcode": "steps.assignmessage.VariableOfNonMsgType"
        }
    }
}

סיבה

השגיאה הזו מתרחשת אם המאפיין source ברכיב <Copy> מוגדר למשתנה שהוא לא מסוג message.

משתנים מסוג הודעה מייצגים בקשות ותגובות מלאות של HTTP. המשתנים המובנים של זרימת Edge‏ request, response ו-message הם מסוג message. מידע נוסף על משתני הודעות זמין במאמר בנושא משתנים.

אבחון

  1. מזהים את מדיניות הקצאת ההודעות שבה אירעה השגיאה ואת שם המשתנה שהסוג שלו שגוי. אפשר למצוא את שני הפריטים האלה ברכיב faultstring של תגובת השגיאה. לדוגמה, ב-faultstring הבא, שם המדיניות הוא GenerateGeocodingRequest והמשתנה הוא PostalCode:

    "faultstring": "AssignMessage[GenerateGeocodingRequest]: value of variable PostalCode is not of type Message"
    
  2. ב-XML של מדיניות Assign Message שנכשלה, מוודאים שהשם של המשתנה שהוגדר ברכיב <Copy> זהה לשם המשתנה שזוהה במחרוזת השגיאה (שלב 1 למעלה). לדוגמה, המדיניות הבאה מגדירה מאפיין מקור למשתנה בשם PostalCode, שתואם למה שמופיע ב-faultstring:

    <AssignMessage name="GenerateGeocodingRequest">
       <AssignTo createNew="true" type="request">GeocodingRequest</AssignTo>
       <AssignVariable>
          <Name>PostalCode</Name>
          <Ref>request.queryparam.postalcode</Ref>
       </AssignVariable>
       <AssignVariable>
          <Name>Country</Name>
          <Ref>request.queryparam.country</Ref>
       </AssignVariable>
       <Copy source="PostalCode">
          <QueryParams>
             <QueryParam name="q" />
          </QueryParams>
       </Copy>
    </AssignMessage>
    
  3. קובעים אם המשתנה הזה הוא מסוג הודעה או לא:

    1. מאתרים את הקוד בחבילת ה-API Proxy, שבו הוגדר המשתנה לראשונה.
    2. אחרי שמגלים באיזו מדיניות המשתנה מוגדר ומאוכלס לראשונה, צריך לקבוע את סוג המשתנה באופן הבא:
      1. בודקים את הערך של מאפיין הסוג (אם הוא קיים).
      2. אם מאפיין הסוג לא קיים, המשתנה נחשב למחרוזת.
    3. אם סוג המשתנה הוא לא הודעה (למשל מחרוזת), זו הסיבה לשגיאה. במאמר הפניה למשתנים אפשר לקרוא על משתנים נפוצים ועל הסוגים שלהם.

    לדוגמה, אפשר לראות את המשתנה PostalCode בקובץ ה-XML שלמעלה. מוקצה לו הערך של משתנה הזרימה request.queryparam.postalcode ברכיב <AssignVariable>. הערך הזה הוא מחרוזת, כי אין מאפיין סוג בהקצאת המשתנה.

    עכשיו, נזכיר שהמשתנה PostalCode משמש ברכיב <Copy> של מדיניות Assign Message:

    <Copy source="PostalCode">
       <QueryParams>
          <QueryParam name="PostalCode" />
       </QueryParams>
    </Copy>
    

    מכיוון שהמיקוד הוא לא מסוג הודעה (הוא מחרוזת בדוגמה הזו), מתקבל קוד השגיאה:

    steps.assignmessage.VariableOfNonMsgType
    

רזולוציה

מוודאים שהמאפיין source ברכיב <Copy> במדיניות Assign Message שנכשלה מוגדר למשתנה זרימה מסוג message שקיים.

כדי לתקן את המדיניות, אפשר לשנות את המאפיין source ברכיב <Copy> כדי לציין משתנה מסוג הודעה. לדוגמה, אם מדיניות Assign Message אמורה לפעול בתהליך הבקשה, אפשר להשתמש במשתנה מסוג הודעה request או בכל משתנה מותאם אישית אחר מסוג הודעה.

<AssignMessage name="GenerateGeocodingRequest">
   <AssignTo createNew="true" type="request">GeocodingRequest</AssignTo>
   <AssignVariable>
      <Name>PostalCode</Name>
      <Ref>request.queryparam.postalcode</Ref>
   </AssignVariable>
   <AssignVariable>
      <Name>Country</Name>
      <Ref>request.queryparam.country</Ref>
   </AssignVariable>
   <Copy source="request">
      <QueryParams>
         <QueryParam name="PostalCode" />
      </QueryParams>
   </Copy>
</AssignMessage>