জাভাস্ক্রিপ্ট অবজেক্ট মডেল

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

এই টপিকে Apigee Edge JavaScript Object Model নিয়ে আলোচনা করা হয়েছে। আপনি যদি কোনো এপিআই প্রক্সিতে কাস্টম জাভাস্ক্রিপ্ট যোগ করার জন্য জাভাস্ক্রিপ্ট পলিসি ব্যবহার করতে চান, তবে এই মডেলটি বোঝা আপনার জন্য জরুরি।

এজ জাভাস্ক্রিপ্ট অবজেক্ট মডেল সম্পর্কে

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

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

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

প্রসঙ্গ বস্তু

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

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

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 তে সেট করা থাকে। স্কোপ-নির্দিষ্ট কোড এক্সিকিউট করার জন্য এই কনস্ট্যান্টটি বেশ সুবিধাজনক। `getter` আপনাকে ফ্লো ভ্যারিয়েবল পেতে এবং `setter` আপনাকে ফ্লো ভ্যারিয়েবল সেট করতে দেয়। এই ভ্যারিয়েবলগুলো সাধারণত প্রক্সি ফ্লো-তে পাওয়া যায় এবং অন্যান্য পলিসি দ্বারা ব্যবহৃত হতে পারে।

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

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

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

অনুরোধ এবং প্রতিক্রিয়া বস্তু

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

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

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

যখন ব্যবহার করা হয় পলিসি কনফিগারেশনের এলিমেন্টের ক্ষেত্রে, জাভাস্ক্রিপ্ট কোড ` 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

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

উদাহরণস্বরূপ, নিম্নলিখিতটি "ভেরিয়েবলের নাম" এবং আউটপুটের শৈলী নির্দিষ্ট করে, যেটিতে জাভাস্ক্রিপ্ট তথ্য প্রদান করবে:

<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));
}

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

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

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

  • SHA-1
  • SHA256
  • SHA512
  • এমডি৫

SHA-1 অবজেক্ট নিয়ে কাজ করা

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

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

var _sha1 = crypto.getSHA1();

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

সিনট্যাক্স

_sha1.update(value);

প্যারামিটার

  • মান - (স্ট্রিং) যেকোনো স্ট্রিং মান।

উদাহরণ

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

_sha1.update("salt_value");

_sha1.update("some text");

SHA-1 অবজেক্টটিকে একটি হেক্স স্ট্রিং হিসাবে ফেরত দিন।

var _hashed_token = _sha1.digest();

SHA-1 অবজেক্টটিকে একটি বেস৬৪ স্ট্রিং হিসেবে ফেরত দিন।

var _hashed_token = _sha1.digest64();

SHA-256 অবজেক্ট নিয়ে কাজ করা

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

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

var _sha256 = crypto.getSHA256();

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

সিনট্যাক্স

_sha256.update(value);

প্যারামিটার

  • মান - (স্ট্রিং) যেকোনো স্ট্রিং মান।

উদাহরণ

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

_sha256.update("salt_value");

_sha256.update("some text");

SHA-256 অবজেক্টটিকে একটি হেক্স স্ট্রিং হিসাবে ফেরত দিন।

var _hashed_token = _sha256.digest();

SHA-256 অবজেক্টটিকে একটি বেস৬৪ স্ট্রিং হিসেবে ফেরত দিন।

var _hashed_token = _sha256.digest64();

SHA-512 অবজেক্ট নিয়ে কাজ করা

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

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

var _sha512 = crypto.getSHA512();

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

সিনট্যাক্স

_sha512.update(value);

প্যারামিটার

  • মান - (স্ট্রিং) যেকোনো স্ট্রিং মান।

উদাহরণ

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

_sha512.update("salt_value");

_sha512.update("some text");

SHA-512 অবজেক্টটিকে একটি হেক্স স্ট্রিং হিসাবে ফেরত দিন।

var _hashed_token = _sha512.digest();

SHA-512 অবজেক্টটিকে একটি বেস৬৪ স্ট্রিং হিসেবে ফেরত দিন।

var _hashed_token = _sha512.digest64();

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

আপনি MD5 অবজেক্ট তৈরি করতে, আপডেট করতে এবং সেগুলোকে হেক্স ও বেস৬৪ মানে রূপান্তর করতে পারেন।

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

var _md5 = crypto.getMD5();

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

সিনট্যাক্স

_md5.update(value);

প্যারামিটার

  • মান - (স্ট্রিং) যেকোনো স্ট্রিং মান।

উদাহরণ

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

_md5.update("salt_value");

_md5.update("some text");

MD5 অবজেক্টটিকে একটি হেক্স স্ট্রিং হিসাবে ফেরত দিন।

var _hashed_token = _md5.digest();

MD5 অবজেক্টটিকে একটি বেস৬৪ স্ট্রিং হিসেবে ফেরত দিন।

var _hashed_token = _md5.digest64();

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

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

ক্রিপ্টো.তারিখফর্ম্যাট()

তারিখটি স্ট্রিং ফরম্যাটে ফেরত দেয়।

সিনট্যাক্স

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

প্যারামিটার

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

উদাহরণ

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

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';
}

প্রসঙ্গ বস্তু রেফারেন্স

একটি এপিআই প্রক্সি দ্বারা সম্পাদিত প্রতিটি অনুরোধ/প্রতিক্রিয়া লেনদেনের জন্য একটি context অবজেক্ট তৈরি করা হয়। এই context অবজেক্টটি প্রতিটি লেনদেন-সম্পর্কিত ভেরিয়েবলগুলো পেতে, সেট করতে এবং মুছে ফেলার জন্য মেথড সরবরাহ করে।

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

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

প্রসঙ্গ বস্তুর সারাংশ

এই সারণিতে কন্টেক্সট অবজেক্ট ও তার চাইল্ডগুলোর সংক্ষিপ্ত বর্ণনা দেওয়া হয়েছে এবং প্রতিটির সাথে আবদ্ধ প্রোপার্টিগুলোর তালিকা দেওয়া হয়েছে।

নাম বর্ণনা বৈশিষ্ট্য
context মেসেজ প্রসেসিং পাইপলাইন কনটেক্সট এবং ProxyEndpoint ও TargetEndpoint দ্বারা সম্পাদিত রিকোয়েস্ট ও রেসপন্স ফ্লো-গুলোর জন্য একটি র‍্যাপার। প্রবাহ, অধিবেশন
context. proxyRequest একটি অবজেক্ট যা ProxyEndpoint-এ আসা অনুরোধ বার্তাটিকে (অনুরোধকারী অ্যাপ থেকে API প্রক্সিতে) উপস্থাপন করে। হেডার, কোয়েরি প্যারামিটার, মেথড, বডি, ইউআরএল
context. targetRequest একটি অবজেক্ট যা টার্গেটএন্ডপয়েন্ট থেকে (এপিআই প্রক্সি থেকে ব্যাকএন্ড পরিষেবাতে) প্রেরিত অনুরোধ বার্তাটিকে প্রতিনিধিত্ব করে। হেডার, কোয়েরি প্যারামিটার, মেথড, বডি, ইউআরএল
context. targetResponse একটি অবজেক্ট যা আগত লক্ষ্য প্রতিক্রিয়া বার্তা (ব্যাকএন্ড পরিষেবা থেকে এপিআই প্রক্সিতে) উপস্থাপন করে। হেডার, বিষয়বস্তু, অবস্থা
context. proxyResponse একটি অবজেক্ট যা বহির্গামী প্রক্সি প্রতিক্রিয়া বার্তাটিকে (এপিআই প্রক্সি থেকে অনুরোধকারী অ্যাপে) উপস্থাপন করে। হেডার, বিষয়বস্তু, অবস্থা
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);

উদাহরণ

একটি ভেরিয়েবল সেট করার একটি সাধারণ পরিস্থিতি হলো যখন একটি এপিআই প্রক্সিকে ডায়নামিকভাবে টার্গেট ইউআরএল লিখতে হয়। নিম্নলিখিত জাভাস্ক্রিপ্টটি USER.name নামক একটি ভেরিয়েবলের মান গ্রহণ করে, সেই মানটিকে 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');

প্রসঙ্গ বস্তুর বৈশিষ্ট্য

প্রসঙ্গ.প্রবাহ

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

  • PROXY_REQ_FLOW
  • PROXY_RESP_FLOW
  • TARGET_REQ_FLOW
  • TARGET_RESP_FLOW

প্রতিটি ফ্লো নামের মধ্যে প্রক্সিএন্ডপয়েন্ট বা টার্গেটএন্ডপয়েন্ট-এ সংজ্ঞায়িত প্রিফ্লো, পোস্টফ্লো এবং যেকোনো শর্তাধীন ফ্লো অন্তর্ভুক্ত থাকে।

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

উদাহরণ

শুধুমাত্র targetRequest ফ্লো-তে একটি HTTP হেডার সেট করুন:

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

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

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

প্রসঙ্গ.সেশন

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

উদাহরণ

সেশনে একটি মান সেট করুন:

context.session['key']  = 123;

সেশন থেকে মানটি নিন:

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

প্রসঙ্গ বস্তুর সন্তান

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

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

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

প্রসঙ্গ.*অনুরোধ চাইল্ড অবজেক্ট

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

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

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

প্রসঙ্গ.*চাইল্ড অবজেক্টের প্রোপার্টি অনুরোধ করুন

সম্পত্তির নাম বর্ণনা
url

` url প্রপার্টিটি একটি রিড/রাইট সুবিধাজনক প্রপার্টি যা `targetRequest`-এর জন্য `scheme`, `host`, `port`, `path` এবং `query` প্যারামিটারগুলোকে একত্রিত করে।

অনুরোধের সম্পূর্ণ URL-টি নিম্নলিখিত বৈশিষ্ট্যগুলো দ্বারা গঠিত:

  • প্রোটোকল: ইউআরএল-এর প্রোটোকল (যেমন, HTTP, HTTPS)
  • পোর্ট: পোর্টটি (উদাহরণস্বরূপ, :80, :443)
  • হোস্ট: ইউআরএল-এর হোস্ট (উদাহরণস্বরূপ, www.example.com)
  • path: URI-এর পথ (উদাহরণস্বরূপ, /v1/mocktarget)

url পাওয়ার সময়, ইউআরএলটি নিম্নলিখিত বিন্যাসে ফেরত দেওয়া হয়:

protocol://host:port/path?queryParams

উদাহরণ:

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

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

উদাহরণ:

এই 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];

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

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

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

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

প্রসঙ্গ.*প্রতিক্রিয়া অবজেক্টের বৈশিষ্ট্যসমূহ

সম্পত্তির নাম বর্ণনা
headers

প্রতিক্রিয়া বার্তার HTTP হেডারগুলো String => List এ ম্যাপিং হিসেবে থাকে।

উদাহরণ:

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.contentcontext.proxyRequest.content থেকে কীভাবে আলাদা।

উদাহরণস্বরূপ:

request.content.asXML

অথবা

context.proxyRequest.content.asXML

*.content এবং *.content.asXML উভয় ফর্মই একটি স্ট্রিং কনটেক্সটে ব্যবহার করা যায়, এবং জাভাস্ক্রিপ্ট সেগুলোকে স্ট্রিং-এ রূপান্তর করে। প্রথম ক্ষেত্রে ( *.content ), স্ট্রিংটিতে সমস্ত ডিক্লারেশন এবং XML কমেন্ট অন্তর্ভুক্ত থাকে। দ্বিতীয় ক্ষেত্রে ( *.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>
<!-- 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>

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

জাভাস্ক্রিপ্ট print() স্টেটমেন্ট দিয়ে ডিবাগ করুন

আপনি যদি কাস্টম জাভাস্ক্রিপ্ট কোড এক্সিকিউট করার জন্য জাভাস্ক্রিপ্ট পলিসি ব্যবহার করেন, তবে মনে রাখবেন যে আপনি ট্রেস টুলে ডিবাগ তথ্য আউটপুট করার জন্য 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 নামক ট্রেস প্রপার্টিতে আউটপুট খুঁজে পেতে পারেন।

httpClient ব্যবহার করে জাভাস্ক্রিপ্ট কলআউট তৈরি করা

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

httpClient সম্পর্কে

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

httpClient অবজেক্টটি কম্পোজিট সার্ভিস বা ম্যাশআপ তৈরির জন্য উপযোগী। উদাহরণস্বরূপ, আপনি একাধিক ব্যাকএন্ড কলকে একটিমাত্র এপিআই মেথডে একত্রিত করতে পারেন। এই অবজেক্টটি সাধারণত 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() : (বুলিয়ান) httpClient সার্ভারের সাথে সংযোগ স্থাপন করতে না পারলে true রিটার্ন করে। HTTP স্ট্যাটাস কোড 4xx এবং 5xx ক্ষেত্রে isError() false রিটার্ন করে, কারণ সংযোগ সম্পন্ন হয় এবং একটি বৈধ রেসপন্স কোড ফেরত আসে। যদি isError() true রিটার্ন করে, তাহলে getResponse() কল করলে জাভাস্ক্রিপ্ট undefined রিটার্ন হয়।
  • isSuccess() : (বুলিয়ান) প্রেরণ সম্পূর্ণ ও সফল হলে true রিটার্ন করে।
  • isComplete() : (বুলিয়ান) অনুরোধটি সম্পূর্ণ হলে true রিটার্ন করে।
  • waitForComplete() : অনুরোধটি সফল বা ত্রুটিপূর্ণভাবে সম্পূর্ণ না হওয়া পর্যন্ত থ্রেডটিকে থামিয়ে রাখে।
  • getResponse() : (object) httpClient.send() সম্পূর্ণ এবং সফল হলে রেসপন্স অবজেক্টটি ফেরত দেয়। ফেরত আসা অবজেক্টটিতে context.proxyResponse অবজেক্টের মতোই মেথড এবং প্রোপার্টি থাকে। কনটেক্সট অবজেক্টের সারাংশ দেখুন।
  • getError() : (string) httpClient.send() কল করার ফলে কোনো ত্রুটি ঘটলে, ত্রুটির বার্তাটি একটি স্ট্রিং হিসাবে ফেরত দেয়।

উদাহরণ

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

// 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);

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

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

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

অ্যাপিজি কমিউনিটির নিবন্ধগুলি

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

,

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

এই টপিকে Apigee Edge JavaScript Object Model নিয়ে আলোচনা করা হয়েছে। আপনি যদি কোনো এপিআই প্রক্সিতে কাস্টম জাভাস্ক্রিপ্ট যোগ করার জন্য জাভাস্ক্রিপ্ট পলিসি ব্যবহার করতে চান, তবে এই মডেলটি বোঝা আপনার জন্য জরুরি।

এজ জাভাস্ক্রিপ্ট অবজেক্ট মডেল সম্পর্কে

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

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

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

প্রসঙ্গ বস্তু

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

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

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 তে সেট করা থাকে। স্কোপ-নির্দিষ্ট কোড এক্সিকিউট করার জন্য এই কনস্ট্যান্টটি বেশ সুবিধাজনক। `getter` আপনাকে ফ্লো ভ্যারিয়েবল পেতে এবং `setter` আপনাকে ফ্লো ভ্যারিয়েবল সেট করতে দেয়। এই ভ্যারিয়েবলগুলো সাধারণত প্রক্সি ফ্লো-তে পাওয়া যায় এবং অন্যান্য পলিসি দ্বারা ব্যবহৃত হতে পারে।

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

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

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

অনুরোধ এবং প্রতিক্রিয়া বস্তু

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

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

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

যখন ব্যবহার করা হয় পলিসি কনফিগারেশনের এলিমেন্টের ক্ষেত্রে, জাভাস্ক্রিপ্ট কোড ` 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

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

উদাহরণস্বরূপ, নিম্নলিখিতটি "ভেরিয়েবলের নাম" এবং আউটপুটের শৈলী নির্দিষ্ট করে, যেটিতে জাভাস্ক্রিপ্ট তথ্য প্রদান করবে:

<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));
}

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

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

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

  • SHA-1
  • SHA256
  • SHA512
  • এমডি৫

SHA-1 অবজেক্ট নিয়ে কাজ করা

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

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

var _sha1 = crypto.getSHA1();

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

সিনট্যাক্স

_sha1.update(value);

প্যারামিটার

  • মান - (স্ট্রিং) যেকোনো স্ট্রিং মান।

উদাহরণ

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

_sha1.update("salt_value");

_sha1.update("some text");

SHA-1 অবজেক্টটিকে একটি হেক্স স্ট্রিং হিসাবে ফেরত দিন।

var _hashed_token = _sha1.digest();

SHA-1 অবজেক্টটিকে একটি বেস৬৪ স্ট্রিং হিসেবে ফেরত দিন।

var _hashed_token = _sha1.digest64();

SHA-256 অবজেক্ট নিয়ে কাজ করা

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

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

var _sha256 = crypto.getSHA256();

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

সিনট্যাক্স

_sha256.update(value);

প্যারামিটার

  • মান - (স্ট্রিং) যেকোনো স্ট্রিং মান।

উদাহরণ

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

_sha256.update("salt_value");

_sha256.update("some text");

SHA-256 অবজেক্টটিকে একটি হেক্স স্ট্রিং হিসাবে ফেরত দিন।

var _hashed_token = _sha256.digest();

SHA-256 অবজেক্টটিকে একটি বেস৬৪ স্ট্রিং হিসেবে ফেরত দিন।

var _hashed_token = _sha256.digest64();

SHA-512 অবজেক্ট নিয়ে কাজ করা

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

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

var _sha512 = crypto.getSHA512();

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

সিনট্যাক্স

_sha512.update(value);

প্যারামিটার

  • মান - (স্ট্রিং) যেকোনো স্ট্রিং মান।

উদাহরণ

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

_sha512.update("salt_value");

_sha512.update("some text");

SHA-512 অবজেক্টটিকে একটি হেক্স স্ট্রিং হিসাবে ফেরত দিন।

var _hashed_token = _sha512.digest();

SHA-512 অবজেক্টটিকে একটি বেস৬৪ স্ট্রিং হিসেবে ফেরত দিন।

var _hashed_token = _sha512.digest64();

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

আপনি MD5 অবজেক্ট তৈরি করতে, আপডেট করতে এবং সেগুলোকে হেক্স ও বেস৬৪ মানে রূপান্তর করতে পারেন।

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

var _md5 = crypto.getMD5();

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

সিনট্যাক্স

_md5.update(value);

প্যারামিটার

  • মান - (স্ট্রিং) যেকোনো স্ট্রিং মান।

উদাহরণ

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

_md5.update("salt_value");

_md5.update("some text");

MD5 অবজেক্টটিকে একটি হেক্স স্ট্রিং হিসাবে ফেরত দিন।

var _hashed_token = _md5.digest();

MD5 অবজেক্টটিকে একটি বেস৬৪ স্ট্রিং হিসেবে ফেরত দিন।

var _hashed_token = _md5.digest64();

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

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

ক্রিপ্টো.তারিখফর্ম্যাট()

তারিখটি স্ট্রিং ফরম্যাটে ফেরত দেয়।

সিনট্যাক্স

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

প্যারামিটার

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

উদাহরণ

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

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';
}

প্রসঙ্গ বস্তু রেফারেন্স

একটি এপিআই প্রক্সি দ্বারা সম্পাদিত প্রতিটি অনুরোধ/প্রতিক্রিয়া লেনদেনের জন্য একটি context অবজেক্ট তৈরি করা হয়। এই context অবজেক্টটি প্রতিটি লেনদেন-সম্পর্কিত ভেরিয়েবলগুলো পেতে, সেট করতে এবং মুছে ফেলার জন্য মেথড সরবরাহ করে।

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

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

প্রসঙ্গ বস্তুর সারাংশ

এই সারণিতে কন্টেক্সট অবজেক্ট ও তার চাইল্ডগুলোর সংক্ষিপ্ত বর্ণনা দেওয়া হয়েছে এবং প্রতিটির সাথে আবদ্ধ প্রোপার্টিগুলোর তালিকা দেওয়া হয়েছে।

নাম বর্ণনা বৈশিষ্ট্য
context মেসেজ প্রসেসিং পাইপলাইন কনটেক্সট এবং ProxyEndpoint ও TargetEndpoint দ্বারা সম্পাদিত রিকোয়েস্ট ও রেসপন্স ফ্লো-গুলোর জন্য একটি র‍্যাপার। প্রবাহ, অধিবেশন
context. proxyRequest একটি অবজেক্ট যা ProxyEndpoint-এ আসা অনুরোধ বার্তাটিকে (অনুরোধকারী অ্যাপ থেকে API প্রক্সিতে) উপস্থাপন করে। হেডার, কোয়েরি প্যারামিটার, মেথড, বডি, ইউআরএল
context. targetRequest একটি অবজেক্ট যা টার্গেটএন্ডপয়েন্ট থেকে (এপিআই প্রক্সি থেকে ব্যাকএন্ড পরিষেবাতে) প্রেরিত অনুরোধ বার্তাটিকে প্রতিনিধিত্ব করে। হেডার, কোয়েরি প্যারামিটার, মেথড, বডি, ইউআরএল
context. targetResponse একটি অবজেক্ট যা আগত লক্ষ্য প্রতিক্রিয়া বার্তা (ব্যাকএন্ড পরিষেবা থেকে এপিআই প্রক্সিতে) উপস্থাপন করে। হেডার, বিষয়বস্তু, অবস্থা
context. proxyResponse একটি অবজেক্ট যা বহির্গামী প্রক্সি প্রতিক্রিয়া বার্তাটিকে (এপিআই প্রক্সি থেকে অনুরোধকারী অ্যাপে) উপস্থাপন করে। হেডার, বিষয়বস্তু, অবস্থা
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);

উদাহরণ

একটি ভেরিয়েবল সেট করার একটি সাধারণ পরিস্থিতি হলো যখন একটি এপিআই প্রক্সিকে ডায়নামিকভাবে টার্গেট ইউআরএল লিখতে হয়। নিম্নলিখিত জাভাস্ক্রিপ্টটি USER.name নামক একটি ভেরিয়েবলের মান গ্রহণ করে, সেই মানটিকে 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');

প্রসঙ্গ বস্তুর বৈশিষ্ট্য

প্রসঙ্গ.প্রবাহ

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

  • PROXY_REQ_FLOW
  • PROXY_RESP_FLOW
  • TARGET_REQ_FLOW
  • TARGET_RESP_FLOW

প্রতিটি ফ্লো নামের মধ্যে প্রক্সিএন্ডপয়েন্ট বা টার্গেটএন্ডপয়েন্ট-এ সংজ্ঞায়িত প্রিফ্লো, পোস্টফ্লো এবং যেকোনো শর্তাধীন ফ্লো অন্তর্ভুক্ত থাকে।

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

উদাহরণ

শুধুমাত্র targetRequest ফ্লো-তে একটি HTTP হেডার সেট করুন:

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

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

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

প্রসঙ্গ.সেশন

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

উদাহরণ

সেশনে একটি মান সেট করুন:

context.session['key']  = 123;

সেশন থেকে মানটি নিন:

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

প্রসঙ্গ বস্তুর সন্তান

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

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

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

প্রসঙ্গ.*অনুরোধ চাইল্ড অবজেক্ট

For each HTTP transaction the executes in an API proxy, two request message objects are created: one inbound (the request from the client) and one outbound (the request generated by the API proxy and submitted to the backend target.)

The context object has child objects that represent these request messages: context.proxyRequest and context.targetRequest . These objects let you access properties within the request flow that is in scope when your JavaScript code executes.

Note: You can also use the shorthand object request to access these properties in a request flow. The request object refers to either context.proxyRequest or context.targetRequest , depending on where in the flow your JavaScript code executes.

context.*Request child object properties

সম্পত্তির নাম বর্ণনা
url

The url property is a read/write convenience property that combines scheme, host, port, path and query parameters for the targetRequest.

The complete URL of the request is composed of the following properties:

  • protocol: The protocol of the URL (for example, HTTP, HTTPS)
  • port: The port (for example, :80, :443)
  • host: The host of the URL (for example, www.example.com)
  • path: The path of the URI (for example, /v1/mocktarget)

When getting url , a URL is returned in the following format:

protocol://host:port/path?queryParams

উদাহরণ:

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

HTTP request headers as a mapping of String => List

উদাহরণ:

For this HTTP request:

POST /v1/blogs HTTP/1.1
Host: api.example.com
Content-Type: application/json
Authorization: Bearer ylSkZIjbdWybfs4fUQe9BqP0LH5Z
The following JavaScript:
context.proxyRequest.headers['Content-Type'];
context.proxyRequest.headers['Authorization'];

will return the following values

application/json
Bearer ylSkZIjbdWybfs4fUQe9BqP0LH5Z
queryParams

The request message query parameters as a mapping of String => List .

উদাহরণ:

"?city=PaloAlto&city=NewYork"

can be accessed as:

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

The HTTP verb ( GET , POST , PUT , DELETE , PATCH , and so on) associated with the request

উদাহরণ:

For this request:

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

The following JavaScript:

context.proxyRequest.method;

will return the following value

POST
body

The message body (payload) of the HTTP request.

The request body has the following members:

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

উদাহরণ:

For an XML body:

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

To access the elements of the XML object as follows:

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

To access XML attributes attributes, use the @ notation.

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

For a JSON request body:

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

To read form parameters:

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

context.*Response child objects

For each HTTP transaction the executes in an API proxy, two response message objects are created: one inbound (the response from the backend service) and one outbound (the response sent back to the client.)

The context object has child objects that represent these response messages: context.proxyResponse and context.targetResponse . These objects let you access properties within the response flow that is in scope when your JavaScript code executes.

Note: You can also use the shorthand object response to access these properties from a response flow. The response object refers to either context.proxyResponse or context.targetResponse , depending on where in the flow your JavaScript code executes.

context.*Response object properties

সম্পত্তির নাম বর্ণনা
headers

The HTTP headers of the response message as a mapping of String => List .

উদাহরণ:

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

The status code with status message as a property. Both status code and status message are available as properties.

উদাহরণ:

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

The HTTP body (payload content) of the response message.

Response content has the following members:

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

Using .asXML notation

There is a handy way to walk through an XML document using the .asXML notation. This section describes how to use this notation, and how it differs from request.content and context.proxyRequest.content .

উদাহরণস্বরূপ:

request.content.asXML

অথবা

context.proxyRequest.content.asXML

Both the *.content and *.content.asXML forms can be used in a string context, and JavaScript will coerce them to become strings. In the former case ( *.content ), the string includes all declarations as well as XML comments. In the latter case ( *.content.asXML ), the string value of the result is cleaned of declarations and comments.

উদাহরণ

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>

Furthermore, you can use the .asXML form to traverse the XML hierarchy, by specifying the names of elements and attributes. It is not possible to traverse the hierarchy using the other syntax.

Debug with JavaScript print() statements

If you're using the JavaScript policy to execute custom JavaScript code, note that you can use the print() function to output debug information to the Trace tool . This function is available directly through the JavaScript object model. For example:

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

To see the output, select Output from all transactions at the bottom of the Trace window. You can also find output in the Trace property called stepExecution-stdout .

httpClient ব্যবহার করে জাভাস্ক্রিপ্ট কলআউট তৈরি করা

Use httpClient to make multiple, parallel, asynchronous HTTP requests to any URL from within custom JavaScript code executing in an API proxy flow. The httpClient object is exposed by the Apigee Edge Javascript object model .

About httpClient

The httpClient object is exposed to custom JavaScript code running on Apigee Edge through the JavaScript object model. To attach custom JavaScript to an API proxy, you use the JavaScript policy . When the policy runs, the custom JavaScript code executes.

The httpClient object is useful for developing composite services or mashups. For example, you can consolidate multiple backend calls into a single API method. This object is commonly used as an alternative to the ServiceCallout policy.

Here's a basic usage pattern. Instantiate a Request object, assign to it a URL (for example, to a backend service you wish to call), and call httpClient.send with that request object.

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

httpClient Reference

The HTTP Client exposes two methods: get() and send() .

httpClient.get()

A convenience method for simple HTTP GET requests, with no support for HTTP headers.

ব্যবহার

var exchangeObj = httpClient.get(url);

ফেরত

The method returns an exchange object. This object has no properties, and it exposes the following methods:

  • isError() : (boolean) Returns true if the httpClient was unable to connect to the server. HTTP status codes 4xx and 5xx result in isError() false , as the connection completed and a valid response code was returned. If isError() returns true , then a call to getResponse() returns the JavaScript undefined .
  • isSuccess() : (boolean) Returns true if the send was complete and successful.
  • isComplete() : (boolean) Returns true if the request is complete.
  • waitForComplete() : Pauses the thread until the request is complete (by success or error).
  • getResponse() : (object) Returns the response object if the httpClient.send() was complete and successful. The returned object has the identical methods and properties as the context.proxyResponse object. See context object summary .
  • getError() : (string) If the call to httpClient.send() resulted in an error, returns the error message as a string.

উদাহরণ

Send a fully configured Request object containing the properties of the HTTP request. Use a non-blocking callback to process the response.

// 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);

Using the JavaScript policy

Use the JavaScript policy to attach custom JavaScript code to a proxy flow. See JavaScript policy .

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

Apigee Community articles

You can find these related articles on the Apigee Community :