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

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

تشخیص

  1. خط مشی Callout Service را که در آن خطا رخ داده است و نام متغیری که نوع آن نادرست است را مشخص کنید. شما می توانید هر دوی این موارد را در عنصر faultstring پاسخ خطا پیدا کنید. به عنوان مثال، در faultstring زیر، نام سیاست ExecuteGeocodingRequest و متغیر PostalCode است:

    "faultstring": "ServiceCallout[ ExecuteGeocodingRequest ]: request variable PostalCode value is not of type Message"

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

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

تشخیص

  1. خط مشی Callout Service را که در آن خطا رخ داده است و نام متغیری که نوع آن نادرست است را مشخص کنید. شما می توانید هر دوی این موارد را در عنصر faultstring پاسخ خطا پیدا کنید. به عنوان مثال، در faultstring زیر، نام سیاست ExecuteGeocodingRequest و متغیر var_response است:

    "faultstring": "ServiceCallout[ ExecuteGeocodingRequest ]: request variable var_response value is not of type Message"

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

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

تشخیص

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

    "faultstring": "ServiceCallout[ ExecuteGeocodingRequest ]"

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

تشخیص

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

    "faultstring": "ServiceCallout[ ExecuteGeocodingRequest ]

  2. faultstring در بدنه پاسخ خطا بررسی کنید و بررسی کنید که آیا کدهای پاسخ 4XX یا 5XX در Reason فهرست شده است یا خیر. به عنوان مثال، رشته خطای زیر به وضوح نشان می دهد که یک کد پاسخ 502 از سرور باطن بازگردانده شده است:

    "faultstring": "Execution of ServiceCallout ExecuteGeocodingRequest failed. Reason: ResponseCode 502 is treated as error"

قطعنامه

پس از تعیین کد پاسخ به خطا، می توانید این مشکل را درست مانند هر خطای 4XX یا 5XX عیب یابی کنید. برای دستورالعمل‌های مربوط به عیب‌یابی و رفع خطاهای 4XX یا 5XX به کتاب‌های بازی خطای زمان اجرا (4XX/5XX) مراجعه کنید.