פתרון בעיות בזמן ריצה של יתרונות מרכזיים של שירות

כרגע מוצג התיעוד של Apigee Edge.
כניסה למסמכי התיעוד של Apigee X.
מידע

RequestVariableNotMessageType

קוד שגיאה

steps.servicecallout.RequestVariableNotMessageType

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

{
    "fault": {
        "faultstring": "ServiceCallout[policy_name]: request variable [variable_name] value is not of type Message",
        "detail": {
            "errorcode": "steps.servicecallout.RequestVariableNotMessageType"
        }
    }
}

סיבה

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

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

אבחון

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

    "faultstring": "ServiceCallout[ExecuteGeocodingRequest]: request variable PostalCode value is not of type Message"

  2. ב-XML של המדיניות בנושא יתרונות מרכזיים של שירות שנכשל, מוודאים ששם המשתנה שהוגדר ברכיב <Request> תואם לשם המשתנה שזוהה במחרוזת השגיאה (שלב 1 למעלה). לדוגמה, המדיניות הבאה מציינת משתנה בקשה בשם PostalCode שתואם למה שמופיע ב-faultstring:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <ServiceCallout name="ExecuteGeocodingRequest">
        <Request variable="PostalCode"/>
        <Response>GeocodingResponse</Response>
        <HTTPTargetConnection>
            <URL>http://maps.googleapis.com/maps/api/geocode/json</URL>
        </HTTPTargetConnection>
    </ServiceCallout>
    
  3. כך קובעים אם המשתנה הזה הוא מסוג הודעה או לא:

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

לדוגמה, נניח שהמשתנה PostalCode שמוזכר במדיניות 'יתרונות מרכזיים של שירות' נוצר במדיניות הבאה של הקצאת הודעה. לתשומת ליבכם: ל-PostalCode מוקצה הערך של משתנה הזרימה request.queryparam.postalcode. הערך הזה הוא מחרוזת כי אין מאפיין type בהקצאת המשתנים.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<AssignMessage name="GenerateGeocodingRequest">
        <AssignTo createNew="true" type="request">GeocodingRequest</AssignTo>
    <Set>
        <QueryParams>
            <QueryParam name="address">{request.queryparam.postalcode}</QueryParam>
            <QueryParam name="region">{request.queryparam.country}</QueryParam>
            <QueryParam name="sensor">false</QueryParam>
        </QueryParams>
        <Verb>GET</Verb>
    </Set>
    <AssignVariable>
        <Name>PostalCode</Name>
        <Ref>request.queryparam.postalcode</Ref>
    </AssignVariable>
    <AssignVariable>
        <Name>Country</Name>
        <Ref>request.queryparam.country</Ref>
    </AssignVariable>
</AssignMessage>

עכשיו חשוב לזכור שהמשתנה PostalCode נמצא בשימוש ברכיב <Request> של המדיניות בנושא יתרונות מרכזיים של שירות:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ServiceCallout name="ExecuteGeocodingRequest">
    <Request variable="PostalCode"/>
    <Response>GeocodingResponse</Response>
    <HTTPTargetConnection>
        <URL>http://maps.googleapis.com/maps/api/geocode/json</URL>
    </HTTPTargetConnection>
</ServiceCallout>

מכיוון ש-PostalCode אינו מסוג הודעות (זהו מחרוזת בדוגמה הזו), אתה מקבל את קוד השגיאה: steps.servicecallout.RequestVariableNotMessageType.

רזולוציה

צריך לוודא שהמשתנה המוגדר באלמנט <Request> במדיניות בנושא יתרונות מרכזיים של שירות שנכשלו הוא משתנה קיים של זרימת סוג הודעה. לחלופין, אפשר ליצור משתנה חדש של סוג הודעה ישירות במדיניות 'יתרונות מרכזיים של שירות' (כפי שמוסבר במסמכי המדיניות) ולהשתמש בו.

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

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ServiceCallout name="ExecuteGeocodingRequest">
    <Request variable="GeocodingRequest"/>
    <Response>GeocodingResponse</Response>
    <HTTPTargetConnection>
        <URL>http://maps.googleapis.com/maps/api/geocode/json</URL>
    </HTTPTargetConnection>
</ServiceCallout>

RequestVariableNotRequestMessageType

קוד שגיאה

steps.servicecallout.RequestVariableNotRequestMessageType

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

{
    "fault": {
        "faultstring": "ServiceCallout[policy_name]: request variable [variable_name] value is not of type Request Message",
        "detail": {
            "errorcode": "steps.servicecallout.RequestVariableNotRequestMessageType"
        }
    }
}

סיבה

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

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

אבחון

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

    "faultstring": "ServiceCallout[ExecuteGeocodingRequest]: request variable var_response value is not of type Message"

  2. ב-XML של המדיניות בנושא יתרונות מרכזיים של שירות שנכשל, מוודאים ששם המשתנה שהוגדר ברכיב <Request> תואם לשם המשתנה שזוהה במחרוזת השגיאה (שלב 1 למעלה). לדוגמה, המדיניות הבאה מציינת משתנה בקשה בשם var_response שתואם למה שמופיע ב-faultstring:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <ServiceCallout name="ExecuteGeocodingRequest">
        <Request variable="var_response"/>
        <Response>GeocodingResponse</Response>
        <HTTPTargetConnection>
            <URL>http://maps.googleapis.com/maps/api/geocode/json</URL>
        </HTTPTargetConnection>
    </ServiceCallout>
    
  3. קובעים אם המשתנה הוא מסוג הודעת בקשה או לא:

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

לדוגמה, נניח שהמשתנה var_response שמוזכר במדיניות 'יתרונות מרכזיים של שירות' נוצר במדיניות הבאה של הקצאת הודעה. לתשומת ליבך, var_response הוא הסוג response. לכן, סוג המשתנה var_response הוא הודעת תשובה.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<AssignMessage name="GenerateGeocodingRequest">
        <AssignTo createNew="true" type="request">GeocodingRequest</AssignTo>
    <AssignTo createNew="true" type="response">var_response</AssignTo>
    <Set>
        <QueryParams>
            <QueryParam name="address">{request.queryparam.postalcode}</QueryParam>
            <QueryParam name="region">{request.queryparam.country}</QueryParam>
            <QueryParam name="sensor">false</QueryParam>
        </QueryParams>
        <Verb>GET</Verb>
    </Set>
    <AssignVariable>
        <Name>PostalCode</Name>
        <Ref>request.queryparam.postalcode</Ref>
    </AssignVariable>
    <AssignVariable>
        <Name>Country</Name>
        <Ref>request.queryparam.country</Ref>
    </AssignVariable>
</AssignMessage>

חשוב לזכור שהמשתנה var_response נמצא בשימוש ברכיב <Request> של המדיניות בנושא יתרונות מרכזיים של שירות.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ServiceCallout name="ExecuteGeocodingRequest">
    <Request variable="var_response"/>
    <Response>GeocodingResponse</Response>
    <HTTPTargetConnection>
        <URL>http://maps.googleapis.com/maps/api/geocode/json</URL>
    </HTTPTargetConnection>
</ServiceCallout>

מכיוון ש-var_response אינו מסוג הודעת בקשה (הסוג שלו הוא הודעת תגובה), קיבלת את קוד השגיאה: steps.servicecallout.RequestVariableNotRequestMessageType.

רזולוציה

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

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

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ServiceCallout name="ExecuteGeocodingRequest">
    <Request variable="GeocodingRequest"/>
    <Response>GeocodingResponse</Response>
    <HTTPTargetConnection>
        <URL>http://maps.googleapis.com/maps/api/geocode/json</URL>
    </HTTPTargetConnection>
</ServiceCallout>

ExecutionFailed

קוד שגיאה

steps.servicecallout.ExecutionFailed

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

{
    "fault": {
        "faultstring": "Execution of ServiceCallout [policy_name] failed. Reason: Host not reachable",
        "detail": {
            "errorcode": "steps.servicecallout.ExecutionFailed"
        }
    }
}

או

{
    "fault": {
        "faultstring": "Execution of ServiceCallout [policy_name] failed. Reason: ResponseCode [http_code] is treated as error",
        "detail": {
            "errorcode": "steps.servicecallout.ExecutionFailed"
        }
    }
}

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

הסיבות האפשריות לשגיאה הזו הן:

הסיבה תיאור
כתובת URL לא חוקית או שגויה כתובת ה-URL של היעד במדיניות בנושא יתרונות מרכזיים של שירות לא תקינה או שיש בה שם מארח לא תקין או לא נגיש.
שגיאת שרת בקצה העורפי שרת הקצה העורפי מחזיר תגובה 4XX או 5XX.

הסיבה: כתובת URL לא תקינה או שגויה

כתובת ה-URL של היעד במדיניות בנושא יתרונות מרכזיים של שירות לא תקינה או שיש בה שם מארח לא תקין או לא נגיש.

אבחון

  1. מזהים את המדיניות בנושא היתרונות המרכזיים של השירות שגרמה לשגיאה. שם המדיניות מופיע ברכיב faultstring של תגובת השגיאה. לדוגמה, בשדה faultstring הבא, שם המדיניות של נכס היתרונות המרכזיים של השירות שנכשלו הוא ExecuteGeocodingRequest.

    "faultstring": "ServiceCallout[ExecuteGeocodingRequest]"

  2. במדיניות בנושא יתרונות מרכזיים של שירות שנכשלה, יש לבחון את הרכיב <URL>. אם שם המארח שגוי או שלא ניתן לגשת אליו, זו הסיבה לשגיאה. לדוגמה, המדיניות הבאה של נכסי יתרונות מרכזיים של שירות מציינת <URL> לא חוקי:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <ServiceCallout name="ExecuteGeocodingRequest">
        <Request variable="GeocodingRequest"/>
        <Response>GeocodingResponse</Response>
        <HTTPTargetConnection>
            <URL>http://</URL>
        </HTTPTargetConnection>
    </ServiceCallout>
    

    הרכיב <URL> מכיל רק את הפרוטוקול http://, אבל אין לו שם מארח חוקי. לכן, המדיניות 'יתרונות מרכזיים של שירות' נכשלת ומוצגת השגיאה Execution of ServiceCallout ExecuteGeocodingRequest failed. Reason: Host not reachable.

רזולוציה

יש לוודא שלאלמנט <URL> במדיניות בנושא יתרונות מרכזיים של שירות נכשלה יש כתובת URL חוקית עם שם מארח שניתן להגיע אליו.

כדי לתקן את המדיניות בנושא יתרונות מרכזיים של שירות שמוצגת למעלה, אפשר לשנות את הרכיב <URL> ולציין כתובת URL חוקית:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ServiceCallout name="ExecuteGeocodingRequest">
    <Request variable="GeocodingRequest"/>
    <Response>GeocodingResponse</Response>
    <HTTPTargetConnection>
        <URL>http://maps.googleapis.com/maps/api/geocode/json</URL>
    </HTTPTargetConnection>
</ServiceCallout>

הסיבה: שגיאה בשרת הקצה העורפי

שרת הקצה העורפי מחזיר תגובה 4XX או 5XX.

אבחון

  1. מזהים את המדיניות בנושא היתרונות המרכזיים של השירות שגרמה לשגיאה. שם המדיניות מופיע ברכיב faultstring של תגובת השגיאה. לדוגמה, בשדה faultstring הבא, שם המדיניות של נכס היתרונות המרכזיים של השירות שנכשלו הוא ExecuteGeocodingRequest.

    "faultstring": "ServiceCallout[ExecuteGeocodingRequest]

  2. יש לבדוק את faultstring בגוף התגובה לשגיאה ולבדוק אם יש קודי תגובה מסוג 4XX או 5XX שמפורטים בReason. לדוגמה, מחרוזת הבאג הבאה מציינת בבירור שקוד תגובה 502 הוחזר משרת הקצה העורפי:

    "faultstring": "Execution of ServiceCallout ExecuteGeocodingRequest failed. Reason: ResponseCode 502 is treated as error"

רזולוציה

אחרי שמגלים את קוד התגובה לשגיאה, אפשר לפתור את הבעיה בדיוק כמו שעושים עם כל שגיאה מסוג 4XX או 5XX. במדריכים בנושא שגיאת זמן ריצה (4XX/5XX) אפשר למצוא הוראות לפתרון בעיות ולפתרון שגיאות מסוג 4XX או 5XX.