אתם צופים במסמכי התיעוד של 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. משתני הזרימה המובנים ב-Edge request
, response
ו-message
הם מסוג הודעה. מידע נוסף על משתני הודעות זמין בחומר העזר בנושא משתנים.
אבחון
מזהים את המדיניות בנושא יתרונות מרכזיים של שירות שבה אירעה השגיאה ואת שם המשתנה שהסוג שלו שגוי. שני הפריטים האלה מופיעים ברכיב
faultstring
בתשובה לשגיאה. לדוגמה, בfaultstring
הבא, שם המדיניות הואExecuteGeocodingRequest
והמשתנה הואPostalCode
:"faultstring": "ServiceCallout[ExecuteGeocodingRequest]: request variable PostalCode value is not of type Message"
בקובץ ה-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>
קובעים אם המשתנה הזה הוא מסוג הודעה או לא:
- מאתרים את הקוד בתוך חבילת ה-API של שרת ה-proxy, שבה המשתנה הוגדר קודם.
- ברוב המקרים, משתנה הבעיה נוצר ומאוכלס במדיניות אחרת שמופעלת לפני המדיניות בנושא יתרונות מרכזיים של שירות. לדוגמה, המדיניות 'הקצאת הודעה' משמשת בדרך כלל כדי ליצור ולאכלס משתנים בתהליך proxy ל-API.
- אחרי שהבנתם את המדיניות שבה המשתנה מוגדר ואכלס קודם, צריך לקבוע את סוג המשתנה באופן הבא:
- בודקים את ערך המאפיין
type
(אם קיים). - אם המאפיין
type
לא קיים, המשתנה נחשב למחרוזת.
- בודקים את ערך המאפיין
- אם הסוג של המשתנה הוא לא הודעת (למשל מחרוזת), זו הסיבה לשגיאה. מידע נוסף על משתנים נפוצים והסוגים שלהם זמין בחומר העזר בנושא משתנים.
לדוגמה, נניח שהמשתנה 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>
במדיניות יתרונות מרכזיים של שירות הוא לא מסוג הודעת בקשה. אם המשתנה הוא סוג של הודעת תגובה, מחרוזת או כל סוג אחר, תוצג השגיאה הזו.
משתנים מסוג Message מייצגים תגובות ובקשות HTTP מלאות. משתני הזרימה המובנים ב-Edge request
, response
ו-message
הם מסוג הודעה. מידע נוסף על משתני הודעות זמין בחומר העזר בנושא משתנים.
אבחון
מאתרים את המדיניות של Service Callout שבה התרחשה השגיאה ואת שם המשתנה שהסוג שלו שגוי. שני הפריטים האלה מופיעים ברכיב
faultstring
בתשובה לשגיאה. לדוגמה, בfaultstring
הבא, שם המדיניות הואExecuteGeocodingRequest
והמשתנה הואvar_response
:"faultstring": "ServiceCallout[ExecuteGeocodingRequest]: request variable var_response value is not of type Message"
בקובץ ה-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>
קובעים אם המשתנה הוא מסוג הודעת בקשה או לא:
- מאתרים את הקוד בחבילת שרת ה-proxy ל-API, שבו המשתנה הוגדר לראשונה.
- ברוב המקרים, משתנה הבעיה נוצר ומאוכלס במדיניות אחרת שמופעלת לפני המדיניות בנושא יתרונות מרכזיים של שירות. לדוגמה, המדיניות 'הקצאת הודעה' משמשת בדרך כלל כדי ליצור ולאכלס משתנים בתהליך proxy ל-API.
- אחרי שהבנתם את המדיניות שבה המשתנה מוגדר ואכלס קודם, צריך לקבוע את סוג המשתנה באופן הבא:
- בודקים את ערך המאפיין
type
(אם קיים). - אם המאפיין
type
לא קיים, המשתנה נחשב למחרוזת.
- בודקים את ערך המאפיין
- אם סוג המשתנה הוא לא מסוג הודעת בקשה, זו הסיבה לשגיאה. מידע נוסף על משתנים נפוצים והסוגים שלהם זמין בחומר העזר בנושא משתנים.
לדוגמה, נניח שהמשתנה 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>
של המדיניות בנושא מודעות 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 של היעד במדיניות של קריאה לשירות לא תקינה או שיש לה שם מארח לא חוקי או לא ניתן להגיע אליו.
אבחון
מזהים את המדיניות בנושא יתרונות מרכזיים של שירות שגרמה לשגיאה. שם המדיניות מופיע ברכיב
faultstring
של תגובת השגיאה. לדוגמה, בfaultstring
הבאים, השם של המדיניות בנושא יתרונות מרכזיים של שירות שנכשל הואExecuteGeocodingRequest
."faultstring": "ServiceCallout[ExecuteGeocodingRequest]"
במדיניות בנושא יתרונות מרכזיים של שירות שנכשלה, בודקים את הרכיב
<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.
אבחון
מזהים את המדיניות בנושא יתרונות מרכזיים של שירות שגרמה לשגיאה. שם המדיניות מופיע ברכיב
faultstring
של תגובת השגיאה. לדוגמה, בקובץfaultstring
הבא, השם של מדיניות הקריאה לשירות שנכשלה הואExecuteGeocodingRequest
."faultstring": "ServiceCallout[ExecuteGeocodingRequest]
בודקים את
faultstring
בגוף התגובה לשגיאה, ובודקים אם יש קודי תגובה מסוג 4XX או 5XX שמפורטים ב-Reason
. לדוגמה, מחרוזת השגיאה הבאה מציינת בבירור שקוד תגובה 502 הוחזר משרת הקצה העורפי:"faultstring": "Execution of ServiceCallout ExecuteGeocodingRequest failed. Reason: ResponseCode 502 is treated as error"
רזולוציה
אחרי שקובעים את קוד התגובה לשגיאה, אפשר לפתור את הבעיה בדיוק כמו כל שגיאה מסוג 4XX או 5XX. הוראות לפתרון בעיות ולפתרון שגיאות מסוג 4XX או 5XX מפורטות בספרי הפעולות בנושא שגיאות בסביבת זמן ריצה (4XX/5XX).