JavaScript-এর মাধ্যমে API প্রক্সি প্রোগ্রাম করা

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

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

স্যাম্পেল কোড ডাউনলোড করে ব্যবহার করে দেখুন

এই কুকবুক উদাহরণ সম্পর্কে

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

API প্রক্সিতে দুটি জাভাস্ক্রিপ্ট স্যাম্পেল আছে:

  • setHeaders.js: এই JavaScript কিছু ভেরিয়েবলের ভ্যালু পায় যেগুলি API প্রক্সি ইনভোক করা হলে সেট করা হয়। JavaScript, উত্তর মেসেজে সেইসব ভেরিয়েবল যোগ করে যাতে আপনার করা প্রতিটি অনুরোধের জন্য আপনি তাদের ভ্যালু দেখতে পান।
  • 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);

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

শুরু করার আগে

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

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

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

প্রক্সি ফ্লো বোঝা

API প্রক্সিতে জাভাস্ক্রিপ্ট এক্সিকিউট করতে, আপনাকে 'স্টেপ' নামের একটি নীতি অ্যাটাচমেন্ট ব্যবহার করে এটিকে ফ্লোতে অ্যাটাচ করতে হবে। Javascript (ক্যাপিটালাইজেশন মনে রাখবেন) ধরনের নীতিতে শুধুমাত্র একটি জাভাস্ক্রিপ্ট ফাইলের নামের রেফারেন্স থাকে। আপনি ResourceURL এলিমেন্ট ব্যবহার করে জাভাস্ক্রিপ্ট ফাইলের দিকে নীতি নির্দেশ করেন।

যেমন, নিম্নলিখিত নীতিতে setHeader.js নামের জাভাস্ক্রিপ্ট ফাইলের রেফারেন্স দেওয়া হয়েছে।

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

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

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

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

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

প্রক্সিতে JavaScript কোড যোগ করা

জাভাস্ক্রিপ্ট (যেমন, Python স্ক্রিপ্ট, Java JAR ফাইল, XSLT ফাইল ইত্যাদি) রিসোর্স হিসেবে সেভ করা হয়। আপনি যখন জাভাস্ক্রিপ্ট নিয়ে কাজ শুরু করছেন, তখন আপনার জাভাস্ক্রিপ্ট ফাইল API প্রক্সিতে সেভ করে রাখলে সবচেয়ে সুবিধা হয়। আপনি যত এগোবেন, JavaScript তত বেশি জেনেরিক ও পুনর্ব্যবহারযোগ্য করে তুলতে হবে এবং তারপরে এনভায়রনমেন্ট বা সংস্থা লেভেলে স্টোর করতে হবে। এর ফলে আপনাকে একাধিক API প্রক্সি সার্ভারে একই JavaScript ফাইল সেভ করতে হয় না, যা দ্রুত ম্যানেজ করা কঠিন হয়ে পড়ে।

সংস্থা ও এনভায়রনমেন্ট লেভেলে রিসোর্স স্টোর করা সম্পর্কে জানতে, রিসোর্স ফাইল দেখুন।

এটি ব্যবহার করে দেখুন

প্রক্সি ডেপ্লয় ও কল করার নির্দেশাবলীর জন্য, JavaScript কুকবুক README দেখুন।

API প্রক্সি ইমপোর্ট ও ডেপ্লয় করা

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

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

$ sh deploy.sh

JavaScript পরীক্ষা করা

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

$ sh invoke.sh

JavaScript-এর মাধ্যমে পরিবর্তিত হওয়া উত্তর মেসেজে HTTP হেডার দেখতে শেল স্ক্রিপ্টে curl ফ্ল্যাগ -v ব্যবহার করা হয়।

আপনি নিম্নলিখিত উপায়ে সরাসরি অনুরোধ জমা দিতে পারবেন:

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

JavaScript সঠিকভাবে এক্সিকিউট করলে, আপনি নিম্নলিখিত ধরনের উত্তর দেখতে পাবেন:

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

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

স্ক্রিপ্ট সংক্রান্ত সমস্যা

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

{  
   "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-এ, নির্দিষ্ট কার্যকারিতা প্রয়োগ করার জন্য সাধারণত একাধিক উপায় থাকে। যেখানে সম্ভব সেখানে আগে থেকেই উপলভ্য নীতি ব্যবহার করুন এবং JavaScript-এ আপনার API প্রক্সি লজিক কোড করার প্রবণতা এড়িয়ে চলুন। Apigee Edge পারফর্ম্যান্স উন্নত করতে কম্পাইল করা জাভাস্ক্রিপ্ট ব্যবহার করলেও, জাভাস্ক্রিপ্ট যে পলিসির মতো ভালো পারফর্ম্যান্স দেবে তা নাও হতে পারে। জাভাস্ক্রিপ্ট ম্যানেজ ও ডিবাগ করা আরও কঠিন হতে পারে। আপনার অনন্য প্রয়োজনীয়তার জন্য জাভাস্ক্রিপ্ট রিজার্ভ করুন।

কাস্টম ফাংশনালিটির ক্ষেত্রে পারফর্ম্যান্স একটি গুরুত্বপূর্ণ বিষয় হলে, যেখানে সম্ভব সেখানে Java ব্যবহার করুন।

সারাংশ

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