شما در حال مشاهده اسناد 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>
خط مشی Callout Service از نوع پیام نباشد این خطا رخ می دهد. اگر متغیر یک رشته یا هر نوع غیر پیام دیگری باشد، این خطا را خواهید دید.
متغیرهای نوع پیام، کل درخواستها و پاسخهای HTTP را نشان میدهند. متغیرهای جریان لبه داخلی request
، response
و message
از نوع پیام هستند. برای کسب اطلاعات بیشتر در مورد متغیرهای پیام، به مرجع متغیرها مراجعه کنید.
تشخیص
خط مشی Callout Service را که در آن خطا رخ داده است و نام متغیری که نوع آن نادرست است را مشخص کنید. شما می توانید هر دوی این موارد را در عنصر
faultstring
پاسخ خطا پیدا کنید. به عنوان مثال، درfaultstring
زیر، نام سیاستExecuteGeocodingRequest
و متغیرPostalCode
است:"faultstring": "ServiceCallout[ ExecuteGeocodingRequest ]: request variable PostalCode value is not of type Message"
در XML خط مشی Callout سرویس ناموفق، بررسی کنید که نام متغیر مجموعه در عنصر
<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، جایی که متغیر ابتدا تعریف شده است، قرار دهید.
- در بیشتر موارد، متوجه میشوید که متغیر مشکل در خطمشی دیگری ایجاد شده و پر شده است که قبل از سیاست Callout سرویس اجرا میشود. به عنوان مثال، خط مشی Assign Message معمولا برای ایجاد و پر کردن متغیرها در یک جریان پروکسی API استفاده می شود.
- هنگامی که سیاستی را که ابتدا متغیر در آن تعریف و پر شده است، مشخص کردید، باید نوع آن متغیر را به صورت زیر تعیین کنید:
- مقدار ویژگی
type
(در صورت وجود) را بررسی کنید. - اگر ویژگی
type
وجود نداشته باشد، متغیر به عنوان یک رشته در نظر گرفته می شود.
- مقدار ویژگی
- اگر نوع متغیر غیر پیامی باشد (مثلاً رشته ای)، پس علت خطا همین است. در مرجع Variables می توانید با متغیرهای رایج و انواع آنها آشنا شوید.
به عنوان مثال، فرض کنید متغیر PostalCode
اشاره شده در خط مشی Callout Service در خط مشی Assign Message زیر ایجاد شده است. توجه داشته باشید که 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>
سیاست Callout Service استفاده می شود:
<?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>
در خط مشی ناموفق سرویس Callout یک متغیر جریان نوع پیام است که وجود دارد یا می توانید یک متغیر نوع پیام جدید را مستقیماً در خط مشی Callout Service ایجاد کنید (همانطور که در مستندات خط مشی توضیح داده شده است). از آن استفاده کنید.
برای تصحیح این خط مشی، باید عنصر <Request>
را تغییر دهید تا متغیر موجود یا جدیدی که از نوع پیام است را مشخص کنید. به عنوان مثال، متغیر GeocodingRequest
که در خط مشی Assign Message تنظیم شده است، از نوع پیام است و در خط مشی 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>
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>
خط مشی Callout Service از نوع پیام درخواست نباشد، این خطا رخ می دهد. اگر متغیر یک نوع پیام پاسخ، رشته یا هر نوع دیگری باشد، این خطا را خواهید دید.
متغیرهای نوع پیام ، کل درخواستها و پاسخهای HTTP را نشان میدهند. متغیرهای جریان لبه داخلی request
، response
و message
از نوع پیام هستند. برای کسب اطلاعات بیشتر در مورد متغیرهای پیام، به مرجع متغیرها مراجعه کنید.
تشخیص
خط مشی Callout Service را که در آن خطا رخ داده است و نام متغیری که نوع آن نادرست است را مشخص کنید. شما می توانید هر دوی این موارد را در عنصر
faultstring
پاسخ خطا پیدا کنید. به عنوان مثال، درfaultstring
زیر، نام سیاستExecuteGeocodingRequest
و متغیرvar_response
است:"faultstring": "ServiceCallout[ ExecuteGeocodingRequest ]: request variable var_response value is not of type Message"
در XML خط مشی Callout سرویس ناموفق، بررسی کنید که نام متغیر مجموعه در عنصر
<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>
تعیین کنید که متغیر از نوع پیام درخواستی است یا خیر:
- کد را در بسته API Proxy، جایی که متغیر ابتدا تعریف شده است، قرار دهید.
- در بیشتر موارد، متوجه میشوید که متغیر مشکل در خطمشی دیگری ایجاد شده و پر شده است که قبل از سیاست Callout سرویس اجرا میشود. به عنوان مثال، خط مشی Assign Message معمولا برای ایجاد و پر کردن متغیرها در یک جریان پروکسی API استفاده می شود.
- هنگامی که سیاستی را که ابتدا متغیر در آن تعریف و پر شده است، مشخص کردید، باید نوع آن متغیر را به صورت زیر تعیین کنید:
- مقدار ویژگی
type
(در صورت وجود) را بررسی کنید. - اگر ویژگی
type
وجود نداشته باشد، متغیر به عنوان یک رشته در نظر گرفته می شود.
- مقدار ویژگی
- اگر نوع متغیر از نوع پیام درخواستی نباشد، دلیل خطا همین است. در مرجع Variables می توانید با متغیرهای رایج و انواع آنها آشنا شوید.
به عنوان مثال، فرض کنید متغیر var_response
اشاره شده در خط مشی Callout Service در خط مشی 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>
سیاست Callout Service استفاده می شود.
<?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>
در خط مشی Callout سرویس ناموفق، متغیر نوع پیام درخواستی است که وجود دارد یا می توانید یک متغیر نوع پیام درخواست جدید را مستقیماً در خط مشی Callout Service ایجاد کنید (همانطور که در مستندات خط مشی توضیح داده شده است) و از آن استفاده کنید.
برای تصحیح این خط مشی، باید عنصر <Request>
را تغییر دهید تا یک متغیر موجود یا جدید که از نوع پیام درخواست است را مشخص کنید و در خط مشی Callout Service کار خواهد کرد. به عنوان مثال:
<?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>
اجرا ناموفق بود
کد خطا
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 مورد نظر در خط مشی Callout Service نادرست است یا نام میزبان نامعتبر یا غیرقابل دسترسی است. |
خطای سرور Backend | سرور باطن یک پاسخ خطای 4XX یا 5XX را برمیگرداند. |
علت: URL نامعتبر یا نادرست است
URL مورد نظر در خط مشی Callout Service نادرست است یا نام میزبان نامعتبر یا غیرقابل دسترسی است.
تشخیص
خط مشی Callout سرویس را که باعث خطا شده است شناسایی کنید. نام خط مشی در عنصر
faultstring
پاسخ خطا ظاهر می شود. به عنوان مثال، درfaultstring
زیر، نام خط مشی Callout سرویس ناموفقExecuteGeocodingRequest
است."faultstring": "ServiceCallout[ ExecuteGeocodingRequest ]"
در خط مشی ناموفق سرویس Callout، عنصر
<URL>
را بررسی کنید. اگر نادرست است یا نام میزبان نامعتبر یا غیرقابل دسترسی است، دلیل این خطا همین است. به عنوان مثال، خط مشی سرویس Callout زیر یک<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://
است، اما نام میزبان معتبری ندارد. بنابراین، خط مشی Callout Service با خطا مواجه می شود:Execution of ServiceCallout ExecuteGeocodingRequest failed. Reason: Host not reachable
.
قطعنامه
اطمینان حاصل کنید که عنصر <URL>
در خط مشی Callout سرویس ناموفق دارای یک URL معتبر با نام میزبان قابل دسترسی است.
برای تصحیح خط مشی Callout Service نشان داده شده در بالا، می توانید عنصر <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>
علت: خطای سرور Backend
سرور باطن یک پاسخ خطای 4XX یا 5XX را برمیگرداند.
تشخیص
خط مشی Callout سرویس را که باعث خطا شده است شناسایی کنید. نام خط مشی در عنصر
faultstring
پاسخ خطا ظاهر می شود. به عنوان مثال، درfaultstring
زیر، نام خط مشی Callout سرویس ناموفق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) مراجعه کنید.