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