شما در حال مشاهده مستندات Apigee Edge هستید.
به مستندات Apigee X مراجعه کنید . اطلاعات
نوع درخواستمتغیرنهپیام
کد خطا
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 از نوع پیام هستند. برای کسب اطلاعات بیشتر در مورد متغیرهای پیام، به مرجع متغیرها مراجعه کنید.
تشخیص
خطمشی فراخوانی سرویس (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&quo>t<; standalone="yes"? ServiceCallout >name=<"ExecuteGeocodingRequest&>quot;< Req>uest variable=&qu<ot;Postal>Code&<quot;/ ResponseG>eocodingR<esp>onse/Response HTTPTargetConnection U<RLht>tp://<maps.googleapis.com/m>a<ps/api/geocode/>json/URL /HTTPTargetConnection /ServiceCalloutتعیین اینکه آیا این متغیر از نوع پیام است یا خیر:
- کد را در بسته API Proxy، جایی که متغیر ابتدا تعریف شده است، پیدا کنید.
- در بیشتر موارد، متوجه خواهید شد که متغیر مشکلساز در سیاست دیگری که قبل از سیاست فراخوانی سرویس اجرا میشود، ایجاد و پر میشود. برای مثال، سیاست اختصاص پیام معمولاً برای ایجاد و پر کردن متغیرها در یک جریان پروکسی API استفاده میشود.
- پس از اینکه سیاستی را که متغیر در آن تعریف و پر میشود، مشخص کردید، باید نوع آن متغیر را به شرح زیر تعیین کنید:
- مقدار ویژگی
type) را (در صورت وجود) بررسی کنید. - اگر ویژگی
typeوجود نداشته باشد، متغیر به عنوان یک رشته در نظر گرفته میشود.
- مقدار ویژگی
- اگر نوع متغیر غیر از نوع پیام (مانند رشته) باشد، علت خطا همین است. میتوانید در مرجع متغیرها (Variables ) در مورد متغیرهای رایج و انواع آنها اطلاعات کسب کنید.
به عنوان مثال، فرض کنید متغیر PostalCode که در سیاست فراخوانی سرویس به آن ارجاع داده شده است، در سیاست پیام تخصیص زیر ایجاد شده است. توجه داشته باشید که مقدار متغیر جریان request.queryparam.postalcode PostalCode اختصاص داده شده است. این مقدار یک رشته است، زیرا هیچ ویژگی type در تخصیص متغیر وجود ندارد.
<?xml version="1.0" encoding="UTF-8&quo>t<; standalone="yes"?
AssignMessage n>ame="<;GenerateGeocodingRequest"
>AssignTo createN<ew=">true&<quo>t; type=&<quot;reques>t"Geocod<ingRequest/AssignTo
S>et
QueryParams
< QueryPa>ram name=&quo<t;address"{request.>queryparam.postalcode}/Query<Param
> QueryP<aram name="region&q>uot;{<request.que>ryparam.c<ountry}/Quer>yParam
< > < Qu>eryPa<ram >name=<"sensor&q>uot;false</Que>ryParam
< > /QueryPa<ram>s
VerbGET/Verb
/S<et
> As<signVariable
> < NamePostalCod>e/Name
< > Refre<quest>.querypar<am.>postalcode/Ref
/Assign<Vari>able
< AssignVaria>b<le
Nam>eCountry/Name
Refrequest.queryparam.country/Ref
/AssignVariable
/AssignMessage
حال، به یاد بیاورید که متغیر PostalCode در عنصر <Request> از سیاست فراخوانی سرویس استفاده میشود:
<?xml version="1.0" encoding="UTF-8&quo>t<; standalone="yes"?
ServiceCallout >name=<"ExecuteGeocodingRequest&>quot;<
Req>uest variable=&qu<ot;Postal>Code&<quot;/
ResponseG>eocodingR<esp>onse/Response
HTTPTargetConnection
U<RLht>tp://<maps.googleapis.com/m>a<ps/api/geocode/>json/URL
/HTTPTargetConnection
/ServiceCallout
از آنجا که PostalCode از نوع پیام نیست (در این مثال یک رشته است)، کد خطای زیر را دریافت میکنید: steps.servicecallout.RequestVariableNotMessageType .
وضوح تصویر
مطمئن شوید که متغیر تنظیمشده در عنصر <Request> در سیاست فراخوانی ناموفق سرویس، یک متغیر جریان از نوع پیام موجود است یا میتوانید بهطور جایگزین، یک متغیر از نوع پیام جدید را مستقیماً در سیاست فراخوانی سرویس (مطابق توضیحات در مستندات سیاست ) ایجاد کرده و از آن استفاده کنید.
برای اصلاح این سیاست، باید عنصر <Request> را تغییر دهید تا یک متغیر موجود یا جدید از نوع پیام را مشخص کند. برای مثال، متغیر GeocodingRequest که در سیاست Assign Message تنظیم شده بود، از نوع پیام است و در سیاست Service Callout به خوبی کار میکند. برای مثال:
<?xml version="1.0" encoding="UTF-8&quo>t<; standalone="yes"?
ServiceCallout >name=<"ExecuteGeocodingRequest"
> R<equest v>ariable="Geo<codingReq>uest&<quot;/
ResponseG>eocodingR<esp>onse/Response
HTTPTargetConnection
U<RLht>tp://<maps.googleapis.com/m>a<ps/api/geocode/>json/URL
/HTTPTargetConnection
/ServiceCallout
نوع درخواستمتغیر درخواستپیام
کد خطا
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 از نوع پیام هستند. برای کسب اطلاعات بیشتر در مورد متغیرهای پیام، به مرجع متغیرها مراجعه کنید.
تشخیص
خطمشی فراخوانی سرویس (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&quo>t<; standalone="yes"? ServiceCallout >name=<"ExecuteGeocodingRequest&qu>ot; < Reque>st variable="<;var_resp>onse&<quot;/ ResponseG>eocodingR<esp>onse/Response HTTPTargetConnection U<RLht>tp://<maps.googleapis.com/m>a<ps/api/geocode/>json/URL /HTTPTargetConnection /ServiceCalloutتعیین میکند که آیا متغیر از نوع پیام درخواست است یا خیر:
- کد را در بسته API Proxy، جایی که متغیر ابتدا تعریف شده است، پیدا کنید.
- در بیشتر موارد، متوجه خواهید شد که متغیر مشکلساز در سیاست دیگری که قبل از سیاست فراخوانی سرویس اجرا میشود، ایجاد و پر میشود. برای مثال، سیاست اختصاص پیام معمولاً برای ایجاد و پر کردن متغیرها در یک جریان پروکسی API استفاده میشود.
- پس از اینکه سیاستی را که متغیر در آن تعریف و پر میشود، مشخص کردید، باید نوع آن متغیر را به شرح زیر تعیین کنید:
- مقدار ویژگی
type) را (در صورت وجود) بررسی کنید. - اگر ویژگی
typeوجود نداشته باشد، متغیر به عنوان یک رشته در نظر گرفته میشود.
- مقدار ویژگی
- اگر نوع متغیر از نوع پیام درخواست نباشد، علت خطا همین است. میتوانید در مرجع متغیرها (Variables) در مورد متغیرهای رایج و انواع آنها اطلاعات کسب کنید.
به عنوان مثال، فرض کنید متغیر var_response که در سیاست فراخوانی سرویس به آن ارجاع داده شده است، در سیاست اختصاص پیام زیر ایجاد شده است. توجه داشته باشید که var_response از نوع response است. بنابراین، نوع متغیر var_response ، response message است.
<?xml version="1.0" encoding="UTF-8&quo>t<; standalone="yes"?
AssignMessage n>ame="<;GenerateGeocodingRequest"
>AssignTo createN<ew=">true&<quot; type="request"GeocodingRe>quest/Assign<To
As>signT<o c>reateNew=<"true&>quot; type=&q<uot;response"var_res>ponse/AssignTo
Set
<QueryParams>
<QueryParam name="ad>dress"{request.querypar<am.postalco>de}/QueryPara<m
QueryParam> name<="regi>on"{<request.quer>yparam.co<untr>y}/<Query>Param<
> < QueryParam> name=&qu<ot;s>ensor"<;fals>e/QueryPa<ram>
/QueryParams
< Ver>bGET/<Verb
/Set
> As<signVariable
> Na<mePo>stalCod<e/Nam>e
< Re>frequest.queryparam.postal<code>/Ref
< /AssignVari>a<ble
Assign>Variable
NameCountry/Name
Refrequest.queryparam.country/Ref
/AssignVariable
/AssignMessage
به یاد داشته باشید که متغیر var_response در عنصر <Request> از سیاست فراخوانی سرویس استفاده میشود.
<?xml version="1.0" encoding="UTF-8&quo>t<; standalone="yes"?
ServiceCallout >name=<"ExecuteGeocodingRequest&qu>ot;
< Reque>st variable="<;var_resp>onse&<quot;/
ResponseG>eocodingR<esp>onse/Response
HTTPTargetConnection
U<RLht>tp://<maps.googleapis.com/m>a<ps/api/geocode/>json/URL
/HTTPTargetConnection
/ServiceCallout
از آنجا که var_response از نوع request message نیست (نوع آن response message است)، کد خطای steps.servicecallout.RequestVariableNotRequestMessageType را دریافت میکنید.
وضوح تصویر
مطمئن شوید که متغیر تنظیمشده در عنصر <Request> در سیاست فراخوانی سرویس ناموفق، متغیری از نوع پیام درخواست است که وجود دارد یا میتوانید بهطور جایگزین، یک متغیر از نوع پیام درخواست جدید را مستقیماً در سیاست فراخوانی سرویس (مطابق توضیحات موجود در مستندات سیاست ) ایجاد کرده و از آن استفاده کنید.
برای اصلاح این سیاست، باید عنصر <Request> را طوری تغییر دهید که یک متغیر موجود یا جدید از نوع پیام درخواست را مشخص کند و این متغیر در سیاست فراخوانی سرویس (Service Callout) کار خواهد کرد. برای مثال:
<?xml version="1.0" encoding="UTF-8&quo>t<; standalone="yes"?
ServiceCallout >name=<"ExecuteGeocodingRequest"
> R<equest v>ariable="Geo<codingReq>uest&<quot;/
ResponseG>eocodingR<esp>onse/Response
HTTPTargetConnection
U<RLht>tp://<maps.googleapis.com/m>a<ps/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) هدف در خطمشی فراخوانی سرویس (Service Callout) ناقص است یا نام میزبان نامعتبر یا غیرقابل دسترس دارد. |
| خطای سرور بکاند | سرور backend پاسخ خطای 4XX یا 5XX را برمیگرداند. |
علت: آدرس اینترنتی نامعتبر یا ناقص
آدرس اینترنتی (URL) هدف در خطمشی فراخوانی سرویس (Service Callout) ناقص است یا نام میزبان نامعتبر یا غیرقابل دسترس دارد.
تشخیص
سیاست فراخوانی سرویس (Service Callout) که باعث خطا شده است را شناسایی کنید. نام سیاست در عنصر
faultstringپاسخ خطا ظاهر میشود. برای مثال، درfaultstringزیر، نام سیاست فراخوانی سرویس ناموفق،ExecuteGeocodingRequestاست."faultstring": "ServiceCallout[ ExecuteGeocodingRequest ]"در سیاست فراخوانی ناموفق سرویس، عنصر
<URL>را بررسی کنید. اگر ناقص باشد یا نام میزبان نامعتبر یا غیرقابل دسترس داشته باشد، دلیل این خطا همین است. برای مثال، سیاست فراخوانی سرویس زیر یک<URL>نامعتبر را مشخص میکند:<?xml version="1.0" encoding="UTF-8&quo>t<; standalone="yes"? ServiceCallout >name=<"ExecuteGeocodingRequest" > R<equest v>ariable="Geo<codingReq>uest&<quot;/ ResponseG>eocodingR<esp>onse/Re<spon>se < HTTPTargetConnectio>n< URLhtt>p:///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&quo>t<; standalone="yes"?
ServiceCallout >name=<"ExecuteGeocodingRequest"
> R<equest v>ariable="Geo<codingReq>uest&<quot;/
ResponseG>eocodingR<esp>onse/Response
HTTPTargetConnection
U<RLht>tp://<maps.googleapis.com/m>a<ps/api/geocode/>json/URL
/HTTPTargetConnection
/ServiceCallout
علت: خطای سرور بکاند
سرور backend پاسخ خطای 4XX یا 5XX را برمیگرداند.
تشخیص
سیاست فراخوانی سرویس (Service Callout) که باعث خطا شده است را شناسایی کنید. نام سیاست در عنصر
faultstringپاسخ خطا ظاهر میشود. برای مثال، درfaultstringزیر، نام سیاست فراخوانی سرویس ناموفق،ExecuteGeocodingRequestاست."faultstring": "ServiceCallout[ ExecuteGeocodingRequest ]faultstringدر بدنه پاسخ خطا بررسی کنید و بررسی کنید که آیا کدهای پاسخ 4XX یا 5XX درReasonذکر شده است یا خیر. به عنوان مثال، رشته خطای زیر به وضوح نشان میدهد که کد پاسخ 502 از سرور backend بازگردانده شده است:"faultstring": "Execution of ServiceCallout ExecuteGeocodingRequest failed. Reason: ResponseCode 502 is treated as error"
وضوح تصویر
پس از تعیین کد پاسخ خطا، میتوانید این مشکل را درست مانند هر خطای 4XX یا 5XX عیبیابی کنید. برای دستورالعملهای عیبیابی و حل خطاهای 4XX یا 5XX به کتابچههای راهنمای خطای زمان اجرا (4XX/5XX) مراجعه کنید.