জাভাস্ক্রিপ্ট সহ প্রোগ্রামিং API প্রক্সি

আপনি Apigee Edge-এর ডকুমেন্টেশন দেখছেন।
Apigee X ডকুমেন্টেশন
.info- তে যান।

এই টপিকে আপনি শিখবেন কিভাবে জাভাস্ক্রিপ্ট ব্যবহার করে একটি রেসপন্স মেসেজে ডায়নামিকভাবে HTTP হেডার যোগ করতে হয় এবং কিভাবে একটি JSON রেসপন্স পার্স করে তার প্রোপার্টিগুলোর একটি উপসেট অনুরোধকারী অ্যাপে ফেরত পাঠাতে হয়।

নমুনা কোডটি ডাউনলোড করে চেষ্টা করে দেখুন।

এই রান্নার বইয়ের উদাহরণ সম্পর্কে

এই কুকবুক উদাহরণটি একটি এপিআই প্রক্সি প্যাটার্ন তুলে ধরে, যেখানে আপনি জাভাস্ক্রিপ্টে এপিআই-এর আচরণ বাস্তবায়ন করবেন। জাভাস্ক্রিপ্ট উদাহরণগুলো আপনাকে সাধারণ ভেরিয়েবল এবং মেসেজের বিষয়বস্তু নিয়ে কীভাবে কাজ করতে হয় তা দেখানোর জন্য তৈরি করা হয়েছে। একটি নমুনায় দেখানো হয়েছে কীভাবে ভেরিয়েবল গেট এবং সেট করতে হয় । দ্বিতীয় উদাহরণটিতে দেখানো হয়েছে কীভাবে JSON পার্স করতে হয় এবং তার ফলাফল থেকে একটি মেসেজ তৈরি করতে হয়।

এপিআই প্রক্সিতে দুটি জাভাস্ক্রিপ্ট নমুনা রয়েছে:

  • setHeaders.js : এই জাভাস্ক্রিপ্টটি এমন কয়েকটি ভেরিয়েবলের মান সংগ্রহ করে, যেগুলো একটি এপিআই প্রক্সি কল করার সময় সেট করা হয়। জাভাস্ক্রিপ্টটি সেই ভেরিয়েবলগুলোকে রেসপন্স মেসেজে যোগ করে, যাতে আপনি আপনার প্রতিটি রিকোয়েস্টের জন্য সেগুলোর মান দেখতে পারেন।
  • minimize.js : এই জাভাস্ক্রিপ্টটি আপনাকে দেখায় কিভাবে মেসেজের বিষয়বস্তু নিয়ে কাজ করতে হয়। এই স্যাম্পলটির পেছনের ধারণাটি হলো, একটি সার্ভিস প্রায়শই প্রয়োজনের চেয়ে বেশি ডেটা ফেরত দেয়। তাই, জাভাস্ক্রিপ্টটি রেসপন্স মেসেজটি পার্স করে, কয়েকটি প্রয়োজনীয় প্রোপার্টি বের করে নেয় এবং তারপর সেগুলো ব্যবহার করে রেসপন্স মেসেজের বিষয়বস্তু তৈরি করে।

setHeader.js এর কোড:

context.setVariable("response.header.X-Apigee-Target", context.getVariable("target.name"));
context.setVariable("response.header.X-Apigee-ApiProxyName", context.getVariable("apiproxy.name"));
context.setVariable("response.header.X-Apigee-ProxyName", context.getVariable("proxy.name"));
context.setVariable("response.header.X-Apigee-ProxyBasePath", context.getVariable("proxy.basepath"));
context.setVariable("response.header.X-Apigee-ProxyPathSuffix", context.getVariable("proxy.pathsuffix"));
context.setVariable("response.header.X-Apigee-ProxyUrl", context.getVariable("proxy.url"));

minimize.js এর কোড:

// Parse the respose from the target.
var res = JSON.parse(context.proxyResponse.content);

// Pull out only the information we want to see in the response.
var minimizedResponse = { city: res.root.city,
                          state: res.root.state };
          
// Set the response variable. 
context.proxyResponse.content = JSON.stringify(minimizedResponse);

আপনি জাভাস্ক্রিপ্টে কন্টেক্সট অবজেক্টের মাধ্যমে ফ্লো ভেরিয়েবল অ্যাক্সেস করতে পারেন। এই অবজেক্টটি এজ জাভাস্ক্রিপ্ট অবজেক্ট মডেলের একটি অংশ। অবজেক্ট মডেল সম্পর্কে বিস্তারিত জানতে, জাভাস্ক্রিপ্ট অবজেক্ট মডেল দেখুন।

শুরু করার আগে

এই রান্নার বইয়ের উদাহরণটি খতিয়ে দেখার আগে, আপনার এই মৌলিক ধারণাগুলো সম্পর্কেও পরিচিত থাকা উচিত:

  • পলিসি কী এবং কীভাবে সেগুলোকে প্রক্সির সাথে সংযুক্ত করতে হয়। পলিসি সম্পর্কে একটি ভালো পরিচিতির জন্য, “পলিসি কী?” দেখুন।
  • একটি প্রক্সি ফ্লো-এর গঠন, যেমনটি "ফ্লো কনফিগার করা" অংশে ব্যাখ্যা করা হয়েছে। ফ্লো আপনাকে একটি এপিআই প্রক্সি দ্বারা পলিসিগুলো কোন ক্রমে কার্যকর হবে তা নির্দিষ্ট করতে দেয়। এই উদাহরণে, বেশ কয়েকটি পলিসি তৈরি করে একটি এপিআই প্রক্সি ফ্লো-তে যোগ করা হয়েছে।
  • এপিআই প্রক্সি কনফিগারেশন রেফারেন্সে যেমন ব্যাখ্যা করা হয়েছে, আপনার ফাইলসিস্টেমে একটি এপিআই প্রক্সি প্রজেক্ট কীভাবে সাজানো থাকে।
  • XML, JSON এবং JavaScript সম্পর্কে কার্যকরী জ্ঞান। এই উদাহরণে, আপনি ফাইলসিস্টেমে থাকা XML ফাইল ব্যবহার করে API প্রক্সি এবং এর পলিসিগুলো তৈরি করবেন।

আপনি যদি নমুনা কোডটি ডাউনলোড করে থাকেন, তাহলে এই বিষয়ে আলোচিত সমস্ত ফাইল ‘javascript-cookbook’ নমুনা ফোল্ডারে খুঁজে পাবেন। নিম্নলিখিত বিভাগগুলিতে নমুনা কোডটি বিস্তারিতভাবে আলোচনা করা হয়েছে।

প্রক্সি প্রবাহ বোঝা

একটি এপিআই প্রক্সিতে জাভাস্ক্রিপ্ট কার্যকর করতে হলে, আপনাকে 'Step' নামক একটি পলিসি অ্যাটাচমেন্ট ব্যবহার করে এটিকে একটি ফ্লো-এর সাথে সংযুক্ত করতে হবে। Javascript টাইপের একটি পলিসিতে (বড় হাতের অক্ষর লক্ষ্য করুন) কেবল একটি জাভাস্ক্রিপ্ট ফাইলের নামের রেফারেন্স থাকে। আপনি ResourceURL এলিমেন্ট ব্যবহার করে পলিসিটিকে একটি জাভাস্ক্রিপ্ট ফাইলের দিকে নির্দেশ করেন।

উদাহরণস্বরূপ, নিম্নলিখিত পলিসিটি setHeader.js নামের জাভাস্ক্রিপ্ট ফাইলটিকে রেফারেন্স করে।

<Javascript name='setHeaders' timeLimit='200'>
    <ResourceURL>setHeaders.js</ResourceURL>
</Javascript>

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

আপনি যদি ম্যানেজমেন্ট UI-তে এই ফ্লো কনফিগারেশনটি খোলেন, তাহলে নিচের ফ্লো কনফিগারেশনটি দেখতে পাবেন।

নেভিগেটর প্যানে প্রক্সি এন্ডপয়েন্টস > ডিফল্ট > পোস্টফ্লো নির্বাচন করুন।

'default' নামের ProxyEndpoint-এর জন্য সংশ্লিষ্ট XML কনফিগারেশনটি নিচে দেখানো হলো।

<ProxyEndpoint name="default">
  <PostFlow>
    <Response>
      <!-- Steps reference policies under /apiproxy/policies -->
      <!-- First, set a few HTTP headers with variables for this transaction. -->
      <Step><Name>setHeaders</Name></Step>
      <!-- Next, transform the response from XML to JSON for easier parsing with JavaScript -->
      <Step><Name>transform</Name></Step>
      <!-- Finally, use JavaScript to create minimized response with just city and state. -->
      <Step><Name>minimize</Name></Step>
    </Response>
  </PostFlow>
  <HTTPProxyConnection>
        <!-- BasePath defines the network address for this API proxy. See the script 'invoke.sh' to see how the complete URL for this API proxy is constructed.-->
    <BasePath>/javascript-cookbook</BasePath>
     <!-- Set VirtualHost to 'secure' to have this API proxy listen on HTTPS. -->
    <VirtualHost>default</VirtualHost>
  </HTTPProxyConnection>
  <RouteRule name="default">
    <TargetEndpoint>default</TargetEndpoint>
  </RouteRule>
</ProxyEndpoint>

এখানে প্রবাহটির উপাদানগুলোর একটি সারসংক্ষেপ দেওয়া হলো।

  • <Request> - <Request> এলিমেন্টটি একাধিক <Step> এলিমেন্ট নিয়ে গঠিত। প্রতিটি স্টেপ এই টপিকের বাকি অংশে আপনার তৈরি করা পলিসিগুলোর মধ্যে একটিকে কল করে। এই পলিসিগুলো এপিআই প্রক্সি ফ্লো-এর সাথে একটি জাভাস্ক্রিপ্ট সংযুক্ত করে, এবং পলিসি সংযুক্তির অবস্থান নির্ধারণ করে জাভাস্ক্রিপ্টটি কখন এক্সিকিউট হবে।
  • <Response> - <Response> এলিমেন্টটিতে <Steps>-ও অন্তর্ভুক্ত থাকে। এই স্টেপগুলো এমন পলিসিগুলোকেও কল করে, যেগুলো টার্গেট থেকে আসা চূড়ান্ত রেসপন্স প্রসেস করার জন্য দায়ী (এই উদাহরণে টার্গেটটি হলো Apigee-এর মক সার্ভিস টার্গেট— /apiproxy/targets/default.xml default.xml ফাইলের অধীনে থাকা HTTPTargetConnection সেটিংটি লক্ষ্য করুন)।
  • <HTTPProxyConnection> - এটি সেই হোস্ট এবং URI পাথ নির্দিষ্ট করে, যা সেই নেটওয়ার্ক অ্যাড্রেসকে সংজ্ঞায়িত করে যেখান থেকে অ্যাপগুলো এই API ব্যবহার করার জন্য কল করে।
  • <RouteRule> - এই এলিমেন্টটি নির্দিষ্ট করে যে ProxyEndpoint দ্বারা কোন TargetEndpoint কনফিগারেশনটি আহ্বান করা হবে।

প্রক্সিতে জাভাস্ক্রিপ্ট কোড যোগ করা

জাভাস্ক্রিপ্ট (পাইথন স্ক্রিপ্ট, জাভা JAR ফাইল, XSLT ফাইল ইত্যাদির মতো) রিসোর্স হিসেবে সংরক্ষিত হয়। যখন আপনি জাভাস্ক্রিপ্ট নিয়ে কাজ করা সবে শুরু করছেন, তখন আপনার জাভাস্ক্রিপ্ট ফাইলগুলো এপিআই প্রক্সিতে সংরক্ষণ করা সবচেয়ে সহজ। আপনি যখন আরও অগ্রসর হবেন, তখন জাভাস্ক্রিপ্টকে যতটা সম্ভব জেনেরিক এবং পুনঃব্যবহারযোগ্য করে তোলা উচিত এবং তারপর এনভায়রনমেন্ট বা অর্গানাইজেশন লেভেলে সংরক্ষণ করা উচিত। এটি আপনাকে একই জাভাস্ক্রিপ্ট ফাইল একাধিক এপিআই প্রক্সিতে সংরক্ষণ করা থেকে বিরত রাখে, যা দ্রুতই নিয়ন্ত্রণহীন হয়ে উঠতে পারে।

সংস্থা এবং পরিবেশ স্তরে রিসোর্স সংরক্ষণ সম্পর্কে জানতে, রিসোর্স ফাইল দেখুন।

চেষ্টা করে দেখুন

প্রক্সি স্থাপন এবং কল করার নির্দেশাবলীর জন্য, জাভাস্ক্রিপ্ট কুকবুকের README দেখুন।

এপিআই প্রক্সি আমদানি এবং স্থাপন করা

পরিবর্তন করার পরে, আপনি ম্যানেজমেন্ট UI- তে থাকা API প্রক্সি বিল্ডার টুল থেকে API প্রক্সিটি সেভ করতে পারেন।

অথবা আপনি /api-platform-samples/doc-samples/javascript-cookbook ডিরেক্টরিতে নিম্নলিখিত কমান্ডটি চালাতে পারেন।

$ sh deploy.sh

জাভাস্ক্রিপ্ট পরীক্ষা করা হচ্ছে

/api-platform-samples/doc-samples/javascript-cookbook ডিরেক্টরিতে নিম্নলিখিত কমান্ডটি চালান।

$ sh invoke.sh

জাভাস্ক্রিপ্ট দ্বারা পরিবর্তিত রেসপন্স মেসেজের HTTP হেডারগুলো দেখার জন্য শেল স্ক্রিপ্টে curl ফ্ল্যাগ -v ব্যবহার করা হয়।

আপনি নিম্নলিখিতভাবে সরাসরি একটি অনুরোধ জমা দিতে পারেন:

$ curl -v http://{org_name}-test.apigee.net/javascript-cookbook 

যদি জাভাস্ক্রিপ্টটি সঠিকভাবে কার্যকর হয়, তাহলে আপনি নিচের মতো একটি প্রতিক্রিয়া দেখতে পাবেন:

< X-Apigee-Demo-Target: default
< X-Apigee-Demo-ApiProxyName: simple-javascript
< X-Apigee-Demo-ProxyName: default
< X-Apigee-Demo-ProxyBasePath: /javascript-cookbook
< X-Apigee-Demo-ProxyPathSuffix: /xml
< X-Apigee-Demo-ProxyUrl: http://rrt331ea.us-ea.4.apigee.com/javascript-cookbook/xml
 
{"city":"San Jose","state":"CA"}

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

স্ক্রিপ্ট ত্রুটি

জাভাস্ক্রিপ্ট লেখার সময় আপনি অনিবার্যভাবে ত্রুটি দেখতে পাবেন। একটি এপিআই প্রক্সি দ্বারা জারি করা জাভাস্ক্রিপ্ট ত্রুটির ধরন নিচে দেখানো হলো।

{  
   "fault":{  
      "faultstring":"Execution of rewriteTargetUrl failed with error: Javascript runtime error: \"TypeError: Cannot find function getVariable in object TARGET_REQ_FLOW. (rewriteTargetUrl_js#1). at line 1 \"",
      "detail":{  
         "errorcode":"steps.javascript.ScriptExecutionFailed"
      }
   }
}

কখন জাভাস্ক্রিপ্ট ব্যবহার করবেন

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

কাস্টম কার্যকারিতার ক্ষেত্রে পারফরম্যান্স একটি উদ্বেগের বিষয় হলে, যেখানে সম্ভব জাভা ব্যবহার করুন।

সারসংক্ষেপ

এই কুকবুক টপিকে, আপনি শিখেছেন কিভাবে কাস্টম আচরণ বাস্তবায়নের জন্য একটি এপিআই প্রক্সি কনফিগারেশনে জাভাস্ক্রিপ্ট অন্তর্ভুক্ত করা যায়। স্যাম্পলগুলোতে বাস্তবায়িত কাস্টম আচরণগুলো দেখায় কিভাবে ভেরিয়েবল পেতে হয় এবং কিভাবে JSON পার্স করে কাস্টম রেসপন্স মেসেজ তৈরি করতে হয়।