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

אתם צופים במסמכי העזרה של 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> במדיניות יתרונות מרכזיים של שירות הוא לא מסוג message. אם המשתנה הוא מחרוזת או כל סוג אחר שאינו הודעת, תוצג השגיאה הזו.

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

אבחון

  1. מזהים את המדיניות של Service Callout שבה התרחשה השגיאה ואת שם המשתנה שהסוג שלו שגוי. שני הפריטים האלה מופיעים ברכיב 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. קובעים אם המשתנה הזה הוא מסוג message או לא:

    1. מאתרים את הקוד בחבילת שרת ה-proxy ל-API, שבו המשתנה הוגדר לראשונה.
    2. ברוב המקרים, משתנה הבעיה נוצר ומאוכלס במדיניות אחרת שפועלת לפני מדיניות הקריאה לשירות. לדוגמה, המדיניות Assign Message משמשת בדרך כלל ליצירה ולאכלוס של משתנים בתהליך של שרת 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 הוא לא מסוג message (במקרה הזה הוא מחרוזת), מופיע קוד השגיאה: steps.servicecallout.RequestVariableNotMessageType.

רזולוציה

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

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

<?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> של מדיניות הקריאה לשירות הוא לא מסוג הודעת בקשה. אם המשתנה הוא מסוג הודעת תגובה, מחרוזת או כל סוג אחר, תוצג השגיאה הזו.

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

אבחון

  1. מאתרים את המדיניות של Service Callout שבה אירעה השגיאה ואת שם המשתנה שהסוג שלו שגוי. אפשר למצוא את שני הפריטים האלה ברכיב 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. מאתרים את הקוד בחבילת שרת ה-proxy ל-API, שבו המשתנה הוגדר לראשונה.
    2. ברוב המקרים, משתנה הבעיה נוצר ומאוכלס במדיניות אחרת שפועלת לפני מדיניות הקריאה לשירות. לדוגמה, המדיניות Assign Message משמשת בדרך כלל ליצירה ולאכלוס של משתנים בתהליך של שרת proxy ל-API.
    3. אחרי שמבינים קודם את המדיניות שבה המשתנה מוגדר ומאוכלס, צריך לקבוע את סוג המשתנה באופן הבא:
      • בודקים את הערך של המאפיין type (אם הוא קיים).
      • אם המאפיין type לא קיים, המשתנה נחשב למחרוזת.
    4. אם הסוג של המשתנה הוא לא request message, זו הסיבה לשגיאה. מידע על משתנים נפוצים ועל הסוגים שלהם זמין במאמר העזרה בנושא משתנים.

לדוגמה, נניח שהמשתנה var_response שמצוין במדיניות של Service Callout נוצר במדיניות Assign Message הבאה. שימו לב שהמשתנה 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> של המדיניות בנושא מודעות Service Callout.

<?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> כך שיציין משתנה קיים או חדש מסוג הודעת בקשה, והוא יפעל במדיניות של Service Callout. לדוגמה:

<?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 עם מבנה שגוי

כתובת ה-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).