কন্ডিশন রেফারেন্স

আপনি Apigee Edge ডকুমেন্টেশন দেখছেন।
Apigee X ডকুমেন্টেশন দেখুন।
তথ্য

কন্ডিশন, API প্রক্সিগুলিকে রানটাইমে ডায়নামিক আচরণ করতে সক্ষম করে। কন্ডিশন, ভেরিয়েবলের উপর অপারেশন নির্ধারণ করে, যা Apigee Edge প্রসেসিং পাইপলাইন মূল্যায়ন করে। কন্ডিশনাল স্টেটমেন্ট হল বুলিয়ান এবং সবসময় true বা false হিসেবে মূল্যায়ন করা হয়।

শর্তাবলী এক নজরে

Edge-এর সাথে কীভাবে এবং কোথায় কন্ডিশনাল স্টেটমেন্ট ব্যবহার করতে হয়, তা এই বিভাগে বর্ণনা করা হয়েছে। এছাড়াও, নিম্নলিখিত বিভাগগুলিতে সিনট্যাক্স সম্পর্কে বর্ণনা করা হয়েছে:

Structure of conditional statements

শর্তসাপেক্ষ বিবৃতির প্রাথমিক গঠন হল:

<Condition>variable.name operator "value"</Condition>

যেমন:

<Condition>request.verb = "GET"</Condition>

একসাথে একাধিক শর্ত প্রয়োগ করতে, আপনি AND-এর মাধ্যমে শর্তগুলিকে একত্রিত করতে পারেন। যেমন, নিম্নলিখিত শর্তগুলি তখনই true হিসেবে মূল্যায়ন করা হবে যদি অনুরোধের URI /statuses এবং অনুরোধের HTTP ভার্ব GET-এর সাথে ম্যাচ করে:

<Condition>(proxy.pathsuffix MatchesPath "/statuses") and (request.verb = "GET")</Condition>

আপনি কোথায় শর্তসাপেক্ষ বিবৃতি ব্যবহার করতে পারবেন

আপনি নিম্নলিখিত বিষয়গুলিতে আচরণ কন্ট্রোল করতে কন্ডিশন ব্যবহার করতে পারবেন:

নীতি প্রয়োগ করা

শর্তাধীন বিবৃতি ব্যবহার করে, আপনি নীতি প্রয়োগ করা কন্ট্রোল করতে পারবেন। HTTP হেডার বা মেসেজ কন্টেন্টের উপর ভিত্তি করে রেসপন্স মেসেজের কন্ডিশনাল ট্রান্সফর্মেশন হল একটি সাধারণ ব্যবহারের ক্ষেত্র।

নিম্নলিখিত উদাহরণটি Accept শীর্ষকের উপর ভিত্তি করে XML-কে JSON-এ শর্তসাপেক্ষে ট্রান্সফর্ম করে:

<Step>
  <Condition>request.header.accept = "application/json"</Condition>
  <Name>XMLToJSON</Name>
</Step>

ফ্লো এক্সিকিউশন

শর্তাধীন বিবৃতি ব্যবহার করে, আপনি ProxyEndpoints এবং TargetEndpoints-এ নামযুক্ত ফ্লোর এক্সিকিউশন কন্ট্রোল করতে পারবেন। মনে রাখবেন, শুধুমাত্র 'নামযুক্ত' ফ্লোই শর্তসাপেক্ষে এক্সিকিউট করা যায়। ProxyEndpoints এবং TargetEndpoints-এ প্রিফ্লো ও পোস্টফ্লো (অনুরোধ ও উত্তর, দুটিই) প্রতিটি ট্রানজ্যাকশনের জন্য এক্সিকিউট হয় এবং এর ফলে শর্তহীন 'ফেলসেফ' ক্ষমতা প্রদান করে।

যেমন, অনুরোধের HTTP ক্রিয়া অনুযায়ী কন্ডিশনাল অনুরোধ ফ্লো এবং কোনও সমস্যার (সম্ভাব্য) HTTP স্ট্যাটাস কোড অনুযায়ী কন্ডিশনাল উত্তর ফ্লো এক্সিকিউট করতে:

<Flow name="GetRequests">
  <Condition>request.verb = "GET"</Condition>
  <Request>
    <Step>
      <Condition>request.path MatchesPath "/statuses/**"</Condition>
      <Name>StatusesRequestPolicy</Name>
    </Step>
  </Request>
  <Response>
    <Step>
      <Condition>(response.status.code = 503) or (response.status.code = 400)</Condition>
      <Name>MaintenancePolicy</Name>
    </Step>
  </Response>
</Flow>

টার্গেট এন্ডপয়েন্ট রুট বেছে নেওয়া

শর্তাধীন বিবৃতি ব্যবহার করে, আপনি প্রক্সি এন্ডপয়েন্ট কনফিগারেশনের মাধ্যমে টার্গেট এন্ডপয়েন্টকে কন্ট্রোল করতে পারবেন। কোনও রুট নিয়ম একটি নির্দিষ্ট টার্গেট এন্ডপয়েন্টে অনুরোধ ফরওয়ার্ড করে। একাধিক টার্গেট এন্ডপয়েন্ট উপলভ্য থাকলে, রুট নিয়মের শর্ত মূল্যায়ন করা হয় এবং সেটি সত্য হলে, নামযুক্ত টার্গেট এন্ডপয়েন্টে অনুরোধ ফরওয়ার্ড করা হয়।

যেমন, Content-Type-এর উপর ভিত্তি করে নির্দিষ্ট টার্গেট এন্ডপয়েন্টে শর্তসাপেক্ষে মেসেজ রাউট করতে:

<RouteRule name="default">
 <!--this routing executes if the header indicates that this is an XML call. If true, the call is routed to the endpoint XMLTargetEndpoint-->
  <Condition>request.header.Content-Type = "text/xml"</Condition>
  <TargetEndpoint>XmlTargetEndpoint</TargetEndpoint>
</RouteRule>

আরও তথ্যের জন্য ফ্লো ভেরিয়েবল ও কন্ডিশন দেখুন।

পাথ এক্সপ্রেশন

URI পাথ ম্যাচ করানোর জন্য পাথ এক্সপ্রেশন ব্যবহার করা হয়, একটি পাথ এলিমেন্ট বোঝানোর জন্য "*" এবং একাধিক URI লেভেল বোঝানোর জন্য "**" ব্যবহার করা হয়।

যেমন:

প্যাটার্ন ম্যাচ করা স্যাম্পেল URI পাথ
/*/a/ /x/a/ বা /y/a/
/*/a/* /x/a/b বা /y/a/foo
/*/a/** /x/a/b/c/d
/*/a/*/feed/ /x/a/b/feed/ বা /y/a/foo/feed/
/a/**/feed/** /a/b/feed/rss/1234

%-কে এস্কেপ ক্যারেক্টার হিসেবে বিবেচনা করা হয়। The pattern %{user%} matches {user} but not user.

ভেরিয়েবল

আপনি কন্ডিশনাল স্টেটমেন্টে বিল্ট-ইন ফ্লো ভেরিয়েবল ও কাস্টম ভেরিয়েবল, দুটিই ব্যবহার করতে পারবেন। আরও তথ্যের জন্য এগুলি দেখুন:

অপারেটর

অপারেটর ব্যবহার করার সময়, নিম্নলিখিত বিধিনিষেধ মেনে চলুন:

  • অপারেটরকে ভেরিয়েবলের নাম হিসেবে ব্যবহার করা যাবে না।
  • অপারেটরের আগে ও পরে স্পেস দিতে হবে।
  • ভেরিয়েবলে অপারেটর যোগ করতে, ভেরিয়েবলের নাম অবশ্যই সিঙ্গেল কোটের মধ্যে রাখতে হবে। যেমন, 'request.header.help!me'
  • গাণিতিক অপারেটর (+ * - / %) কাজ করে না।
  • অপারেটরদের জন্য Java অগ্রাধিকার ব্যবহার করা হয়।
  • Apigee Edge-এ রেগুলার এক্সপ্রেশন ব্যবহার করা হয় যা java.util.regex-এ প্রয়োগ করা হয়।

নিচের সারণীতে কাজ করে এমন অপারেটরদের তালিকা দেওয়া হল। আপনার এক্সপ্রেশনে আপনি চিহ্ন বা শব্দ ব্যবহার করতে পারবেন:

প্রতীক Word বিবরণ
! Not, not একক অপারেটর (একটি ইনপুট নেয়)
= Equals, Is সমান (ছোট ও বড় হাতের অক্ষরের মধ্যে পার্থক্য করা হয়)
!= NotEquals, IsNot সমান নয় (ছোট ও বড় হাতের অক্ষরের মধ্যে পার্থক্য করা হয়)
:= EqualsCaseInsensitive সমান কিন্তু ছোট ও বড় হাতের অক্ষরের মধ্যে পার্থক্য করা হয় না
> বা &gt; GreaterThan এর থেকে বড়। Edge UI-তে কন্ডিশন নির্ধারণ করার সময় আপনি > ব্যবহার করলে, এটি &gt;-এ কনভার্ট হয়ে যায়।
>= বা &gt;= GreaterThanOrEquals এর থেকে বড় বা এর সমান। Edge UI-তে কন্ডিশন নির্ধারণ করার সময় আপনি >= ব্যবহার করলে, এটি &gt;=-এ কনভার্ট হয়ে যায়।
&lt; LesserThan এর চেয়ে কম। Edge UI-তে লিটারেল < কাজ করে না।
&lt;= LesserThanOrEquals এর থেকে ছোট বা সমান। Edge UI-তে <= লিটারেল কাজ করে না।
&& And, and এবং
|| Or Or অপারেটরের ক্ষেত্রে ছোট ও বড় হাতের অক্ষরের মধ্যে পার্থক্য করা হয় না। যেমন, OR, Or ও or, এগুলি সবই বৈধ।
() এক্সপ্রেশনকে গ্রুপ করে। ( এক্সপ্রেশন খোলে এবং ) সেটি বন্ধ করে দেয়।
~~ JavaRegex

javax.util.regex মেনে চলে এমন রেগুলার এক্সপ্রেশনের সাথে ম্যাচ করে। ম্যাচটি ছোট ও বড় হাতের অক্ষরের মধ্যে পার্থক্য করে। যেমন, কন্ডিশনাল স্টেটমেন্টে প্যাটার্ন ম্যাচিং দেখুন।

~ Matches, Like "*" ওয়াইল্ডকার্ড অক্ষর ব্যবহার করে গ্লোব-স্টাইল প্যাটার্নের সাথে ম্যাচ করে। ম্যাচটি ছোট ও বড় হাতের অক্ষরের মধ্যে পার্থক্য করে। যেমন, কন্ডিশনাল সহ প্যাটার্ন ম্যাচিং দেখুন।
~/ MatchesPath, LikePath পাথ এক্সপ্রেশনের সাথে মিলছে। ম্যাচ করার ক্ষেত্রে ছোট ও বড় হাতের অক্ষরের মধ্যে পার্থক্য করা হয়। যেমন, কন্ডিশনাল সহ প্যাটার্ন ম্যাচিং দেখুন।
=| StartsWith স্ট্রিংয়ের প্রথম অক্ষরের সাথে ম্যাচ করে। ম্যাচ করার ক্ষেত্রে ছোট ও বড় হাতের অক্ষরের মধ্যে পার্থক্য করা হয়।

অপারেন্ড

Apigee Edge, তুলনা করার আগে অপার‍্যান্ডকে সাধারণ ডেটা টাইপে অ্যাডাপ্ট করে। যেমন, যদি উত্তর স্ট্যাটাস কোড 404 হয়, তাহলে এক্সপ্রেশন response.status.code = "400" এবং response.status.code = 400 একই।

সংখ্যাসূচক অপার‍্যান্ডের ক্ষেত্রে, ভ্যালু নিম্নলিখিতভাবে দ্বারা শেষ না হলে, ডেটার ধরনকে পূর্ণসংখ্যা হিসেবে ব্যাখ্যা করা হয়:

  • "f" বা "F" (ফ্লোট, যেমন, 3.142f, 91.1F)
  • "d" বা "D" (ডবল, যেমন, 3.142d, 100.123D)
  • "l" বা "L" (লং, যেমন, 12321421312L)

এইসব ক্ষেত্রে, সিস্টেম নিম্নলিখিত সারণীতে দেখানো অ্যাডাপ্টেশন পারফর্ম করে (যেখানে RHS বলতে ইকুয়েশনের ডানদিক এবং LHS বলতে বাঁদিক বোঝানো হয়েছে):

RHS LHS বুলিয়ান পূর্ণসংখ্যা দীর্ঘ ফ্লোট ডবল স্ট্রিং তুলনাযোগ্য অবজেক্ট
বুলিয়ান বুলিয়ান পূর্ণসংখ্যা দীর্ঘ ফ্লোট ডবল স্ট্রিং -
পূর্ণসংখ্যা পূর্ণসংখ্যা পূর্ণসংখ্যা দীর্ঘ ফ্লোট ডবল স্ট্রিং তুলনাযোগ্য -
দীর্ঘ দীর্ঘ দীর্ঘ দীর্ঘ ফ্লোট ডবল স্ট্রিং তুলনাযোগ্য -
ফ্লোট ফ্লোট ফ্লোট ফ্লোট ফ্লোট ডবল স্ট্রিং তুলনাযোগ্য -
ডবল ডবল ডবল ডবল ডবল ডবল স্ট্রিং তুলনাযোগ্য -
স্ট্রিং স্ট্রিং স্ট্রিং স্ট্রিং স্ট্রিং স্ট্রিং স্ট্রিং তুলনাযোগ্য -
তুলনাযোগ্য তুলনাযোগ্য তুলনাযোগ্য তুলনাযোগ্য তুলনাযোগ্য তুলনাযোগ্য তুলনাযোগ্য তুলনাযোগ্য -
অবজেক্ট - - - - - - - -

নাল অপার‍্যান্ড

নিচের সারণী থেকে বোঝা যায় যে, অপারেন্ডের বাঁদিকে (LHS) এবং/অথবা ডানদিকে (RHS) নাল ভ্যালু থাকলে, শর্ত true অথবা false হিসেবে মূল্যায়ন করা হয়:

অপারেটর LHS null RHS null LHS ও RHS শূন্য
=, ==, := মিথ্যা মিথ্যা true
=| মিথ্যা মিথ্যা মিথ্যা
!= true true মিথ্যা
> বা &gt; true মিথ্যা মিথ্যা
>= বা &gt;= মিথ্যা true true
&lt; true মিথ্যা মিথ্যা
&lt;= true মিথ্যা true
~ মিথ্যা প্রযোজ্য নয় মিথ্যা
~~ মিথ্যা প্রযোজ্য নয় মিথ্যা
!~ true মিথ্যা মিথ্যা
~/ মিথ্যা প্রযোজ্য নয় মিথ্যা

লিটারেল

স্ট্রিং ও নিউমেরিক লিটেরাল ছাড়াও, আপনি শর্তাধীন বিবৃতিতে নিম্নলিখিত লিটেরাল ব্যবহার করতে পারবেন:

  • null
  • true
  • false

যেমন:

  • request.header.host is null
  • flow.cachehit is true

উদাহরণ

<RouteRule name="default">
     <Condition>request.header.content-type = "text/xml"</Condition>
     <TargetEndpoint>XmlTargetEndpoint</TargetEndpoint>
</RouteRule>
<Step>
    <Condition>response.status.code = 503</Condition>
    <Name>MaintenancePolicy</Name>
</Step>
<Flow name="GetRequests">
    <Condition>response.verb="GET"</Condition>
    <Request>
        <Step>
            <Condition>request.path ~ "/statuses/**"</Condition>
            <Name>StatusesRequestPolicy</Name>
        </Step>
    </Request>
    <Response>
        <Step>
            <Condition>(response.status.code = 503) or (response.status.code = 400)</Condition>
            <Name>MaintenancePolicy</Name>
        </Step>
    </Response>
</Flow>