ফ্লো ভেরিয়েবল সহ কন্ডিশন

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

কন্ডিশনাল স্টেটমেন্ট হল সব প্রোগ্রামিং ভাষায় একটি সাধারণ কন্ট্রোল স্ট্রাকচার। প্রোগ্রামিং ভাষার মতো, API প্রক্সি কনফিগারেশন ফ্লো, নীতি, স্টেপ ও RouteRules-এর জন্য কন্ডিশনাল স্টেটমেন্ট কাজ করে। কন্ডিশনাল স্টেটমেন্ট ডিফাইন করার মাধ্যমে, আপনি নিজের API-এর জন্য ডায়নামিক আচরণ ডিফাইন করেন। এই ডায়নামিক আচরণ আপনাকে মোবাইল ডিভাইসের জন্য XML-কে JSON-এ কনভার্ট করা অথবা কন্টেন্টের ধরন বা অনুরোধ মেসেজের HTTP ভার্বের উপর ভিত্তি করে ব্যাকএন্ড URL-এ রাউটিং করার মতো কাজ করতে দেয়।

এই বিষয় আপনাকে দেখায় যে কীভাবে রানটাইমে API ম্যানেজমেন্ট ফিচার ডাইনামিক প্রয়োগ করার জন্য কন্ডিশন ব্যবহার করতে হয়, এর জন্য কোনও কোড লিখতে হয় না।

শর্তসাপেক্ষ বিবৃতি কনফিগার করা

কন্ডিশন ও ভেরিয়েবল-এর সংমিশ্রণ ব্যবহার করে API প্রক্সিতে কন্ডিশনাল আচরণ প্রয়োগ করা হয়। কন্ডিশন এলিমেন্ট ব্যবহার করে শর্তসাপেক্ষ বিবৃতি তৈরি করা হয়। নিচে একটি ফাঁকা কন্ডিশন দেওয়া হল:

<Condition></Condition>

শর্তসাপেক্ষ বিবৃতি তৈরি করতে, আপনাকে একটি শর্তসাপেক্ষ অপারেটর ও একটি ভেরিয়েবল যোগ করে নিম্নলিখিত স্ট্রাকচার তৈরি করতে হবে:

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

কাজ করে এমন কন্ডিশনাল অপারেটরের মধ্যে = (সমান), != (সমান নয়), এবং > (এর চেয়ে বড়) অন্তর্ভুক্ত। পাঠযোগ্যতার জন্য, আপনি কন্ডিশনালগুলিকে এভাবেও লিখতে পারেন টেক্সট: equals, notequals, greaterthan.

URI পাথের সাথে কাজ করার সময় আপনি ~/ বা MatchesPath ব্যবহার করতে পারবেন। এছাড়াও, আপনি ~~ অপারেটরের সাহায্যে JavaRegex রেগুলার এক্সপ্রেশন ম্যাচ করতে পারবেন।

ব্যাকএন্ড API রিসোর্সে API প্রক্সি কন্ডিশনাল ফ্লো ডিফাইন করতে কন্ডিশন ব্যবহার করা হয়, যা ব্যাকএন্ড API রিসোর্সে কন্ডিশনাল ফ্লো তৈরি করুন লিঙ্কে বর্ণনা করা আছে। শর্তসাপেক্ষ তালিকার সম্পূর্ণ বিবরণের জন্য, শর্তের রেফারেন্স দেখুন।

ভেরিয়েবল

ভেরিয়েবলের ভ্যালু মূল্যায়ন করে কন্ডিশন কাজ করে। ভেরিয়েবল হল API প্রক্সি দ্বারা এক্সিকিউট করা HTTP ট্রানজ্যাকশনের প্রপার্টি অথবা API প্রক্সি কনফিগারেশনের প্রপার্টি। কোনও অ্যাপ থেকে API প্রক্সি কোনও অনুরোধ পেলে, Apigee Edge সিস্টেম টাইম, অ্যাপের নেটওয়ার্ক তথ্য, মেসেজে HTTP হেডার, API প্রক্সি কনফিগারেশন, নীতি প্রয়োগ ইত্যাদি সম্পর্কিত ভেরিয়েবলের একটি দীর্ঘ তালিকা পূরণ করে। এটি একটি সমৃদ্ধ প্রসঙ্গ তৈরি করে যা আপনি শর্তসাপেক্ষ বিবৃতি সেট-আপ করতে ব্যবহার করতে পারেন।

ভেরিয়েবল সবসময় ডটেড নোটেশন ব্যবহার করে। যেমন, অনুরোধ মেসেজের HTTP হেডার request.header.{header_name} নামে ভেরিয়েবল হিসেবে উপলভ্য। তাই, Content-type হেডার মূল্যায়ন করতে, আপনি request.header.Content-type ভেরিয়েবল ব্যবহার করতে পারেন। যেমন, request.header.Content-type = "application/json" চিহ্নটি বোঝায় যে অনুরোধের কন্টেন্টের ধরন JSON হতে হবে।

ধরে নিন, আপনাকে এমন একটি কন্ডিশনাল স্টেটমেন্ট তৈরি করতে হবে যা কোনও নীতিকে শুধুমাত্র তখনই প্রয়োগ করবে যখন কোনও অনুরোধ মেসেজ হল GET। অনুরোধের HTTP ক্রিয়া মূল্যায়ন করে এমন কন্ডিশন তৈরি করতে, আপনি নিচে দেওয়া কন্ডিশনাল স্টেটমেন্ট তৈরি করুন। এই কন্ডিশনের ভেরিয়েবল হল request.verb. ভেরিয়েবলের ভ্যালু হল GET। অপারেটর হল =.

<Condition>request.verb = "GET"</Condition>
এছাড়াও, আপনি এগুলি ব্যবহার করতে পারেন:
<Condition>request.verb equals "GET"</Condition>

Edge শর্তাবলী মূল্যায়ন করার জন্য এই ধরনের বিবৃতি ব্যবহার করে। উপরের উদাহরণটি তখনই 'ট্রু' হিসেবে মূল্যায়ন করা হবে যদি অনুরোধের সাথে যুক্ত HTTP ক্রিয়াটি GET হয়। অনুরোধের সাথে যুক্ত HTTP ক্রিয়া POST হলে, বিবৃতিটি মিথ্যা হিসেবে মূল্যায়ন করা হয়।

ডায়নামিক আচরণ চালু করতে, আপনি ফ্লো, স্টেপ ও RouteRules-এর সাথে শর্তাবলী অ্যাটাচ করতে পারবেন।

আপনি কোনও Flow-তে কন্ডিশন যোগ করলে, একটি 'কন্ডিশনাল Flow' তৈরি করেন। শর্তাধীন ফ্লো শুধুমাত্র শর্তের মূল্যায়ন 'সত্য' হলে তবেই এক্সিকিউট হয়। আপনি শর্তসাপেক্ষ ফ্লোতে যতগুলি ইচ্ছা নীতি অ্যাটাচ করতে পারবেন। কন্ডিশনাল ফ্লো আপনাকে অনুরোধ বা উত্তর মেসেজের জন্য অত্যন্ত বিশেষ প্রসেসিং নিয়ম তৈরি করতে দেয় যা নির্দিষ্ট মাপকাঠি পূরণ করে।

যেমন, এমন একটি ফ্লো তৈরি করতে যা শুধুমাত্র অনুরোধের ক্রিয়া GET হলে তবেই এক্সিকিউট হয়:

<Flows>
  <Flow name="ExecuteForGETs">
  <Condition>request.verb="GET"</Condition>
  </Flow>
</Flows>

GET-এর জন্য একটি ফ্লো এবং POST-এর জন্য আরেকটি ফ্লো তৈরি করতে:

<Flows>
  <Flow name="ExecuteForGETs">
  <Condition>request.verb="GET"</Condition>
  </Flow>
  <Flow name="ExecuteForPOSTs">
  <Condition>request.verb="POST"</Condition>
  </Flow>
</Flows>

নিচের উদাহরণে দেখানো হয়েছে, আপনি নীতি সংক্রান্ত ধাপেই শর্ত প্রয়োগ করতে পারবেন। নিম্নলিখিত শর্তের কারণে VerifyApiKey নীতি শুধুমাত্র তখনই প্রয়োগ করা হয়, যদি কোনও অনুরোধ মেসেজ POST হয়।

<PreFlow name="PreFlow">
    <Request>
        <Step>
            <Condition>request.verb equals "POST"</Condition>
            <Name>VerifyApiKey</Name>
        </Step>
    </Request>
</PreFlow>

এই ধরনের কন্ডিশনাল ফ্লো নির্ধারণ করার পরে, আপনি সেগুলির সাথে নীতি অ্যাটাচ করতে পারবেন, এর ফলে API প্রক্সি GET অনুরোধের জন্য এক সেট নীতি এবং POST অনুরোধের জন্য অন্য সেট নীতি প্রয়োগ করতে পারবে।

বিস্তারিত রেফারেন্স তথ্যের জন্য, নিম্নলিখিত রিসোর্স দেখুন:

নমুনা ১

নিচে দেওয়া উদাহরণে ProxyEndpoint রেসপন্স ফ্লোতে কনফিগার করা Convert-for-devices নামের একটি কন্ডিশনাল ফ্লো দেখানো হয়েছে। যে এন্টিটির উপর কন্ডিশন প্রযোজ্য, সেটিতে কন্ডিশনকে এলিমেন্ট হিসেবে যোগ করুন। এই উদাহরণে, কন্ডিশন হল ফ্লোয়ের একটি কম্পোনেন্ট। তাই, স্টেটমেন্টের মূল্যায়ন 'সঠিক' হলে ফ্লো এক্সিকিউট হবে।

<Flows>
  <Flow name="Convert-for-devices">
  <Condition>(request.header.User-Agent = "Mozilla")</Condition>
    <Response>
      <Step><Name>ConvertToJSON</Name></Step>
    </Response>
  </Flow>
</Flows>

কোনও অ্যাপ থেকে পাওয়া প্রতিটি অনুরোধের জন্য, Edge, ভেরিয়েবল হিসেবে উপস্থিত থাকা সব HTTP হেডারের ভ্যালু স্টোর করে। অনুরোধে User-Agent নামের কোনও HTTP হেডার থাকলে, সেই হেডার ও তার ভ্যালু request.header.User-Agent নামের ভেরিয়েবল হিসেবে স্টোর করা হয়।

উপরে দেওয়া ProxyEndpoint কনফিগারেশন অনুযায়ী, Edge request.header.User-Agent ভেরিয়েবলের ভ্যালু চেক করে দেখে যে কন্ডিশনটি true হিসেবে মূল্যায়ন করা হয়েছে কিনা।

যদি কন্ডিশনটি সত্য হয়, অর্থাৎ, ভেরিয়েবলের ভ্যালু request.header.User-Agent সমান Mozilla হয়, তাহলে কন্ডিশনাল ফ্লো এক্সিকিউট হয় এবং ConvertToJSON নামের XMLtoJSON নীতি প্রয়োগ করা হয়। তা না হলে, Flow এক্সিকিউট করা হয় না এবং অনুরোধকারী অ্যাপকে অপরিবর্তিত XML উত্তর (XML ফর্ম্যাটে) ফেরত দেওয়া হয়।

নমুনা ২

আসুন একটি নির্দিষ্ট উদাহরণ ব্যবহার করি যেখানে আপনাকে XML থেকে JSON-এ উত্তরের মেসেজ ট্রান্সফর্ম করতে হবে—তবে শুধুমাত্র মোবাইল ডিভাইসের জন্য। প্রথমে, এমন একটি নীতি তৈরি করুন যা Weather API থেকে পাওয়া XML-ফর্ম্যাট করা রেসপন্সকে JSON-এ কনভার্ট করবে:

<XMLToJSON name="ConvertToJSON">
  <Options>
  </Options>
  <OutputVariable>response</OutputVariable>
  <Source>response</Source>
</XMLToJSON>

উপরের নীতি কনফিগারেশন API প্রক্সিটিকে রেসপন্স মেসেজ নিতে, ডিফল্ট সেটিংস সহ XML থেকে JSON-এ কনভার্সন পারফর্ম করতে এবং তারপরে নতুন রেসপন্স মেসেজে ফলাফল লিখতে বলে। (আপনি XML থেকে JSON-এ অনুরোধ মেসেজ কনভার্ট করলে, এই দুটি ভ্যালুকেই request হিসেবে সেট করুন।)

দেখুন

যেহেতু আপনি XML থেকে JSON-এ উত্তর কনভার্ট করতে চান, তাই কনভার্সন পারফর্ম করতে আপনাকে একটি কন্ডিশনাল রেসপন্স ফ্লো কনফিগার করতে হবে। যেমন, ক্লায়েন্ট অ্যাপে উত্তর পাঠানোর আগে, XML থেকে JSON-এ সব উত্তর কনভার্ট করতে, নিম্নলিখিত ProxyEndpoint রেসপন্স ফ্লো কনফিগার করুন।

<Flows>
  <Flow name="Convert-for-devices">
    <Response>
      <Step><Name>ConvertToJSON</Name></Step>
    </Response>
  </Flow>
</Flows>

আপনি স্ট্যান্ডার্ড অনুরোধ ব্যবহার করে API ইনভোক করলে, উত্তর JSON ফর্ম্যাটে ফর্ম্যাট করা হয়।

তবে, আপনার লক্ষ্য হল, অনুরোধকারী ক্লায়েন্ট মোবাইল ডিভাইস হলে শুধুমাত্র তখনই আবহাওয়ার রিপোর্টকে JSON-এ কনভার্ট করা। এই ধরনের ডায়নামিক আচরণ চালু করতে, আপনাকে অবশ্যই ফ্লোতে একটি শর্তসাপেক্ষ বিবৃতি যোগ করতে হবে।

শর্তসাপেক্ষ ফ্লো পরীক্ষা করুন

এই নমুনা অনুরোধে, HTTP User-Agent হেডারকে Mozilla হিসেবে সেট করা হয়েছে, এর ফলে কন্ডিশনাল স্টেটমেন্টটি মূল্যায়ন করে true হিসেবে দেখাচ্ছে এবং কন্ডিশনাল ফ্লো Convert-for-devices এক্সিকিউট করছে।

$ curl -H "User-Agent:Mozilla" http://{org_name}-test.apigee.net/weather/forecastrss?w=12797282

অথবা, যেখানে Python উপলভ্য সেখানে সুন্দর প্রিন্ট করতে:

$ curl -H "User-Agent:Mozilla" http://{org_name}-test.apigee.net/weather/forecastrss?w=12797282 | python -mjson.tool

নমুনা উত্তর:

. . .

"yweather_forecast": [
         {
              "code": "11",
              "date": "12 Dec 2012",
              "day": "Wed",
              "high": "55",
              "low": "36",
              "text": "Showers"
          },
          {
              "code": "32",
              "date": "13 Dec 2012",
              "day": "Thu",
              "high": "56",
              "low": "38",
              "text": "Sunny"
          }
      ]
  }

. . .

User-Agent হেডার ছাড়া বা Mozilla-এর থেকে আলাদা ভ্যালু সহ অনুরোধ জমা দিলে, XML-ফর্ম্যাট করা উত্তর পাওয়া যাবে।

$ curl http://{org_name}-test.apigee.net/weather/forecastrss?w=12797282

পরিবর্তন না করা XML উত্তর ফেরত দেওয়া হয়।

নমুনা উত্তর:

<yweather:forecast day="Wed" date="12 Dec 2012" low="36" high="55" text="Showers" code="11" /> <yweather:forecast day="Thu" date="13 Dec 2012" low="38" high="56" text="Sunny" code="32" />

প্যাটার্ন ম্যাচিং

এই বিভাগে, Apigee ফ্লোতে শর্ত সহ প্যাটার্ন ম্যাচিং কীভাবে ব্যবহার করতে হয় তা বর্ণনা করা হয়েছে।

অপারেটর

এই বিভাগে, কন্ডিশনাল স্টেটমেন্টে নিম্নলিখিত প্যাটার্ন ম্যাচিং অপারেটর কীভাবে ব্যবহার করতে হয় তা বর্ণনা করা হয়েছে:

ম্যাচ

প্রথমে "Matches" বা "~" কন্ডিশনাল অপারেটর দেখে নেওয়া যাক। এই দুটি অপারেটর একই -- ইংরেজি ভার্সন, "ম্যাচ করে", আরও বেশি পাঠযোগ্য বিকল্প হিসেবে বিবেচিত হয়।

সারসংক্ষেপ: "মিলে যাওয়া" অপারেটর আপনাকে দুটি সম্ভাবনা দেয়। স্ট্রিংটি হুবহু ম্যাচ করুন অথবা "*" দিয়ে ওয়াইল্ডকার্ড ম্যাচ করুন। আপনি যেমন আশা করতে পারেন, ওয়াইল্ডকার্ড শূন্য বা তার বেশি অক্ষর ম্যাচ করে। এটি কীভাবে কাজ করে তা দেখা যাক।

ব্যবহার করুন।

নিচে দেওয়া XML-এ একটি ধাপের কন্ডিশন দেখানো হয়েছে। condition সত্য হলে এটি SomePolicy নীতি প্রয়োগ করে। এই উদাহরণে, আমরা proxy.pathsuffix ভেরিয়েবল পরীক্ষা করি, a Edge-এ বিল্ট-ইন ভেরিয়েবল যা অনুরোধের পাথ সাফিক্স সেভ করে। তবে মনে রাখবেন, আপনি যেকোনও ফ্লো ভেরিয়েবলের ভ্যালু টেস্ট করতে পারবেন যাতে স্ট্রিং থাকে। তাই, এই ক্ষেত্রে, ইনকামিং অনুরোধের বেস পাথ /animals হলে এবং অনুরোধটি /animals/cat হলে, পাথ সাফিক্স হল আক্ষরিক স্ট্রিং "/cat"।

    <PreFlow name="PreFlow">
        <Request>
            <Step>
                <Condition>(proxy.pathsuffix Matches "/cat")</Condition>
                <Name>SomePolicy</Name>
            </Step>
        </Request>
        <Response/>
    </PreFlow>

প্রশ্ন: কোন প্রক্সি পাথ সাফিক্স SomePolicy-কে এক্সিকিউট করতে বাধ্য করবে? এর একটিই সম্ভাবনা আছে।

API কল:

GET http://artomatic-test.apigee.net/matchtest/cat

নীতি কি প্রয়োগ করা হয়? হ্যাঁ, কারণ প্রক্সি পাথ সাফিক্স "/cat" এর সাথে হুবহু মিলে যায়। সাফিক্স /bat বা /dog বা "/" বা অন্য কিছু হলে এটি এক্সিকিউট হবে না।

এখন, এই কন্ডিশনাল স্টেটমেন্টটি বিবেচনা করুন যেখানে আমরা ওয়াইল্ডকার্ড ক্যারেক্টার "*" ব্যবহার করি:

<Condition>(proxy.pathsuffix Matches "/*at")</Condition>

API কল:

GET http://artomatic-test.apigee.net/matchtest/cat

নীতি কি প্রয়োগ করা হয়? হ্যাঁ, কারণ ওয়াইল্ডকার্ড যেকোনও অক্ষরের সাথে ম্যাচ করে এবং "/cat" হল একটি ম্যাচ।

API কল:

GET http://artomatic-test.apigee.net/matchtest/bat

নীতি কি প্রয়োগ করা হয়? হ্যাঁ, কারণ ওয়াইল্ডকার্ড যেকোনও অক্ষরের সাথে ম্যাচ করে, "/bat" একটি ম্যাচ।

API কল:

GET http://artomatic-test.apigee.net/matchtest/owl

নীতি কি প্রয়োগ করা হয়? নিশ্চিতভাবেই না -- যদিও ওয়াইল্ডকার্ড "o"-এর সাথে ম্যাচ করে, "wl" অক্ষরগুলি ম্যাচ করে না।

এখন, ওয়াইল্ডকার্ডকে সাফিক্সের শেষে নিয়ে যাওয়া যাক:

<Condition>(proxy.pathsuffix Matches "/cat*")</Condition>

API কল:

GET http://artomatic-test.apigee.net/matchtest/cat

নীতি কি প্রয়োগ করা হয়? হ্যাঁ, কারণ ওয়াইল্ডকার্ড যেকোনও অক্ষরের শূন্য বা একাধিক ম্যাচের সাথে ম্যাচ করে।

API কল:

GET http://artomatic-test.apigee.net/matchtest/bat

নীতি কি প্রয়োগ করা হয়? না, "/bat" মিলছে না।

API কল:

GET http://artomatic-test.apigee.net/matchtest/cat123

নীতি কি প্রয়োগ করা হয়? হ্যাঁ, ওয়াইল্ডকার্ড যেকোনও অক্ষর শূন্য বা একাধিকবার ম্যাচ করে, তাই "123" একটি ম্যাচ তৈরি করে।

API কল:

GET http://artomatic-test.apigee.net/matchtest/cat/bird/mouse

নীতি কি প্রয়োগ করা হয়? হ্যাঁ, কারণ ওয়াইল্ডকার্ড যেকোনও অক্ষর শূন্য বা একাধিকবার ম্যাচ করে, তাই "/bird/mouse" ম্যাচ তৈরি করে। লক্ষ্য করুন, এই ধরনের এক্সপ্রেশন আপনাকে কীভাবে সমস্যায় ফেলতে পারে কারণ এটি আক্ষরিক অক্ষরের পরে সবকিছু ম্যাচ করে!

প্রশ্ন: Matches অপারেটরের ক্ষেত্রে ছোট ও বড় হাতের অক্ষরের মধ্যে পার্থক্য করা হয়?

হ্যাঁ। ধরে নিন আপনার এই ধরনের কন্ডিশন আছে:

<Condition>(proxy.pathsuffix Matches "/*At")</Condition>

API কল:

GET http://artomatic-test.apigee.net/matchtest/cat

নীতি কি প্রয়োগ করা হয়? না, ওয়াইল্ডকার্ড যেকোনও অক্ষরের সাথে ম্যাচ করে (কেস নির্বিশেষে), কিন্তু ছোট হাতের "ক" বড় হাতের "ক"-এর সাথে ম্যাচ করে না।

API কল:

GET http://artomatic-test.apigee.net/matchtest/bAt

নীতি কি প্রয়োগ করা হয়? হ্যাঁ, কেসটি মিলে যাচ্ছে।

প্রশ্ন: Matches অপারেটরের মাধ্যমে আমি কীভাবে অক্ষর এস্কেপ করব?

রিজার্ভ করা অক্ষর এড়িয়ে যেতে পার্সেন্ট "%" অক্ষর ব্যবহার করুন। যেমন:

<Condition>(proxy.pathsuffix Matches "/c%*at")</Condition>

API কল:

GET http://artomatic-test.apigee.net/matchtest/cat

নীতি কি প্রয়োগ করা হয়? না, Matches অপারেটরটি আক্ষরিক স্ট্রিং "c*at" খুঁজছে।

API কল:

GET http://artomatic-test.apigee.net/matchtest/c*at

প্রশ্ন:নীতি কি প্রয়োগ করা হয়?

হ্যাঁ, এই পাথটি একটু অস্বাভাবিক হলেও, ম্যাচ করছে।

JavaRegex

আপনি দেখতে পাচ্ছেন যে, সাধারণ পরিস্থিতির ক্ষেত্রে "Matches" অপারেটর খুব উপযোগী। তবে, আপনি অন্য অপারেটর, "JavaRegex" বা "~~" অপারেটর ব্যবহার করতে পারেন। এই দুটি একই অপারেটর, তবে JavaRegex-কে আরও বেশি পাঠযোগ্য বলে মনে করা হয়। এটি JavaRegex নামে পরিচিত কারণ এটি রেগুলার এক্সপ্রেশন প্যাটার্ন ম্যাচিং করতে দেয় এবং Edge, Java ভাষায় java.util.regex প্যাকেজের ক্লাসগুলির মতো একই নিয়ম মেনে চলে। JavaRegex অপারেটর যেভাবে কাজ করে তা Matches অপারেটরের থেকে খুবই আলাদা, তাই দু'টিকে গুলিয়ে ফেললে চলবে না!

সংক্রান্ত উদাহরণ দেখুন।

সারসংক্ষেপ: "JavaRegex" অপারেটর আপনাকে কন্ডিশনাল স্টেটমেন্টে রেগুলার এক্সপ্রেশন সিনট্যাক্স ব্যবহার করতে দেয়।

নিচের কোডে একটি Step কন্ডিশন দেখানো হয়েছে। condition সত্য হলে এটি SomePolicy নীতি প্রয়োগ করে। এই উদাহরণে, আমরা proxy.pathsuffix ভেরিয়েবল পরীক্ষা করি, এটি Edge-এর একটি বিল্ট-ইন ভেরিয়েবল যা অনুরোধের পাথ সাফিক্স সেভ করে। ইনকামিং অনুরোধের বেস পাথ /animals হলে এবং অনুরোধটি /animals/cat হলে, পাথ সাফিক্স হল আক্ষরিক স্ট্রিং "/cat"।

    <PreFlow name="PreFlow">
        <Request>
            <Step>
                <Condition>(proxy.pathsuffix JavaRegex "/cat")</Condition>
                <Name>SomePolicy</Name>
            </Step>
        </Request>
        <Response/>
    </PreFlow>

প্রশ্ন: কোন প্রক্সি পাথ সাফিক্স SomePolicy-কে এক্সিকিউট করতে বাধ্য করবে? Matches অপারেটরের মতো, এই ক্ষেত্রেও শুধুমাত্র একটি সম্ভাবনা রয়েছে।

API কল:

GET http://artomatic-test.apigee.net/matchtest/cat

নীতি কি প্রয়োগ করা হয়? হ্যাঁ, কারণ প্রক্সি পাথ সাফিক্স "/cat" এর সাথে হুবহু মিলে যায়। সাফিক্স /bat বা /dog বা অন্য কিছু হলে এটি এক্সিকিউট হবে না।

এখন, "*" কোয়ান্টিফায়ার ব্যবহার করে একটি রেগুলার এক্সপ্রেশন তৈরি করা যাক। এই কোয়ান্টিফায়ারটি আগের অক্ষরের শূন্য বা তার বেশি সংখ্যার সাথে ম্যাচ করে।

<Condition>(proxy.pathsuffix JavaRegex "/c*t")</Condition>

API কল:

GET http://artomatic-test.apigee.net/matchtest/cat

নীতি কি প্রয়োগ করা হয়? না! "*" কোয়ান্টিফায়ারটি শূন্য বা তার বেশি আগেকার ক্যারেক্টারের সাথে ম্যাচ করে, যেটি হল "c"।

API কল:

GET http://artomatic-test.apigee.net/matchtest/ccccct

নীতি কি প্রয়োগ করা হয়? হ্যাঁ, কারণ ওয়াইল্ডকার্ডটি আগের অক্ষরটির শূন্য বা একাধিক ম্যাচ করে।

এরপরে, আমরা "?" কোয়ান্টিফায়ার ব্যবহার করি, যা আগের অক্ষরটির সাথে একবার বা একবারও ম্যাচ করে না।

<Condition>(proxy.pathsuffix JavaRegex "/ca?t")</Condition>

API কল:

GET http://artomatic-test.apigee.net/matchtest/cat

নীতি কি প্রয়োগ করা হয়? হ্যাঁ। "?" কোয়ান্টিফায়ারটি আগের অক্ষরের শূন্য বা একটি অকারেন্সের সাথে ম্যাচ করে, যা হল "a"।

API কল:

GET http://artomatic-test.apigee.net/matchtest/ct

নীতি কি প্রয়োগ করা হয়? হ্যাঁ। "?" কোয়ান্টিফায়ারটি আগের অক্ষরের একটি বা কোনওটিই নয়র সাথে ম্যাচ করে। এই ক্ষেত্রে, "a" অক্ষরটি নেই, তাই কন্ডিশনটি সত্য হিসেবে মূল্যায়ন করা হয়।

API কল:

GET http://artomatic-test.apigee.net/matchtest/caat

নীতি কি প্রয়োগ করা হয়? না। "?" কোয়ান্টিফায়ারটি আগের অক্ষরের একটির সাথে ম্যাচ করে, যেটি হল "a"।

এরপরে, আমরা রেজেক্স এক্সপ্রেশনের "[abc]" বা "গ্রুপিং" স্টাইল ব্যবহার করি। এটি "a" বা "b" বা "c" অক্ষরগুলির সাথে ম্যাচ করে।

<Condition>(proxy.pathsuffix JavaRegex "/[cbr]at")</Condition>

API কল:

GET http://artomatic-test.apigee.net/matchtest/cat

নীতি কি প্রয়োগ করা হয়? হ্যাঁ। আমরা এখানে রেগুলার এক্সপ্রেশন ব্যবহার করছি এবং "[cbr]" এক্সপ্রেশন "c", "b" অথবা "r"-এর সাথে ম্যাচ করে। এইসব কলও ম্যাচ করে:

GET http://artomatic-test.apigee.net/matchtest/bat

GET http://artomatic-test.apigee.net/matchtest/rat

কিন্তু এটি মিলছে না:

GET http://artomatic-test.apigee.net/matchtest/mat

প্রশ্ন: JavaRegex অপারেটর কি কেস-সেনসিটিভ?

হ্যাঁ। ধরে নিন আপনার কাছে এই ধরনের কন্ডিশন আছে:

<Condition>(proxy.pathsuffix JavaRegex "/ca?t")</Condition>

API কল:

GET http://artomatic-test.apigee.net/matchtest/cat

নীতি কি প্রয়োগ করা হয়? হ্যাঁ, রেজেক্সটি পূর্ববর্তী অক্ষরের শূন্য বা একটির সাথে ম্যাচ করে, যা "a"।

API কল:

GET http://artomatic-test.apigee.net/matchtest/cAt

প্রশ্ন: নীতি কি প্রয়োগ করা হয়?

না, কারণ বড় হাতের "A" ছোট হাতের "a"-এর সাথে মিলছে না।

MatchesPath

MatchesPath অপারেটরকে "~/" হিসেবেও নির্দিষ্ট করা যেতে পারে। এটি কিছুটা Matches (~) এবং JavaRegex (~~) অপারেটরের মতো। কিন্তু MatchesPath সম্পূর্ণ আলাদা।

শুধু মনে রাখবেন যে এই অপারেটর কোনও পাথকে বিভিন্ন অংশের একটি সিরিজ হিসেবে দেখে। তাই, পাথ যদি: /animals/cats/wild হয়, তাহলে আপনি পাথটিকে "/animals", "/cats" ও "/wild" অংশগুলি নিয়ে গঠিত বলে ভাবতে পারেন।

MatchesPath অপারেটর আপনাকে দুটি ওয়াইল্ডকার্ড নোটেশন ব্যবহার করতে দেয়: একটি তারাচিহ্ন (*) এবং একটি দুটি তারাচিহ্ন (**)। একটি তারাচিহ্ন একটি পাথ এলিমেন্টের সাথে ম্যাচ করে। ডবল তারকাচিহ্ন এক বা একাধিক পাথ এলিমেন্টের সাথে ম্যাচ করে।

একটি উদাহরণ দেখা যাক। এই উদাহরণে, আমরা proxy.pathsuffix ভেরিয়েবল পরীক্ষা করি, এটি Edge-এর একটি বিল্ট-ইন ভেরিয়েবল যা অনুরোধের পাথ সাফিক্স সেভ করে। তবে মনে রাখবেন, আপনি স্ট্রিং আছে এমন যেকোনও ফ্লো ভেরিয়েবলের ভ্যালু পরীক্ষা করতে পারবেন।

    <PreFlow name="PreFlow">
        <Request>
            <Step>
                <Condition>(proxy.pathsuffix MatchesPath "/animals/*")</Condition>
                <Name>SomePolicy</Name>
            </Step>
        </Request>
        <Response/>
    </PreFlow>

প্রশ্ন: কোন প্রক্সি পাথ সাফিক্স SomePolicy-কে এক্সিকিউট করতে বাধ্য করবে?

API কল:

GET http://artomatic-test.apigee.net/matchtest/animals

প্রশ্ন: নীতি কি প্রয়োগ করা হয়?

না, কারণ "/*" দ্বারা নির্দিষ্ট করা "/animals" -এর পরে কন্ডিশনে আরেকটি পাথ এলিমেন্ট প্রয়োজন।

API কল:

GET http://artomatic-test.apigee.net/matchtest/animals/

নীতি কি প্রয়োগ করা হয়? হ্যাঁ, পাথে আরেকটি পাথ এলিমেন্ট আছে ("/animals/"-এর পরের অংশ ), কিন্তু সেটি খালি।

API কল:

GET http://artomatic-test.apigee.net/matchtest/animals/cats

নীতি কি প্রয়োগ করা হয়? হ্যাঁ, কারণ পাথে স্পষ্টভাবে একটি এলিমেন্ট ("/cats") আছে যা "/animals"-এর পরে আসে

API কল:

GET http://artomatic-test.apigee.net/matchtest/animals/cats/wild

প্রশ্ন: নীতি কি প্রয়োগ করা হয়?

না, কারণ একটি তারকাচিহ্ন শুধুমাত্র একটি পাথ এলিমেন্টের সাথে ম্যাচ করে এবং এই API-তে "/animals"-এর পরে একটির বেশি এলিমেন্ট আছে।

এখন ডবল অ্যাস্টেরিস্ক ব্যবহার করা যাক:

    <PreFlow name="PreFlow">
        <Request>
            <Step>
                <Condition>(proxy.pathsuffix MatchesPath "/animals/**")</Condition>
                <Name>SomePolicy</Name>
            </Step>
        </Request>
        <Response/>
    </PreFlow>

প্রশ্ন: কোন প্রক্সি পাথ সাফিক্স SomePolicy-কে এক্সিকিউট করতে বাধ্য করবে?

API কল:

GET http://artomatic-test.apigee.net/matchtest/animals

নীতি কি প্রয়োগ করা হয়? না, কারণ শর্তের জন্য "/**" দ্বারা নির্দিষ্ট করা অন্তত একটি নিম্নলিখিত পাথ এলিমেন্ট প্রয়োজন।

API কল:

GET http://artomatic-test.apigee.net/matchtest/animals/

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

হ্যাঁ, পাথে আরেকটি পাথ এলিমেন্ট আছে ("/animals/"-এর পরের অংশ ), কিন্তু সেটি খালি।

API কল:

GET http://artomatic-test.apigee.net/matchtest/animals/cats

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

হ্যাঁ, কারণ পাথে অন্তত একটি এলিমেন্ট আছে যা "/animals"-এর পরে আছে

API কল:

GET http://artomatic-test.apigee.net/matchtest/animals/cats/wild

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

হ্যাঁ, কারণ পাথে একাধিক এলিমেন্ট আছে যা "/animals"-এর পরে আছে

অ্যাস্টেরিক্স মিক্স করা

আপনার পাথ ম্যাচিং আরও রিফাইন করতে, আপনি সিঙ্গেল (*) ও ডবল (**) অ্যাস্টেরিস্কের কম্বিনেশন ব্যবহার করতে পারবেন।

    <PreFlow name="PreFlow">
        <Request>
            <Step>
                <Condition>(proxy.pathsuffix MatchesPath "/animals/*/wild/**")</Condition>
                <Name>SomePolicy</Name>
            </Step>
        </Request>
        <Response/>
    </PreFlow>

API কল:

এইসব API কল ম্যাচ তৈরি করবে:

GET http://artomatic-test.apigee.net/matchtest/animals/cats/wild/

এবং

GET http://artomatic-test.apigee.net/matchtest/animals/dogs/wild/austrailian

এবং

GET http://artomatic-test.apigee.net/matchtest/animals/birds/wild/american/finches

API রিসোর্স

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

  • http://mygreatweatherforecast.com/reports
  • http://mygreatweatherforecast.com/forecasts

আপনি যখন কোনও API প্রক্সি তৈরি করেন (যেমন আপনার প্রথম API প্রক্সি তৈরি করুন নিবন্ধে দেখানো হয়েছে), তখন ন্যূনতম একটি অ্যালিয়াস বেস URL তৈরি করেন যা আপনার ব্যাকএন্ড পরিষেবার সাথে ম্যাপ করে। যেমন:

ব্যাকএন্ড বেস URL নতুন/সমতুল্য API প্রক্সি URL
http://mygreatweatherforecast.com http://{your_org}-{environment}.apigee.net/mygreatweatherforecast

এই পর্যায়ে, আপনি যেকোনও একটি বেস URL ব্যবহার করে আপনার ব্যাকএন্ডে API কল করতে পারবেন। কিন্তু আপনি API প্রক্সি URL ব্যবহার করলে বিষয়টি আরও ইন্টারেস্টিং হয়ে ওঠে।

আপনি API প্রক্সি ব্যবহার করা শুরু করলে Edge API অ্যানালিটিক্স সংগ্রহ করা শুরু করে। এছাড়াও, প্রক্সি আপনাকে কন্ডিশনাল ফ্লো নির্ধারণ করতে দেয় যা আপনার ব্যাকএন্ডের রিসোর্সের সাথে ম্যাপ করে। মোটকথা, "যদি /reports রিসোর্সে কোনও GET কল আসে, তাহলে Edge-কে কিছু করতে হবে।"

নিচের ছবিতে দুটি URL-এর আচরণের পার্থক্য দেখানো হয়েছে যেগুলি শেষ পর্যন্ত একই ব্যাকএন্ড অ্যাক্সেস করে। একটি হল আন-প্রক্সিড রিসোর্স URL এবং অন্যটি হল Edge API প্রক্সি, যার মধ্যে একই ব্যাকএন্ড রিসোর্সে কন্ডিশনাল ফ্লো রয়েছে। আমরা নিচে শর্তসাপেক্ষ ফ্লো সম্পর্কে আরও বিস্তারিতভাবে বর্ণনা করব।

API প্রক্সি কীভাবে নির্দিষ্ট ব্যাকএন্ড রিসোর্সের সাথে ম্যাপ করে

ব্যাকএন্ড পরিষেবার বেস URL-এর সাথে ম্যাপ করা API প্রক্সি URL (আপনি যখন প্রক্সি তৈরি করেন) ব্যবহার করে, আপনি নির্দিষ্ট রিসোর্সে কন্ডিশনাল ফ্লো যোগ করতে পারেন, যেমন আগে উল্লেখ করা /reports ও /forecasts রিসোর্স।

ধরা যাক, আপনি Edge-কে চান যে /reports বা /forecasts রিসোর্সে কল এলে "কিছু করুক"। এই মুহূর্তে আপনি Edge-কে কী করতে হবে তা বলছেন না, শুধু বলছেন যে সে যেন সেইসব রিসোর্সের জন্য কল শোনে। আপনি এটি শর্তাবলী সহ করেন। আপনার Edge API প্রক্সিতে, আপনি /reports এবং /forecasts-এর জন্য কন্ডিশনাল ফ্লো তৈরি করতে পারবেন। ধারণাগত উদ্দেশ্যে, নিম্নলিখিত API প্রক্সি XML থেকে বোঝা যায় যে সেইসব শর্ত কেমন হতে পারে।

<Flows>
    <Flow name="reports">
        <Description/>
        <Request/>
        <Response/>
        <Condition>(proxy.pathsuffix MatchesPath "/reports") and (request.verb = "GET")</Condition>
    </Flow>
    <Flow name="forecasts">
        <Description/>
        <Request/>
        <Response/>
        <Condition>(proxy.pathsuffix MatchesPath "/forecasts") and (request.verb = "GET")</Condition>
    </Flow>
</Flows>

সেইসব শর্তে বলা হয়েছে, "URL-এ /reports ও /forecasts সহ কোনও GET অনুরোধ এলে, আপনি (API ডেভেলপার) সেইসব ফ্লোতে যে নীতি অ্যাটাচ করেন, তার মাধ্যমে Edge-কে যা করতে বলবেন, Edge তাই করবে।

কোনও শর্ত পূরণ হলে Edge-কে কী করতে হবে তা বলার একটি উদাহরণ এখানে দেওয়া হল। নিম্নলিখিত API প্রক্সি XML-এ, যখন কোনও GET অনুরোধ https://yourorg-test.apigee.net/mygreatweatherforecast/reports-এ পাঠানো হয়, Edge তখন রেসপন্সে "XML-to-JSON-1" নীতি প্রয়োগ করে।

<Flows>
    <Flow name="reports">
        <Description/>
        <Request/>
        <Response>
            <Step>
                <Name>XML-to-JSON-1</Name>
            </Step>
        </Response>
        <Condition>(proxy.pathsuffix MatchesPath "/reports") and (request.verb = "GET")</Condition>
</Flow>

ঐচ্ছিক কন্ডিশনাল ফ্লো ছাড়াও, প্রতিটি API প্রক্সি দুটি ডিফল্ট ফ্লো সহ আসে: <PreFlow> আপনার কন্ডিশনাল ফ্লোয়ের আগে এক্সিকিউট করা হয় এবং <PostFlow> আপনার কন্ডিশনাল ফ্লোয়ের পরে এক্সিকিউট করা হয়। API প্রক্সিতে যেকোনও কল করা হলে, সেইসব কল নীতি প্রয়োগ করার জন্য কাজে লাগে। যেমন, আপনি যদি প্রতিটি কলের সাথে কোনও অ্যাপের API কী যাচাই করতে চান, তাহলে অ্যাক্সেস করা ব্যাকএন্ড রিসোর্স নির্বিশেষে, আপনি <PreFlow>-এ একটি API কী যাচাই করার নীতি প্রয়োগ করতে পারেন। ফ্লো সম্পর্কে আরও জানতে, ফ্লো কনফিগার করা দেখুন।

ব্যাকএন্ড রিসোর্সে কন্ডিশনাল ফ্লো তৈরি করা

API প্রক্সিতে ব্যাকএন্ড রিসোর্সের জন্য কন্ডিশনাল ফ্লো নির্ধারণ করা সম্পূর্ণ ঐচ্ছিক। তবে, সেইসব কন্ডিশনাল ফ্লো আপনাকে ফাইন-গ্রেন ম্যানেজমেন্ট ও মনিটরিং প্রয়োগ করার ক্ষমতা দেয়।

আপনি এগুলি করতে পারবেন:

  • আপনার API মডেলের সিম্যান্টিককে প্রতিফলিত করে এমনভাবে ম্যানেজমেন্ট প্রয়োগ করুন
  • আলাদা আলাদা রিসোর্স পাথে (URI) নীতি ও স্ক্রিপ্টেড আচরণ প্রয়োগ করা
  • Analytics পরিষেবার জন্য সূক্ষ্ম-গ্রেনুলারিটি মেট্রিক সংগ্রহ করা

যেমন, ধরে নিন যে আপনার ব্যাকএন্ড /developers থেকে /apps রিসোর্সে বিভিন্ন ধরনের লজিক প্রয়োগ করতে হবে।

এটি করতে, আপনার API প্রক্সিতে দুটি কন্ডিশনাল ফ্লো যোগ করুন: /developers এবং /apps।

API প্রক্সি এডিটরের নেভিগেটর প্যানেলের ডেভেলপ ভিউতে, প্রক্সি এন্ডপয়েন্টে ডিফল্টের পাশে থাকা + আইকনে ক্লিক করুন ।

"নতুন কন্ডিশনাল ফ্লো" উইন্ডোতে, আপনাকে নিম্নলিখিত কী কনফিগারেশন লিখতে হবে:

  • ফ্লোয়ের নাম: ডেভেলপার
  • কন্ডিশনের ধরন: পাথ
  • পাথ: /developers

URI-এর শেষে /developers থাকলে, প্রক্সি সার্ভারে কল পাঠানো হলে, এই শর্তটি ট্রিগার করা হবে (এবং নীতি প্রয়োগ করা হবে)।

এখন /apps-এর জন্য কন্ডিশনাল ফ্লো যোগ করুন এবং ধরে নিন যে আপনি চান কোনও অনুরোধের URI এবং POST ভার্ব, এই দু'টি ক্ষেত্রেই কন্ডিশন ট্রিগার হোক। কনফিগারেশনের মধ্যে নিম্নলিখিত বিষয়গুলি সেট করা অন্তর্ভুক্ত:

  • ফ্লোয়ের নাম: অ্যাপ
  • কন্ডিশনের ধরন: পাথ ও ভার্ব
  • পাথ: /apps
  • ক্রিয়া: POST

URI-এর শেষে /apps এবং POST ক্রিয়া সহ কোনও কল প্রক্সি সার্ভারে পাঠানো হলে, এই শর্তটি ট্রিগার করা হবে (এবং নীতি প্রয়োগ করা হবে)।

নেভিগেটর প্যানে, আপনি অ্যাপ ও ডেভেলপারদের জন্য নতুন ফ্লো দেখতে পাবেন।

API প্রক্সি এডিটরে কন্ডিশনাল ফ্লো কনফিগারেশন দেখতে একটি ফ্লো বেছে নিন কোড ভিউ:

<Flow name="Apps">
    <Description>Developer apps registered in Developer Services</Description>
    <Request/>
    <Response/>
    <Condition>(proxy.pathsuffix MatchesPath "/apps") and (request.verb = "POST")</Condition>
</Flow>

আপনি দেখতে পাচ্ছেন, API রিসোর্স হল সাধারণ কন্ডিশনাল ফ্লো যা ইনবাউন্ড অনুরোধের URI পাথ মূল্যায়ন করে। (proxy.pathsuffix ভেরিয়েবল, ProxyEndpoint কনফিগারেশনে কনফিগার করা BasePath-এর পরে আসা অনুরোধের URI শনাক্ত করে।)

আপনার সংজ্ঞায়িত প্রতিটি API রিসোর্স API প্রক্সিতে একটি কন্ডিশনাল ফ্লো দ্বারা প্রয়োগ করা হয়। (দেখুন ফ্লো কনফিগার করা।)

টেস্ট এনভায়রনমেন্টে API প্রক্সি ডেপ্লয় করার পরে, নিম্নলিখিত অনুরোধ:

http://{org_name}-test.apigee.net/{proxy_path}/apps

কন্ডিশনটি সত্য হিসেবে মূল্যায়ন করবে এবং এই ফ্লো, এর সাথে যুক্ত যেকোনও নীতি সহ, এক্সিকিউট করবে।

নিচে দেওয়া উদাহরণে, জাভা রেগুলার এক্সপ্রেশন ব্যবহার করে, ট্রেলিং ফরওয়ার্ড স্ল্যাশ (/apps বা /apps/**) সহ বা এটি ছাড়া /apps রিসোর্সে করা কল শনাক্ত করা হয়েছে:

<Condition>(proxy.pathsuffix JavaRegex "/apps(/?)") and (request.verb = "POST")</Condition>

এই ধরনের কন্ডিশন সম্পর্কে আরও জানতে, Apigee কমিউনিটিতে কীভাবে ম্যাচ করতে হয় ... দেখুন।

হায়ারের্কিক্যাল URI মডেলিং

কিছু ক্ষেত্রে, আপনার কাছে হায়ারার্কিক্যাল API রিসোর্স থাকবে। যেমন, Developer Services API, কোনও ডেভেলপারের মালিকানাধীন সব অ্যাপের তালিকা তৈরি করার একটি পদ্ধতি প্রদান করে। URI পাথ হল:

/developers/{developer_email}/apps

আপনার কাছে এমন রিসোর্স থাকতে পারে যেখানে কোনও সংগ্রহের প্রতিটি এন্টিটির জন্য একটি অনন্য আইডি তৈরি করা হয়, যা কখনও কখনও এইভাবে অ্যানোটেট করা হয়:

/genus/:id/species

এই পাথ নিম্নলিখিত দুটি URI-এর ক্ষেত্রে সমানভাবে প্রযোজ্য:

/genus/18904/species
/genus/17908/species

API রিসোর্সে এই স্ট্রাকচারকে উপস্থাপন করতে, আপনি ওয়াইল্ডকার্ড ব্যবহার করতে পারেন। যেমন:

/developers/*/apps
/developers/*example.com/apps
/genus/*/species

এইসব হায়ারার্কিক্যাল URI-কে API রিসোর্স হিসেবে যথাযথভাবে সমাধান করবে।

কিছু ক্ষেত্রে, বিশেষ করে খুব বেশি স্তরযুক্ত API-এর ক্ষেত্রে, আপনি হয়ত কোনও নির্দিষ্ট URI ফ্র্যাগমেন্টের নিচে থাকা সব সমস্যার সমাধান করতে চাইবেন। এটি করতে, আপনার রিসোর্স ডেফিনিশনে ডবল অ্যাস্টেরিক্স ওয়াইল্ডকার্ড ব্যবহার করুন। যেমন, আপনি যদি নিম্নলিখিত API রিসোর্সকে সংজ্ঞায়িত করেন:
/developers/**

সেই API রিসোর্স নিম্নলিখিত URI পাথ সমাধান করবে:

/developers/{developer_email}/apps
/developers/{developer_email}/keys
/developers/{developer_email}/apps/{app_id}/keys

API প্রক্সি ডেফিনিশনে কন্ডিশনাল ফ্লো কন্ডিশন কেমন দেখতে হবে তা এখানে দেওয়া হল:

<Condition>(proxy.pathsuffix MatchesPath "/developers/**") and (request.verb = "POST")</Condition>

আরও উদাহরণ

RouteRule-এর সাথে যুক্ত শর্ত

<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>

কোনও নীতির সাথে যুক্ত শর্ত

<Step>
<!--the policy MaintenancePolicy only executes if the response status code is exactly 503-->
  <Condition>response.status.code = 503</Condition>
  <Name>MaintenancePolicy</Name>
</Step>

কন্ডিশনাল ফ্লো

<!-- this entire flow is executed only if the request verb is a GET-->
<Flow name="GetRequests">
  <Condition>request.verb="GET"</Condition>
  <Request>
    <Step>
<!-- this policy only executes if request path includes a term like statues-->
<Condition>request.path ~ "/statuses/**"</Condition>
      <Name>StatusesRequestPolicy</Name>
    </Step>
  </Request>
  <Response>
    <Step>
<!-- this condition has multiple expressions. The policy executes if the response code status is exactly 503 or 400-->
<Condition>(response.status.code = 503) or (response.status.code = 400)</Condition>
      <Name>MaintenancePolicy</Name>
    </Step>
  </Response>
</Flow>

কন্ডিশনে অপারেটরের নমুনা

কন্ডিশন তৈরি করার জন্য ব্যবহৃত অপারেটরের কিছু উদাহরণ এখানে দেওয়া হল:

  • request.header.content-type = "text/xml"
  • request.header.content-length < 4096 && request.verb = "PUT"
  • response.status.code = 404 || response.status.code = 500
  • request.uri MatchesPath "/*/statuses/**"
  • request.queryparam.q0 NotEquals 10

ব্যবহারিক উদাহরণ: পাথ নামের শেষে "/" চিহ্নটি উপেক্ষা করুন

Edge ডেভেলপাররা সাধারণত এই দুটি পাথ সাফিক্সই হ্যান্ডেল করতে চান: "/cat" এবং "/cat/"। এর কারণ হল, কিছু ব্যবহারকারী বা ক্লায়েন্ট পাথ শেষে অতিরিক্ত স্ল্যাশ সহ আপনার API কল করতে পারেন এবং আপনাকে কন্ডিশনাল স্টেটমেন্টে সেটি হ্যান্ডেল করতে হবে। এই নির্দিষ্ট ব্যবহারের ক্ষেত্রে Apigee কমিউনিটিতে আলোচনা করা হয়েছে।

আপনি চাইলে, এই ধরনের রেগুলার এক্সপ্রেশন ব্যবহার না করেই এটি করতে পারেন:

    <PreFlow name="PreFlow">
        <Request>
            <Step>
                <Condition>((proxy.pathsuffix = "/cat") OR (proxy.pathsuffix = "/cat/")</Condition>
                <Name>SomePolicy</Name>
            </Step>
        </Request>
        <Response/>
    </PreFlow>

এটি একটি ভালো বিকল্প। এটি স্পষ্ট ও সহজে পড়া যায়।

আপনি Regex-এর মাধ্যমেও একই কাজ করতে পারেন, তবে এইভাবে। স্টেটমেন্টের রেজেক্স অংশকে গ্রুপে ভাগ করার জন্য প্যারেন্থেসিস ব্যবহার করা হয়, তবে এটি বাধ্যতামূলক নয়।

<Condition>(proxy.pathsuffix JavaRegex "/cat(/?)"</Condition>

API কল:

GET http://artomatic-test.apigee.net/matchtest/cat
or

GET http://artomatic-test.apigee.net/matchtest/cat/

নীতি কি প্রয়োগ করা হয়? হ্যাঁ। মনে রাখবেন, রেগুলার এক্সপ্রেশনে, "?" ক্যারেক্টারের অর্থ হল: আগের ক্যারেক্টারের সাথে শূন্য বা একবার ম্যাচ করা। তাই, "/cat" এবং "/cat/" দুটিই ম্যাচ করছে।

API কল:

GET http://artomatic-test.apigee.net/matchtest/cat/spotted

নীতি কি প্রয়োগ করা হয়? না। রেগুলার এক্সপ্রেশনটি পূর্ববর্তী অক্ষরের শূন্য বা শুধুমাত্র একটি অকারেন্সের সাথে ম্যাচ করে এবং অন্য কিছু অনুমোদিত নয়।

JavaRegex-এর সাহায্যে ইচ্ছামতো স্ট্রিং ম্যাচ করা

এই বিষয়ের সব উদাহরণে, আমরা কীভাবে একটি বিল্ট-ইন ফ্লো ভেরিয়েবল ম্যাচ করতে হয় তা দেখাই: proxy.pathsuffix. এটি জেনে ভালো যে আপনি যেকোনও নির্বিচারে স্ট্রিং বা ফ্লো ভেরিয়েবলে প্যাটার্ন ম্যাচিং করতে পারবেন, এটি proxy.pathsuffix-এর মতো বিল্ট-ইন ফ্লো ভেরিয়েবল হোক বা না হোক।

যেমন, আপনার যদি এমন কোনও কন্ডিশন থাকে যা কোনও নির্বিচারে স্ট্রিং পরীক্ষা করে, হয়ত কোনও স্ট্রিং ব্যাকএন্ড পেলোডে রিটার্ন করা হয়েছে অথবা কোনও স্ট্রিং যাচাইকরণ সার্ভার লুক-আপ থেকে রিটার্ন করা হয়েছে, তাহলে আপনি এটি পরীক্ষা করার জন্য ম্যাচিং অপারেটর ব্যবহার করতে পারবেন। আপনি JavaRegex ব্যবহার করলে, রেগুলার এক্সপ্রেশনটি সম্পূর্ণ সাবজেক্ট স্ট্রিংয়ের সাথে তুলনা করা হবে। বিষয় "abc" এবং রেগুলার এক্সপ্রেশন "[a-z]" হলে, কোনও ম্যাচ নেই, কারণ "[a-z]" ঠিক একটি আলফা অক্ষর ম্যাচ করে। "[a-z]+" এক্সপ্রেশনটি কাজ করে, ঠিক তেমনই "[a-z]*" এবং "[a-z]{3} এক্সপ্রেশনও কাজ করে।

আসুন, একটি বাস্তব উদাহরণ দেখা যাক। ধরে নিন, যাচাইকরণ সার্ভার কমা দিয়ে আলাদা করা স্ট্রিং হিসেবে ভূমিকার একটি তালিকা রিটার্ন করে: "editor, author, guest"।

এডিটর রোলের উপস্থিতি পরীক্ষা করার জন্য, এই কনস্ট্রাকশন কাজ করবে না, কারণ "এডিটর" হল সম্পূর্ণ স্ট্রিংয়ের একটি অংশ মাত্র।

<Condition>returned_roles ~~ "editor"</Condition>

তবে, এই গঠন কাজ করবে:

<Condition>returned_roles ~~ ".*\beditor\b.*")</Condition>

এটি কাজ করে কারণ এটি শব্দ বিরতি এবং .* প্রিফিক্স ও সাফিক্স সহ স্ট্রিংয়ের যেকোনও অংশকে বিবেচনা করে।

এই উদাহরণে, আপনি Matches অপারেটরের সাহায্যে "সম্পাদক" হিসেবেও পরীক্ষা করতে পারেন:

<Condition>returned_roles ~~ "*editor*")</Condition>

তবে, যেখানে আরও বেশি নির্ভুলতা প্রয়োজন, সেখানে JavaRegex প্রায়শই আরও ভালো বিকল্প।

JavaRegex এক্সপ্রেশনে ডবল কোটেশন এড়িয়ে যাওয়া

কন্ডিশন সিনট্যাক্সে ডবল কোটের মধ্যে JavaRegex এক্সপ্রেশন রাখতে হয়; তাই, আপনার কাছে ডবল কোট সহ কোনও Regex এক্সপ্রেশন থাকলে, সেগুলি ম্যাচ করানোর জন্য আপনাকে বিকল্প উপায় খুঁজে নিতে হবে। উত্তর হল Unicode. যেমন, ধরা যাক আপনি এমন একটি হেডার পাস করেছেন যাতে ডবল কোট রয়েছে, যেমন:
 -H 'content-type:multipart/related; type="application/xop+xml"'
আপনি যদি কোনও রেজেক্স কন্ডিশনে সেই হেডারটি ম্যাচ করার চেষ্টা করেন, তাহলে আপনি একটি ভুল কন্ডিশন সংক্রান্ত সমস্যা পাবেন কারণ এক্সপ্রেশনে ডবল কোট অন্তর্ভুক্ত থাকে:
request.header.Content-Type ~~ "(multipart\/related)(; *type="application\/xop\+xml\")"
এর সমাধান হল ASCII-ভিত্তিক ডবল কোটের পরিবর্তে তার ইউনিকোড সমতুল্য, \u0022 ব্যবহার করা। যেমন, নিচে উল্লেখ করা এক্সপ্রেশনটি সঠিক এবং প্রত্যাশিত ফলাফল দেয়:
request.header.Content-Type ~~ "(multipart\/related)(; *type=\u0022application\/xop\+xml\u0022)"