পরিষেবা কলআউট রানটাইম সংক্রান্ত সমস্যার সমাধান করা

আপনি 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> এলিমেন্টে নির্দিষ্ট করা কোনও ভেরিয়েবল মেসেজ ধরনের না হলে এই সমস্যা হয়। ভেরিয়েবলটি স্ট্রিং বা অন্য কোনও নন-মেসেজ টাইপ হলে, আপনি এই সমস্যাটি দেখতে পাবেন।

মেসেজ টাইপ ভেরিয়েবল সম্পূর্ণ HTTP অনুরোধ ও উত্তরকে উপস্থাপন করে। বিল্ট-ইন Edge ফ্লো ভেরিয়েবল request, response ও message হল মেসেজ ধরনের। মেসেজ ভেরিয়েবল সম্পর্কে আরও জানতে, ভেরিয়েবল রেফারেন্স দেখুন।

ডায়াগনসিস

  1. যেখানে সমস্যা হয়েছে সেই পরিষেবা কলআউট নীতি এবং যে ভেরিয়েবলের ধরন ভুল আছে তার নাম চিহ্নিত করুন। আপনি সমস্যার উত্তরের faultstring এলিমেন্টে এই দুটি আইটেমই খুঁজে পাবেন। যেমন, নিম্নলিখিত faultstring-এ, নীতির নাম হল ExecuteGeocodingRequest এবং ভেরিয়েবল হল PostalCode:

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

  2. কাজ না করা সার্ভিস কলআউট নীতি XML-এ, যাচাই করে দেখুন যে <Request> এলিমেন্টে সেট করা ভেরিয়েবলের নাম ফল্ট স্ট্রিংয়ে (উপরে #১ ধাপ) শনাক্ত করা ভেরিয়েবলের নামের সাথে মিলছে কিনা। যেমন, নিম্নলিখিত নীতিতে 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 প্রক্সি বান্ডেলের মধ্যে কোডটি খুঁজে বের করুন, যেখানে ভেরিয়েবলটি প্রথম সংজ্ঞায়িত করা হয়েছিল।
    2. বেশিরভাগ ক্ষেত্রে, আপনি দেখতে পাবেন যে সমস্যা সংক্রান্ত ভেরিয়েবলটি অন্য একটি নীতিতে তৈরি ও পপুলেট করা হয়েছে যা সার্ভিস কলআউট নীতির আগে এক্সিকিউট হয়। যেমন, API প্রক্সি ফ্লোতে ভেরিয়েবল তৈরি ও পপুলেট করার জন্য অ্যাসাইন মেসেজ নীতি সাধারণত ব্যবহার করা হয়।
    3. যে নীতিতে ভেরিয়েবলটি প্রথম সংজ্ঞায়িত ও পপুলেট করা হয়েছে সেটি খুঁজে পাওয়ার পরে, আপনাকে নিম্নলিখিতভাবে সেই ভেরিয়েবলের ধরন নির্ধারণ করতে হবে:
      • type অ্যাট্রিবিউটের ভ্যালু চেক করুন (যদি থাকে)।
      • type অ্যাট্রিবিউট না থাকলে, ভেরিয়েবলকে স্ট্রিং হিসেবে বিবেচনা করা হয়।
    4. ভেরিয়েবলের ধরন মেসেজ না হলে (যেমন, স্ট্রিং), তাহলে সেটিই সমস্যার কারণ। আপনি ভেরিয়েবেল রেফারেন্স থেকে সাধারণ ভেরিয়েবেল ও সেগুলির ধরন সম্পর্কে জানতে পারবেন।

যেমন, ধরে নিন যে পরিষেবা কলআউট নীতিতে উল্লেখ করা 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 মেসেজ টাইপের না হওয়ার কারণে (এই উদাহরণে এটি একটি স্ট্রিং), আপনি এই সমস্যা কোডটি পাবেন: steps.servicecallout.RequestVariableNotMessageType.

রেজোলিউশন

নিশ্চিত করুন যে ব্যর্থ হওয়া সার্ভিস কলআউট নীতির <Request> এলিমেন্টে সেট করা ভেরিয়েবল হল মেসেজ টাইপের ফ্লো ভেরিয়েবল যা আগে থেকেই আছে অথবা আপনি সরাসরি সার্ভিস কলআউট নীতিতে নতুন মেসেজ টাইপের ভেরিয়েবল তৈরি করতে পারেন (নীতি সংক্রান্ত ডকুমেন্টে যেমন ব্যাখ্যা করা হয়েছে) এবং এটি ব্যবহার করতে পারেন।

নীতিটি সংশোধন করতে, আপনাকে <Request> এলিমেন্ট পরিবর্তন করে আগে থেকে থাকা বা নতুন এমন ভেরিয়েবল নির্দিষ্ট করতে হবে যা মেসেজ ধরনের। যেমন, Assign Message নীতিতে সেট করা ভেরিয়েবল GeocodingRequest হল মেসেজ টাইপের এবং এটি 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> এলিমেন্টে উল্লেখ করা কোনও ভেরিয়েবল অনুরোধ মেসেজ টাইপের না হলে এই সমস্যা হয়। ভেরিয়েবলটি যদি কোনও উত্তর মেসেজ, স্ট্রিং বা অন্য কোনও ধরনের হয়, তাহলে আপনি এই সমস্যা দেখতে পাবেন।

মেসেজ টাইপ ভেরিয়েবল সম্পূর্ণ HTTP অনুরোধ ও উত্তরকে উপস্থাপন করে। বিল্ট-ইন Edge ফ্লো ভেরিয়েবল request, response ও message হল মেসেজ ধরনের। মেসেজ ভেরিয়েবল সম্পর্কে আরও জানতে, ভেরিয়েবল রেফারেন্স দেখুন।

ডায়াগনসিস

  1. যেখানে সমস্যা হয়েছে সেই পরিষেবা কলআউট নীতি এবং যে ভেরিয়েবলের ধরন ভুল আছে তার নাম চিহ্নিত করুন। আপনি সমস্যার উত্তরের faultstring এলিমেন্টে এই দুটি আইটেমই খুঁজে পাবেন। যেমন, নিম্নলিখিত faultstring-এ, নীতির নাম হল ExecuteGeocodingRequest এবং ভেরিয়েবল হল var_response:

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

  2. কাজ না করা সার্ভিস কলআউট নীতি XML-এ, যাচাই করে দেখুন যে <Request> এলিমেন্টে সেট করা ভেরিয়েবলের নাম ফল্ট স্ট্রিংয়ে (উপরে #১ ধাপ) শনাক্ত করা ভেরিয়েবলের নামের সাথে মিলছে কিনা। যেমন, নিম্নলিখিত নীতিতে 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 প্রক্সি বান্ডেলের মধ্যে কোডটি খুঁজে বের করুন, যেখানে ভেরিয়েবলটি প্রথম সংজ্ঞায়িত করা হয়েছিল।
    2. বেশিরভাগ ক্ষেত্রে, আপনি দেখতে পাবেন যে সমস্যা সংক্রান্ত ভেরিয়েবলটি অন্য একটি নীতিতে তৈরি ও পপুলেট করা হয়েছে যা সার্ভিস কলআউট নীতির আগে এক্সিকিউট হয়। যেমন, API প্রক্সি ফ্লোতে ভেরিয়েবল তৈরি ও পপুলেট করার জন্য অ্যাসাইন মেসেজ নীতি সাধারণত ব্যবহার করা হয়।
    3. যে নীতিতে ভেরিয়েবলটি প্রথম সংজ্ঞায়িত ও পপুলেট করা হয়েছে সেটি খুঁজে পাওয়ার পরে, আপনাকে নিম্নলিখিতভাবে সেই ভেরিয়েবলের ধরন নির্ধারণ করতে হবে:
      • type অ্যাট্রিবিউটের ভ্যালু চেক করুন (যদি থাকে)।
      • type অ্যাট্রিবিউট না থাকলে, ভেরিয়েবলকে স্ট্রিং হিসেবে বিবেচনা করা হয়।
    4. ভেরিয়েবলের ধরন অনুরোধ মেসেজ ধরনের না হলে, এটিই সমস্যার কারণ। আপনি ভেরিয়েবেল রেফারেন্স থেকে সাধারণ ভেরিয়েবেল ও সেগুলির ধরন সম্পর্কে জানতে পারবেন।

যেমন, ধরে নিন যে পরিষেবা কলআউট নীতিতে উল্লেখ করা var_response ভেরিয়েবলটি নিম্নলিখিত অ্যাসাইন মেসেজ নীতিতে তৈরি করা হয়েছে। মনে রাখবেন, 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> এলিমেন্টে ব্যবহার করা হয়।

<?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> এলিমেন্ট পরিবর্তন করে এমন একটি বিদ্যমান বা নতুন ভেরিয়েবল নির্দিষ্ট করতে হবে যা অনুরোধ মেসেজ ধরনের এবং এটি সার্ভিস কলআউট নীতিতে কাজ করবে। যেমন:

<?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 ভুল ফর্ম্যাটে আছে অথবা এতে ভুল বা অ্যাক্সেস করা যায় না এমন হোস্ট নেম আছে।

ডায়াগনসিস

  1. যে পরিষেবা কলআউট নীতির কারণে সমস্যা হয়েছে সেটি শনাক্ত করুন। সমস্যার উত্তরে faultstring এলিমেন্টে নীতির নাম দেখা যায়। যেমন, নিম্নলিখিত faultstring-এ, ব্যর্থ হওয়া পরিষেবা কলআউট নীতির নাম হল ExecuteGeocodingRequest।

    "faultstring": "ServiceCallout[ExecuteGeocodingRequest]"

  2. কাজ না করা সার্ভিস কলআউট নীতিতে, <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 সমস্যার উত্তর দেয়।

ডায়াগনসিস

  1. যে পরিষেবা কলআউট নীতির কারণে সমস্যা হয়েছে সেটি শনাক্ত করুন। সমস্যার উত্তরে faultstring এলিমেন্টে নীতির নাম দেখা যায়। যেমন, নিম্নলিখিত faultstring-এ, ব্যর্থ হওয়া পরিষেবা কলআউট নীতির নাম হল ExecuteGeocodingRequest।

    "faultstring": "ServiceCallout[ExecuteGeocodingRequest]

  2. এরর রেসপন্স বডিতে faultstring পরীক্ষা করুন এবং Reason-এ কোনও 4XX বা 5XX রেসপন্স কোড তালিকাভুক্ত আছে কিনা তা চেক করুন। যেমন, নিম্নলিখিত faultstring স্পষ্টভাবে ইঙ্গিত করে যে ব্যাকএন্ড সার্ভার থেকে একটি রেসপন্স কোড 502 ফেরত এসেছে:

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

রেজোলিউশন

আপনি একবার সমস্যার কোড নির্ধারণ করতে পারলে, যেকোনও 4XX বা 5XX সমস্যার মতো এই সমস্যার সমাধান করতে পারবেন। 4XX বা 5XX সমস্যার সমাধান ও তা ঠিক করার নির্দেশাবলীর জন্য রানটাইম সমস্যা (4XX/5XX) প্লেবুক দেখুন।