عیب یابی خطای زمان اجرای Callout Service

شما در حال مشاهده مستندات 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 از نوع پیام هستند. برای کسب اطلاعات بیشتر در مورد متغیرهای پیام، به مرجع متغیرها مراجعه کنید.

تشخیص

  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&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
    
  3. تعیین اینکه آیا این متغیر از نوع پیام است یا خیر:

    1. کد را در بسته API Proxy، جایی که متغیر ابتدا تعریف شده است، پیدا کنید.
    2. در بیشتر موارد، متوجه خواهید شد که متغیر مشکل‌ساز در سیاست دیگری که قبل از سیاست فراخوانی سرویس اجرا می‌شود، ایجاد و پر می‌شود. برای مثال، سیاست اختصاص پیام معمولاً برای ایجاد و پر کردن متغیرها در یک جریان پروکسی API استفاده می‌شود.
    3. پس از اینکه سیاستی را که متغیر در آن تعریف و پر می‌شود، مشخص کردید، باید نوع آن متغیر را به شرح زیر تعیین کنید:
      • مقدار ویژگی type ) را (در صورت وجود) بررسی کنید.
      • اگر ویژگی type وجود نداشته باشد، متغیر به عنوان یک رشته در نظر گرفته می‌شود.
    4. اگر نوع متغیر غیر از نوع پیام (مانند رشته) باشد، علت خطا همین است. می‌توانید در مرجع متغیرها (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 از نوع پیام هستند. برای کسب اطلاعات بیشتر در مورد متغیرهای پیام، به مرجع متغیرها مراجعه کنید.

تشخیص

  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&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
    
  3. تعیین می‌کند که آیا متغیر از نوع پیام درخواست است یا خیر:

    1. کد را در بسته API Proxy، جایی که متغیر ابتدا تعریف شده است، پیدا کنید.
    2. در بیشتر موارد، متوجه خواهید شد که متغیر مشکل‌ساز در سیاست دیگری که قبل از سیاست فراخوانی سرویس اجرا می‌شود، ایجاد و پر می‌شود. برای مثال، سیاست اختصاص پیام معمولاً برای ایجاد و پر کردن متغیرها در یک جریان پروکسی API استفاده می‌شود.
    3. پس از اینکه سیاستی را که متغیر در آن تعریف و پر می‌شود، مشخص کردید، باید نوع آن متغیر را به شرح زیر تعیین کنید:
      • مقدار ویژگی type ) را (در صورت وجود) بررسی کنید.
      • اگر ویژگی type وجود نداشته باشد، متغیر به عنوان یک رشته در نظر گرفته می‌شود.
    4. اگر نوع متغیر از نوع پیام درخواست نباشد، علت خطا همین است. می‌توانید در مرجع متغیرها (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) ناقص است یا نام میزبان نامعتبر یا غیرقابل دسترس دارد.

تشخیص

  1. سیاست فراخوانی سرویس (Service Callout) که باعث خطا شده است را شناسایی کنید. نام سیاست در عنصر faultstring پاسخ خطا ظاهر می‌شود. برای مثال، در faultstring زیر، نام سیاست فراخوانی سرویس ناموفق، ExecuteGeocodingRequest است.

    "faultstring": "ServiceCallout[ ExecuteGeocodingRequest ]"

  2. در سیاست فراخوانی ناموفق سرویس، عنصر <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 را برمی‌گرداند.

تشخیص

  1. سیاست فراخوانی سرویس (Service Callout) که باعث خطا شده است را شناسایی کنید. نام سیاست در عنصر faultstring پاسخ خطا ظاهر می‌شود. برای مثال، در faultstring زیر، نام سیاست فراخوانی سرویس ناموفق، ExecuteGeocodingRequest است.

    "faultstring": "ServiceCallout[ ExecuteGeocodingRequest ]

  2. 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) مراجعه کنید.