JavaScript অবজেক্ট মডেল

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

এই বিষয়ে Apigee Edge জাভাস্ক্রিপ্ট অবজেক্ট মডেল নিয়ে আলোচনা করা হয়েছে। আপনি যদি API প্রক্সি সার্ভারে কাস্টম জাভাস্ক্রিপ্ট যোগ করার জন্য জাভাস্ক্রিপ্ট নীতি ব্যবহার করতে চান, তাহলে আপনার জন্য এই মডেলটি বোঝা গুরুত্বপূর্ণ।

Edge JavaScript অবজেক্ট মডেল সম্পর্কে

Apigee Edge জাভাস্ক্রিপ্ট অবজেক্ট মডেলে সংশ্লিষ্ট প্রপার্টি সহ অবজেক্টকে সংজ্ঞায়িত করা হয়, যা Apigee Edge প্রক্সি ফ্লোয়ের মধ্যে এক্সিকিউট করা জাভাস্ক্রিপ্ট কোডের জন্য উপলভ্য। আপনি API প্রক্সি ফ্লোতে এই কাস্টম কোড অ্যাটাচ করতে JavaScript নীতি ব্যবহার করেন।

এই মডেলের মাধ্যমে সংজ্ঞায়িত অবজেক্টের API প্রক্সি ফ্লোয়ের মধ্যে স্কোপ থাকে, যার অর্থ হল যে নির্দিষ্ট কিছু অবজেক্ট এবং প্রপার্টি শুধুমাত্র ফ্লোয়ের নির্দিষ্ট পয়েন্টে উপলভ্য। আপনার JavaScript এক্সিকিউট করা হলে, এক্সিকিউশনের জন্য একটি স্কোপ তৈরি করা হয়। সেই স্কোপে, এইসব অবজেক্ট রেফারেন্স তৈরি করা হয়:

  • প্রসঙ্গ: মেসেজ প্রসঙ্গ অ্যাক্সেস করার সুবিধা প্রদানকারী অবজেক্ট
  • অনুরোধ: অনুরোধ অবজেক্ট অ্যাক্সেস করার অনুমতি দেয় এমন একটি সংক্ষিপ্ত রূপ
  • উত্তর: একটি সংক্ষিপ্ত রূপ যা অনুরোধ অবজেক্টে অ্যাক্সেস দেয়
  • ক্রিপ্টো: বিভিন্ন হ্যাশ ফাংশন প্রদান করে
  • print: আউটপুট এমিট করার একটি ফাংশন
  • প্রপার্টি: নীতিতে কনফিগারেশন প্রপার্টিতে রিড অ্যাক্সেস দেয়

কনটেক্সট অবজেক্ট

context অবজেক্টের গ্লোবাল স্কোপ আছে। এটি API প্রক্সি ফ্লোর মধ্যে সব জায়গায় উপলভ্য। এটির চারটি চাইল্ড অবজেক্ট আছে: proxyRequest, proxyResponse, targetRequest, targetResponse. এইসব চাইল্ড অবজেক্টকে অ্যাম্বিয়েন্ট অনুরোধ ও উত্তরের স্কোপে রাখা হয়, এগুলি হয় প্রক্সি অনুরোধ ও উত্তর অথবা টার্গেট অনুরোধ ও উত্তর। যেমন, ফ্লোয়ের প্রক্সি এন্ডপয়েন্ট অংশে JavaScript নীতি এক্সিকিউট হলে, context.proxyRequest ও context.proxyResponse অবজেক্ট স্কোপের মধ্যে থাকে। JavaScript যদি টার্গেট ফ্লোতে রান করে, তাহলে context.targetRequest এবং context.targetResponse অবজেক্ট স্কোপে থাকে।

context অবজেক্টের প্রপার্টি ও মেথডও আছে, যা এই বিষয়ে বিস্তারিতভাবে বর্ণনা করা হয়েছে। যেমন, নিম্নলিখিত জাভাস্ক্রিপ্ট কোডের উদাহরণে context.flow প্রপার্টি ব্যবহার করা হয়েছে এবং get/setVariable() মেথডকে context-এ কল করা হয়েছে।

if (context.flow=="PROXY_REQ_FLOW") {
     var username = context.getVariable("request.formparam.user");
     context.setVariable("USER.name", username);
}

এইসব পদ্ধতি সরাসরি ফ্লো ভেরিয়েবলের সাথে ইন্টার‍্যাক্ট করে। context.flow প্রপার্টির ভ্যালু হল বর্তমান ফ্লো স্কোপ। প্রক্সি অনুরোধ ফ্লোতে, এটি ধ্রুবক PROXY_REQ_FLOW হিসেবে সেট করা আছে। টার্গেট রেসপন্স ফ্লোতে, এটি TARGET_RESP_FLOW হিসেবে সেট করা থাকলে। স্কোপ-নির্দিষ্ট কোড এক্সিকিউট করার জন্য এই কনস্ট্যান্টটি কাজে লাগে। গেটার আপনাকে ফ্লো ভেরিয়েবল পেতে দেয় এবং সেটার আপনাকে ফ্লো ভেরিয়েবল সেট করতে দেয়। এইসব ভেরিয়েবল সাধারণত প্রক্সি ফ্লোতে উপলভ্য থাকে এবং অন্যান্য নীতি এগুলি ব্যবহার করতে পারে।

আরও বিবরণ ও উদাহরণ পেতে, নিচে কনটেক্সট অবজেক্ট রেফারেন্স দেখুন।

ক্রিপ্টো অবজেক্ট

ক্রিপ্টো অবজেক্ট, জাভাস্ক্রিপ্ট অবজেক্ট মডেলে সাধারণ, হাই পারফর্ম্যান্স ক্রিপ্টোগ্রাফিক সাপোর্ট যোগ করে। আরও বিবরণ ও উদাহরণের জন্য নিচে ক্রিপ্টো অবজেক্ট রেফারেন্স দেখুন।

অনুরোধ ও উত্তর অবজেক্ট

request ও response অবজেক্ট হল অ্যাম্বিয়েন্ট অনুরোধ ও উত্তরের সংক্ষিপ্ত রেফারেন্স। এগুলি হল প্রক্সি অনুরোধ ও উত্তর অথবা টার্গেট অনুরোধ ও উত্তর। এইসব ভেরিয়েবেল যে অবজেক্টকে রেফার করে তা নির্ভর করে সেই কনটেক্সটের উপর যেখানে JavaScript নীতি এক্সিকিউট হয়। JavaScript যদি কোনও প্রক্সি এন্ডপয়েন্টের ফ্লোতে রান করে, তাহলে অনুরোধ ও উত্তর ভেরিয়েবল context.proxyRequest ও context.proxyResponse-কে রেফার করে। জাভাস্ক্রিপ্ট যদি কোনও টার্গেট ফ্লোতে চলে, তাহলে ভেরিয়েবল context.targetRequest ও context.targetResponse-কে রেফার করে।

JavaScript অবজেক্ট মডেলে একটি print() ফাংশন থাকে যা আপনি Edge Trace টুলে ডিবাগ সংক্রান্ত তথ্য আউটপুট করতে ব্যবহার করতে পারেন। JavaScript print() স্টেটমেন্টের মাধ্যমে ডিবাগ করা দেখুন।

প্রপার্টি অবজেক্ট

নীতি কনফিগারেশনে এলিমেন্ট ব্যবহার করার সময়, JavaScript কোড properties ভেরিয়েবল ব্যবহার করে সেইসব প্রপার্টির ভ্যালু অ্যাক্সেস করতে পারে।

যেমন, আপনার জাভাস্ক্রিপ্ট কনফিগারেশনে এগুলি থাকলে:

<Javascript name='JS-1' >
  <Properties>
    <Property name="number">8675309</Property>
    <Property name="firstname">Jenny</Property>
  </Properties>
  <ResourceURL>jsc://my-code.js</ResourceURL>
</Javascript>

তারপর my-code.js-এ, আপনি:

  print(properties.firstname);  // prints Jenny
  print(properties.number);  // 8675309

আরও ব্যবহারিক দিক থেকে, কনফিগারেশন কোডকে আলাদা আলাদা এনভায়রনমেন্টে, আলাদা আলাদা সময়ে বা যেকোনও কারণে আলাদা আলাদা আচরণ করতে দিতে পারে।

যেমন, নিম্নলিখিতটি "variable name" এবং আউটপুটের স্টাইল নির্দিষ্ট করে যেখানে JavaScript তথ্য এমিট করবে:

<Javascript name='JS-2' >
  <Properties>
    <Property name="output">my_output_variable</Property>
    <Property name="prettyPrint">true</Property>
  </Properties>
  <ResourceURL>jsc://emit-results.js</ResourceURL>
</Javascript>
তারপর emit-results.js-এ, কোডটি এটি করতে পারে:
var result = { prop1: "something", prop2 : "something else" } ;
if (properties.prettyPrint == "true") {
  context.setVariable(properties.output, JSON.stringify(result, null, 2));
}
else {
  context.setVariable(properties.output, JSON.stringify(result));
}

ক্রিপ্টো অবজেক্ট রেফারেন্স

ক্রিপ্টো অবজেক্ট আপনাকে জাভাস্ক্রিপ্টে প্রাথমিক ক্রিপ্টোগ্রাফিক হ্যাশিং ফাংশন পারফর্ম করতে দেয়।

ক্রিপ্টো অবজেক্টের গ্লোবাল স্কোপ আছে। API প্রক্সি ফ্লোয়ের মধ্যে এটি সব জায়গায় উপলভ্য। Crypto আপনাকে এইসব হ্যাশ অবজেক্টের সাথে কাজ করতে দেয়:

  • SHA-1
  • SHA256
  • SHA512
  • MD5

SHA-1 অবজেক্টের সাথে কাজ করা

আপনি SHA-1 অবজেক্ট তৈরি করতে, আপডেট করতে এবং সেগুলিকে হেক্স ও base64 ভ্যালুতে কনভার্ট করতে পারবেন।

নতুন SHA-1 অবজেক্ট তৈরি করুন

var _sha1 = crypto.getSHA1();

SHA-1 অবজেক্ট আপডেট করা

সিনট্যাক্স

_sha1.update(value);

প্যারামিটার

  • value - (স্ট্রিং) যেকোনও স্ট্রিং ভ্যালু।

উদাহরণ

SHA-1 অবজেক্ট আপডেট করুন:

_sha1.update("salt_value");

_sha1.update("some text");

SHA-1 অবজেক্টকে হেক্স স্ট্রিং হিসেবে রিটার্ন করুন

var _hashed_token = _sha1.digest();

base64 স্ট্রিং হিসেবে SHA-1 অবজেক্ট রিটার্ন করে

var _hashed_token = _sha1.digest64();

SHA-256 অবজেক্টের সাথে কাজ করা

আপনি SHA-256 অবজেক্ট তৈরি করতে, আপডেট করতে এবং সেগুলিকে হেক্স ও base64 ভ্যালুতে কনভার্ট করতে পারবেন।

নতুন SHA-256 অবজেক্ট তৈরি করুন

var _sha256 = crypto.getSHA256();

SHA-256 অবজেক্ট আপডেট করা

সিনট্যাক্স

_sha256.update(value);

প্যারামিটার

  • value - (স্ট্রিং) যেকোনও স্ট্রিং ভ্যালু।

উদাহরণ

SHA-256 অবজেক্ট আপডেট করুন:

_sha256.update("salt_value");

_sha256.update("some text");

SHA-256 অবজেক্টকে হেক্স স্ট্রিং হিসেবে রিটার্ন করুন

var _hashed_token = _sha256.digest();

base64 স্ট্রিং হিসেবে SHA-256 অবজেক্ট রিটার্ন করে

var _hashed_token = _sha256.digest64();

SHA-512 অবজেক্টের সাথে কাজ করা

আপনি SHA-512 অবজেক্ট তৈরি করতে, সেগুলি আপডেট করতে এবং হেক্স ও base64 ভ্যালুতে কনভার্ট করতে পারবেন।

নতুন SHA-512 অবজেক্ট তৈরি করুন

var _sha512 = crypto.getSHA512();

SHA-512 অবজেক্ট আপডেট করা

সিনট্যাক্স

_sha512.update(value);

প্যারামিটার

  • value - (স্ট্রিং) যেকোনও স্ট্রিং ভ্যালু।

উদাহরণ

SHA-512 অবজেক্ট আপডেট করুন:

_sha512.update("salt_value");

_sha512.update("some text");

SHA-512 অবজেক্টকে হেক্স স্ট্রিং হিসেবে রিটার্ন করুন

var _hashed_token = _sha512.digest();

base64 স্ট্রিং হিসেবে SHA-512 অবজেক্ট রিটার্ন করে

var _hashed_token = _sha512.digest64();

MD5 অবজেক্ট নিয়ে কাজ করা

আপনি MD5 অবজেক্ট তৈরি করতে, আপডেট করতে এবং সেগুলিকে হেক্স ও base64 ভ্যালুতে কনভার্ট করতে পারবেন।

নতুন MD5 অবজেক্ট তৈরি করুন

var _md5 = crypto.getMD5();

MD5 অবজেক্ট আপডেট করা

সিনট্যাক্স

_md5.update(value);

প্যারামিটার

  • value - (স্ট্রিং) যেকোনও স্ট্রিং ভ্যালু।

উদাহরণ

MD5 অবজেক্ট আপডেট করুন:

_md5.update("salt_value");

_md5.update("some text");

MD5 অবজেক্টকে হেক্স স্ট্রিং হিসেবে রিটার্ন করুন

var _hashed_token = _md5.digest();

base64 স্ট্রিং হিসেবে MD5 অবজেক্ট রিটার্ন করুন

var _hashed_token = _md5.digest64();

ক্রিপ্টো তারিখ/সময় সংক্রান্ত সহায়তা

ক্রিপ্টো অবজেক্টে তারিখ/সময় ফর্ম্যাটিং প্যাটার্ন কাজ করে।

crypto.dateFormat()

স্ট্রিং ফর্ম্যাটে তারিখ রিটার্ন করে।

সিনট্যাক্স

crypto.dateFormat(format, [timezone], [time])

প্যারামিটার

  • format - (স্ট্রিং) এই প্যারামিটারের অন্তর্নিহিত প্রয়োগ java.text.SimpleDateFormat. যেমন: 'yyyy-MM-DD HH:mm:ss.SSS'
  • timezone - (স্ট্রিং, ঐচ্ছিক) এই প্যারামিটারের অন্তর্নিহিত প্রয়োগ হল java.util.TimeZone। এই প্যারামিটারটি একইDefault: UTC
  • time - (সংখ্যা, ঐচ্ছিক) ফর্ম্যাট করার জন্য একটি Unix টাইমস্ট্যাম্প ভ্যালু। ডিফল্ট: বর্তমান সময়

উদাহরণ

মিলিসেকেন্ড পর্যন্ত বর্তমান সময় পান:

var _now = crypto.dateFormat('yyyy-MM-DD HH:mm:ss.SSS');

প্যাসিফিক টাইম জোনের বর্তমান সময় পান:

var _pst = crypto.dateFormat('yyyy-MM-DD HH:mm:ss.SSS','PST');

এখন থেকে দশ সেকেন্ডের ভ্যালু পান:

var _timeNow = Number(context.getVariable('system.timestamp'));
var ten_seconds = crypto.dateFormat('yyyy-MM-DD HH:mm:ss.SSS','PST', _timeNow + 10 * 1000);

অতিরিক্ত উদাহরণ। এছাড়াও, java.text.SimpleDateFormat ডকুমেন্টেশন দেখুন।

var _pst = crypto.dateFormat('M');
var _pst = crypto.dateFormat('EEE, d MMM yyyy HH:mm:ss Z');
var _pst = crypto.dateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");

সাপোর্ট করে এমন যেকোনও হ্যাশ অবজেক্ট পেতে getHash() ব্যবহার করুন

উদাহরণ

var _hash1 = crypto.getHash('MD5');

var _hash2 = crypto.getHash('SHA-1');

var _hash3 = crypto.getHash('SHA-256');

var _hash4 = crypto.getHash('SHA-512');

ক্রিপ্টো সহ স্যাম্পেল

try {
    // get values to use with hash functions
    var salt = context.getVariable("salt") || 'SomeHardCodedSalt';
    var host = context.getVariable("request.header.Host");
    var unhashed_token = "";

    var _timeNow = Number(context.getVariable('system.timestamp'));
    var now = crypto.dateFormat('yyyy-MM-DD HH:mm:ss.SSS','PST', _timeNow);
    unhashed_token = "|" + now + "|" + host

    // generate a hash with the unhashedToken:
    var sha512 = crypto.getSHA512();
    sha512.update(salt);
    sha512.update(unhashed_token);

    // convert to base64
    var base64_token = sha512.digest64();

    // set headers
    context.setVariable("request.header.now", now);
    context.setVariable("request.header.token", base64_token);

} catch(e) {
    throw 'Error in Javascript';
}

কনটেক্সট অবজেক্ট রেফারেন্স

API প্রক্সি দ্বারা এক্সিকিউট করা প্রতিটি অনুরোধ/উত্তর ট্রানজ্যাকশনের জন্য একটি context অবজেক্ট তৈরি করা হয়। context অবজেক্ট প্রতিটি ট্রানজ্যাকশন সম্পর্কিত ভেরিয়েবল পেতে, সেট করতে ও সরাতে বিভিন্ন পদ্ধতি প্রকাশ করে।

ভেরিয়েবল কোনও ট্রানজ্যাকশনের নির্দিষ্ট প্রপার্টিকে সংজ্ঞায়িত করে। দিনের সময়, অনুরোধকারী ক্লায়েন্টের লোকেল, অনুরোধকারী ক্লায়েন্টের ইউজার-এজেন্ট এবং টার্গেট পরিষেবার URL হল context-এ উপলভ্য ভেরিয়েবলের উদাহরণ। তাই, context কাস্টম আচরণ এক্সিকিউট করার জন্য এইসব প্রপার্টির উপর নির্ভর করে এমন লজিক তৈরি করার ক্ষেত্রে সহায়ক।

ফ্লো ভেরিয়েবল রেফারেন্স এবং ভেরিয়েবল এক্সট্র্যাক্ট করা নীতি দেখুন।

প্রসঙ্গ অবজেক্টের সারসংক্ষেপ

এই সারণীটি প্রসঙ্গ অবজেক্ট এবং এর চাইল্ডদের সংক্ষিপ্ত বিবরণ দেয় এবং প্রতিটি অবজেক্টের সাথে যুক্ত প্রপার্টির তালিকা তৈরি করে।

নাম বিবরণ প্রপার্টি
context মেসেজ প্রসেসিং পাইপলাইন কনটেক্সট এবং অনুরোধ ও উত্তরের জন্য র‍্যাপার ProxyEndpoint ও TargetEndpoint-এর মাধ্যমে এক্সিকিউট করা ফ্লো। ফ্লো, সেশন
context.proxyRequest ProxyEndpoint-এ (অনুরোধকারী অ্যাপ থেকে API প্রক্সি পর্যন্ত) আসা অনুরোধের মেসেজকে প্রতিনিধিত্ব করে এমন একটি অবজেক্ট হেডার, কোয়েরি প্যারামিটার, পদ্ধতি, বডি, URL
context.targetRequest TargetEndpoint থেকে পাঠানো অনুরোধের মেসেজকে (API প্রক্সি থেকে ব্যাকএন্ড পরিষেবা) প্রতিনিধিত্ব করে এমন একটি অবজেক্ট। হেডার, কোয়েরি প্যারামিটার, পদ্ধতি, বডি, URL
context.targetResponse ইনবাউন্ড টার্গেট রেসপন্স মেসেজ (ব্যাকএন্ড সার্ভিস থেকে API প্রক্সি পর্যন্ত) দেখায় এমন একটি অবজেক্ট হেডার, কন্টেন্ট, স্ট্যাটাস
context.proxyResponse আউটবাউন্ড প্রক্সি রেসপন্স মেসেজ (API প্রক্সি থেকে অনুরোধকারী অ্যাপে) দেখায় এমন একটি অবজেক্ট হেডার, কন্টেন্ট, স্ট্যাটাস
context.flow বর্তমান ফ্লোয়ের নাম। নিচে context.flow দেখুন।
context.session নাম/ভ্যালু পেয়ারের একটি ম্যাপ যা আপনি একই কনটেক্সটে এক্সিকিউট করা দুটি আলাদা আলাদা ধাপের মধ্যে অবজেক্ট পাস করতে ব্যবহার করতে পারেন। যেমন: context.session['key'] = 123. কখন এবং কখন এই অবজেক্ট ব্যবহার করা উচিত নয় সেই সম্পর্কে আরও তথ্যের জন্য, এই Apigee কমিউনিটি আলোচনা দেখুন।

কনটেক্সট অবজেক্ট পদ্ধতি

context.getVariable()

পূর্ব-নির্ধারিত বা কাস্টম ভেরিয়েবলের ভ্যালু ফিরিয়ে আনে।

সিনট্যাক্স

context.getVariable("variable-name");

উদাহরণ

বর্তমান বছরের ভ্যালু পেতে:

var year = context.getVariable('system.time.year');

context.setVariable()

কাস্টম ভেরিয়েবল বা যেকোনও লেখার উপযুক্ত আগে থেকে সংজ্ঞায়িত ভেরিয়েবলের ভ্যালু সেট করে।

সিনট্যাক্স

context.setVariable("variable-name", value);

উদাহরণ

ভেরিয়েবল সেট করার একটি সাধারণ পরিস্থিতি হল, যখন কোনও API প্রক্সিকে ডায়নামিক পদ্ধতিতে টার্গেট URL লিখতে হয়। নিচে উল্লেখ করা JavaScript, USER.name নামের একটি ভেরিয়েবলের ভ্যালু পায়, URL-এ সেই ভ্যালুকে কোয়েরি প্যারামিটার হিসেবে যোগ করে http://mocktarget.apigee.net?user= এবং তারপর আগে থেকে সংজ্ঞায়িত target.url-এ সেই ভ্যালু সেট করে।

context.setVariable("target.url", "http://mocktarget.apigee.net/user?user="+context.getVariable("USER.name"));

context.removeVariable()

কন্টেক্সট থেকে একটি ভেরিয়েবল সরিয়ে দেয়।

সিনট্যাক্স

context.removeVariable('variable-name');

কনটেক্সট অবজেক্ট প্রপার্টি

context.flow

flow প্রপার্টি হল একটি স্ট্রিং যা বর্তমান API প্রক্সি ফ্লোকে শনাক্ত করে। এই প্রপার্টিটি সেই ফ্লোকে নির্দেশ করতে ব্যবহার করা হয় যার সাথে জাভাস্ক্রিপ্ট অ্যাটাচ করা আছে। এইসব মান কাজ করে:

  • PROXY_REQ_FLOW
  • PROXY_RESP_FLOW
  • TARGET_REQ_FLOW
  • TARGET_RESP_FLOW

প্রতিটি ফ্লোয়ের নামে PreFlow, PostFlow এবং ProxyEndpoints বা TargetEndpoints-এ সংজ্ঞায়িত যেকোনও কন্ডিশনাল ফ্লো অন্তর্ভুক্ত থাকে।

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

উদাহরণ

শুধুমাত্র targetRequest Flow-তে HTTP হেডার সেট করুন:

if (context.flow=="TARGET_REQ_FLOW") {
     context.targetRequest.headers['TARGET-HEADER-X']='foo';
}

শুধুমাত্র proxyResponse Flow-তে কন্টেন্ট সেট করুন:

if (context.flow=="PROXY_RESP_FLOW") {
     context.proxyResponse.content='bar';
}

context.session

নাম/ভ্যালু পেয়ারের একটি ম্যাপ যা একই মেসেজ কনটেক্সটের মধ্যে এক্সিকিউট করা দুটি নীতির মধ্যে অবজেক্ট পাস করতে ব্যবহার করা যেতে পারে।

উদাহরণ

সেশনে একটি ভ্যালু সেট করুন:

context.session['key']  = 123;

সেশন থেকে ভ্যালু পান:

var value = context.session['key']; // 123

কনটেক্সট অবজেক্ট চাইল্ড

নিচে দেখানো হয়েছে, একটি সম্পূর্ণ API প্রক্সি ফ্লো চারটি আলাদা আলাদা ধাপ নিয়ে গঠিত, যার প্রত্যেকটিতে একটি করে সংশ্লিষ্ট মেসেজ অবজেক্ট থাকে যা হল কনটেক্সট অবজেক্টের চাইল্ড:

  • context.proxyRequest: অনুরোধকারী ক্লায়েন্টের থেকে পাওয়া ইনবাউন্ড অনুরোধ মেসেজ।
  • context.targetRequest: ব্যাকএন্ড পরিষেবায় পাঠানো আউটবাউন্ড অনুরোধ মেসেজ।
  • context.proxyResponse: অনুরোধকারী ক্লায়েন্টকে আউটবাউন্ড উত্তর মেসেজ ফেরত দেওয়া হয়েছে।
  • context.targetResponse: ব্যাকএন্ড পরিষেবা থেকে প্রাপ্ত ইনবাউন্ড অনুরোধ মেসেজ ।

নিম্নলিখিত বিভাগে এই অবজেক্টের পদ্ধতি ও প্রপার্টি বর্ণনা করা হয়েছে:

context.*Request child objects

API প্রক্সিতে এক্সিকিউট করা প্রতিটি HTTP ট্রানজ্যাকশনের জন্য, দুটি অনুরোধ মেসেজ অবজেক্ট তৈরি করা হয়: একটি ইনবাউন্ড (ক্লায়েন্টের থেকে আসা অনুরোধ) এবং একটি আউটবাউন্ড (API প্রক্সি দ্বারা তৈরি করা অনুরোধ এবং ব্যাকএন্ড টার্গেটে জমা দেওয়া)।

context অবজেক্টে চাইল্ড অবজেক্ট আছে যা এই অনুরোধ মেসেজগুলি দেখায়: context.proxyRequest ও context.targetRequest. এইসব অবজেক্ট আপনাকে অনুরোধ ফ্লোয়ের মধ্যে থাকা প্রপার্টি অ্যাক্সেস করতে দেয়, আপনার জাভাস্ক্রিপ্ট কোড এক্সিকিউট করার সময় যা স্কোপে থাকে।

মনে রাখবেন: এছাড়াও, আপনি অনুরোধ ফ্লোতে এইসব প্রপার্টি অ্যাক্সেস করতে request সংক্ষিপ্ত নাম অবজেক্ট ব্যবহার করতে পারেন। request অবজেক্টটি হয় context.proxyRequest অথবা context.targetRequest-কে বোঝায়, এটি নির্ভর করে ফ্লোয়ের কোন অংশে আপনার JavaScript কোড এক্সিকিউট হচ্ছে তার উপর।

context.*Request child object properties

প্রপার্টির নাম বিবরণ
url

url প্রপার্টি হল একটি রিড/রাইট কনভেনিয়েন্স প্রপার্টি যা টার্গেট রিকোয়েস্টের জন্য স্কিম, হোস্ট, পোর্ট, পাথ ও কোয়েরি প্যারামিটারকে একত্রিত করে।

অনুরোধের সম্পূর্ণ URL নিম্নলিখিত প্রপার্টি দিয়ে তৈরি:

  • প্রোটোকল: URL-এর প্রোটোকল (যেমন, HTTP, HTTPS)
  • পোর্ট: পোর্ট (যেমন, :৮০, :৪৪৩)
  • হোস্ট: URL-এর হোস্ট (যেমন, www.example.com)
  • পাথ: URI-এর পাথ (যেমন, /v1/mocktarget)

url পেলে, নিম্নলিখিত ফর্ম্যাটে একটি URL রিটার্ন করা হয়:

protocol://host:port/path?queryParams

উদাহরণ:

context.targetRequest.url = 'http://www.example.com/path?q1=1'
context.targetRequest.protocol ='https';
headers

String => List-এর ম্যাপিং হিসেবে HTTP অনুরোধ হেডার

উদাহরণ:

এই HTTP অনুরোধের জন্য:

POST /v1/blogs HTTP/1.1
Host: api.example.com
Content-Type: application/json
Authorization: Bearer ylSkZIjbdWybfs4fUQe9BqP0LH5Z
নিম্নলিখিত জাভাস্ক্রিপ্ট:
context.proxyRequest.headers['Content-Type'];
context.proxyRequest.headers['Authorization'];

নিম্নলিখিত মান রিটার্ন করবে

application/json
Bearer ylSkZIjbdWybfs4fUQe9BqP0LH5Z
queryParams

String => List-এর ম্যাপিং হিসেবে অনুরোধ মেসেজের কোয়েরি প্যারামিটার।

উদাহরণ:

"?city=PaloAlto&city=NewYork"

এভাবে অ্যাক্সেস করা যেতে পারে:

context.proxyRequest.queryParams['city'];  // == 'PaloAlto'
context.proxyRequest.queryParams['city'][0]     // == 'PaloAlto'
context.proxyRequest.queryParams['city'][1];    // == 'NewYork'
context.proxyRequest.queryParams['city'].length(); // == 2
method

অনুরোধের সাথে যুক্ত HTTP ক্রিয়া (GET, POST, PUT, DELETE, PATCH ইত্যাদি)

উদাহরণ:

এই অনুরোধের জন্য:

POST /v1/blogs HTTP/1.1
Host: api.example.com
Content-Type: application/json
Authorization: Bearer ylSkZIjbdWybfs4fUQe9BqP0LH5Z

নিম্নলিখিত জাভাস্ক্রিপ্ট:

context.proxyRequest.method;

নিম্নলিখিত ভ্যালু রিটার্ন করবে

POST
body

HTTP অনুরোধের মেসেজ বডি (পেলোড)।

অনুরোধের বডিতে নিম্নলিখিত মেম্বার আছে:

  • context.targetRequest.body.asXML;
  • context.targetRequest.body.asJSON;
  • context.targetRequest.body.asForm;

উদাহরণ:

XML বডির জন্য:

<customer number='1'>
<name>Fred<name/>
<customer/>

XML অবজেক্টের এলিমেন্ট অ্যাক্সেস করতে, এগুলি অনুসরণ করুন:

var name = context.targetRequest.body.asXML.name;

XML অ্যাট্রিবিউট অ্যাক্সেস করতে, @ নোটেশন ব্যবহার করুন।

var number = context.targetRequest.body.asXML.@number;

JSON অনুরোধের বডির জন্য:

{
"a":  1 ,
"b" : "2"
}
var a = context.proxyRequest.body.asJSON.a;    // == 1
var b = context.proxyRequest.body.asJSON.b;    // == 2

ফর্ম প্যারামিটার পড়তে:

"vehicle=Car&vehicle=Truck"
v0 = context.proxyRequest.body.asForm['vehicle'][0];
v1 = context.proxyRequest.body.asForm['vehicle'][1];

প্রসঙ্গ.*উত্তর চাইল্ড অবজেক্ট

API প্রক্সিতে এক্সিকিউট করা প্রতিটি HTTP ট্রানজ্যাকশনের জন্য, দুটি রেসপন্স মেসেজ অবজেক্ট তৈরি করা হয়: একটি ইনবাউন্ড (ব্যাকএন্ড পরিষেবা থেকে পাওয়া উত্তর) এবং একটি আউটবাউন্ড (ক্লায়েন্টকে ফেরত পাঠানো উত্তর)।

কনটেক্সট অবজেক্টে চাইল্ড অবজেক্ট থাকে যা এই রেসপন্স মেসেজগুলি দেখায়: context.proxyResponse এবং context.targetResponse. এইসব অবজেক্ট আপনাকে রেসপন্স ফ্লোয়ের মধ্যে থাকা প্রপার্টি অ্যাক্সেস করতে দেয়, আপনার জাভাস্ক্রিপ্ট কোড এক্সিকিউট করার সময় যা স্কোপে থাকে।

মনে রাখবেন: এছাড়াও, আপনি কোনও উত্তর ফ্লো থেকে এইসব প্রপার্টি অ্যাক্সেস করতে response সংক্ষিপ্ত অবজেক্ট ব্যবহার করতে পারেন। response অবজেক্টটি হয় context.proxyResponse অথবা context.targetResponse-কে বোঝায়, এটি নির্ভর করে ফ্লোয়ের কোন অংশে আপনার JavaScript কোড এক্সিকিউট হচ্ছে তার উপর।

context.*Response অবজেক্ট প্রপার্টি

প্রপার্টির নাম বিবরণ
headers

String => List হিসেবে রেসপন্স মেসেজের HTTP হেডার।

উদাহরণ:

var cookie = context.targetResponse.headers['Set-Cookie'];
status

প্রপার্টি হিসেবে স্ট্যাটাস মেসেজ সহ স্ট্যাটাস কোড। প্রপার্টি হিসেবে স্ট্যাটাস কোড ও স্ট্যাটাস মেসেজ দুটিই উপলভ্য।

উদাহরণ:

var status = context.targetResponse.status.code;   // 200
var msg = context.targetResponse.status.message;   // "OK"
content

উত্তর মেসেজের HTTP বডি (পে-লোড কন্টেন্ট)।

উত্তরের কন্টেন্টে নিম্নলিখিত মেম্বার রয়েছে:

context.targetResponse.content.asXML;
context.targetResponse.content.asJSON;

.asXML নোটেশন ব্যবহার করে

.asXML নোটেশন ব্যবহার করে XML ডকুমেন্ট ঘুরে দেখার একটি সহজ উপায় আছে। এই বিভাগে, এই নোটেশন কীভাবে ব্যবহার করতে হয় এবং এটি কীভাবে request.content ও context.proxyRequest.content থেকে আলাদা তা বর্ণনা করা হয়েছে।

যেমন:

request.content.asXML

অথবা

context.proxyRequest.content.asXML

*.content ও *.content.asXML, দুটি ফর্মই স্ট্রিং কন্টেক্সটে ব্যবহার করা যায় এবং জাভাস্ক্রিপ্ট এগুলিকে স্ট্রিং হিসেবে গণ্য করে। প্রথম ক্ষেত্রে (*.content), স্ট্রিংয়ে সব ঘোষণা ও XML কমেন্ট অন্তর্ভুক্ত থাকে। পরের ক্ষেত্রে (*.content.asXML), ফলাফলের স্ট্রিং ভ্যালু থেকে ডিক্লারেশন ও কমেন্ট সরিয়ে দেওয়া হয়।

উদাহরণ

msg.content:

<?xml version="1.0" encoding="UTF-8"?>
<yahoo:error xmlns:yahoo="http://yahooapis.com/v1/base.rng" xml:lang="en-US">
   <yahoo:description>Please provide valid credentials. OAuth oauth_problem="unable_to_determine_oauth_type", realm="yahooapis.com"
   </yahoo:description>
</yahoo:error>
<!-- mg023.mail.gq1.yahoo.com uncompressed/chunked Sat Dec 14 01:23:35 UTC 2013 -->

msg.content.asXML:

<?xml version="1.0" encoding="UTF-8"?>
<yahoo:error xmlns:yahoo="http://yahooapis.com/v1/base.rng" xml:lang="en-US">
   <yahoo:description>Please provide valid credentials. OAuth oauth_problem="unable_to_determine_oauth_type", realm="yahooapis.com"
   </yahoo:description>
</yahoo:error>

এছাড়াও, এলিমেন্ট ও অ্যাট্রিবিউটের নাম উল্লেখ করে, XML হায়ারার্কি ট্রাভার্স করতে আপনি .asXML ফর্ম ব্যবহার করতে পারবেন। অন্য সিনট্যাক্স ব্যবহার করে হায়ারার্কি ট্রাভার্স করা সম্ভব নয়।

JavaScript print() স্টেটমেন্টের মাধ্যমে ডিবাগ করা

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

if (context.flow=="PROXY_REQ_FLOW") {
     print("In proxy request flow");
     var username = context.getVariable("request.queryparam.user");
     print("Got query param: " + username);
     context.setVariable("USER.name", username);
     print("Set query param: " + context.getVariable("USER.name"));
}


if (context.flow=="TARGET_REQ_FLOW") {
     print("In target request flow");
     var username = context.getVariable("USER.name");
     var url = "http://mocktarget.apigee.net/user?"
     context.setVariable("target.url", url + "user=" + username);
     print("callout to URL: ", context.getVariable("target.url"));
}

আউটপুট দেখতে, ট্রেস উইন্ডোর নিচে সব ট্রানজ্যাকশনের আউটপুট বিকল্প বেছে নিন। এছাড়াও, আপনি stepExecution-stdout নামের Trace প্রপার্টিতে আউটপুট দেখতে পাবেন।

httpClient-এর মাধ্যমে জাভাস্ক্রিপ্ট কলআউট করা

API প্রক্সি ফ্লোতে এক্সিকিউট করা কাস্টম জাভাস্ক্রিপ্ট কোডের মধ্যে থেকে যেকোনও URL-এ একাধিক, প্যারালাল, অ্যাসিঙ্ক্রোনাস HTTP অনুরোধ করতে httpClient ব্যবহার করুন। Apigee Edge Javascript object মডেল httpClient অবজেক্টকে এক্সপোজ করে।

httpClient সম্পর্কে

জাভাস্ক্রিপ্ট অবজেক্ট মডেলের মাধ্যমে Apigee Edge-এ রান করা কাস্টম জাভাস্ক্রিপ্ট কোডে httpClient অবজেক্ট এক্সপোজ করা হয়। API প্রক্সিতে কাস্টম জাভাস্ক্রিপ্ট অ্যাটাচ করতে, আপনাকে জাভাস্ক্রিপ্ট নীতি ব্যবহার করতে হবে। নীতি রান করলে, কাস্টম JavaScript কোড এক্সিকিউট হয়।

কম্পোজিট পরিষেবা বা ম্যাশ-আপ ডেভেলপ করার জন্য httpClient অবজেক্টটি উপযোগী। যেমন, আপনি একাধিক ব্যাকএন্ড কলকে একটি API পদ্ধতিতে একত্রিত করতে পারেন। এই অবজেক্টটি সাধারণত ServiceCallout নীতির বিকল্প হিসেবে ব্যবহার করা হয়।

এখানে ব্যবহারের একটি প্রাথমিক প্যাটার্ন দেওয়া হল। একটি Request অবজেক্ট ইনস্ট্যানশিয়েট করুন, সেটিতে একটি URL অ্যাসাইন করুন (যেমন, আপনি কল করতে চান এমন একটি ব্যাকএন্ড পরিষেবাতে) এবং সেই Request অবজেক্টের সাথে httpClient.send কল করুন।

var myRequest = new Request();
myRequest.url = "http://www.example.com";
var exchangeObj = httpClient.send(myRequest);

httpClient রেফারেন্স

HTTP ক্লায়েন্ট দুটি পদ্ধতি প্রকাশ করে: get() এবং send().

httpClient.get()

সহজ HTTP GET অনুরোধের জন্য একটি সুবিধাজনক পদ্ধতি, এতে HTTP হেডার কাজ করে না।

ব্যবহার

var exchangeObj = httpClient.get(url);

ফেরত

এই পদ্ধতি একটি exchange অবজেক্ট রিটার্ন করে। এই অবজেক্টের কোনও প্রপার্টি নেই এবং এটি নিম্নলিখিত পদ্ধতিগুলি প্রকাশ করে:

  • isError(): (boolean) httpClient সার্ভারের সাথে কানেক্ট করতে না পারলে true রিটার্ন করে। HTTP স্ট্যাটাস কোড 4xx ও 5xx-এর ফলে isError() false হয়, কারণ কানেকশন সম্পূর্ণ হয়েছে এবং সঠিক রেসপন্স কোড ফেরত এসেছে। isError() true রিটার্ন করলে, getResponse() জাভাস্ক্রিপ্ট undefined রিটার্ন করে।
  • isSuccess(): (বুলিয়ান) পাঠানো সম্পূর্ণ ও সফল হলে true রিটার্ন করে।
  • isComplete(): (বুলিয়ান) অনুরোধ সম্পূর্ণ হলে true রিটার্ন করে।
  • waitForComplete(): অনুরোধ সম্পূর্ণ না হওয়া পর্যন্ত থ্রেড পজ করে (সফল বা সমস্যার মাধ্যমে)।
  • getResponse(): (object) Returns the response object if the httpClient.send() was complete and successful. ফিরে আসা অবজেক্টে context.proxyResponse অবজেক্টের মতো একই পদ্ধতি ও প্রপার্টি আছে। প্রসঙ্গ অবজেক্টের সারসংক্ষেপ দেখুন।
  • getError(): (স্ট্রিং) httpClient.send()-এ কল করলে কোনও সমস্যা হলে, সমস্যার মেসেজটি স্ট্রিং হিসেবে রিটার্ন করে।

উদাহরণ

HTTP অনুরোধের প্রপার্টি সহ সম্পূর্ণ কনফিগার করা অনুরোধ অবজেক্ট পাঠান। উত্তর প্রসেস করার জন্য নন-ব্লকিং কলব্যাক ব্যবহার করুন।

// Add the required the headers for making a specific API request
var headers = {'X-SOME-HEADER' : 'some value' };
// Make a GET API request along with headers
var myRequest = new Request("http://www.example.com","GET",headers);

// Define the callback function and process the response from the GET API request
function onComplete(response,error) {
 // Check if the HTTP request was successful
    if (response) {
      context.setVariable('example.status', response.status);
     } else {
      context.setVariable('example.error', 'Woops: ' + error);
     }
}

// Specify the callback Function as an argument
httpClient.get(myRequest, onComplete);

JavaScript নীতি ব্যবহার করা

প্রক্সি ফ্লোতে কাস্টম জাভাস্ক্রিপ্ট কোড অ্যাটাচ করতে জাভাস্ক্রিপ্ট নীতি ব্যবহার করুন। জাভাস্ক্রিপ্ট নীতি দেখুন।

সম্পর্কিত বিষয়

Apigee কমিউনিটি নিবন্ধ

আপনি Apigee কমিউনিটিতে এইসব সম্পর্কিত নিবন্ধ খুঁজে পেতে পারেন: