ধাপ ২ - উচ্চ-স্তরের (high-level) ডিজাইন প্রস্তাব করা এবং সম্মতি নেওয়া
এই বিভাগে, আমরা API এন্ডপয়েন্ট, URL রিডাইরেক্টিং এবং URL শর্টনিং প্রবাহ নিয়ে আলোচনা করব।
API এন্ডপয়েন্ট (API Endpoints)
API এন্ডপয়েন্টগুলো ক্লায়েন্ট এবং সার্ভারের মধ্যে যোগাযোগ সহজতর করে। আমরা API গুলোকে REST-স্টাইলে ডিজাইন করব। যদি আপনি রেস্টফুল (restful) API সম্পর্কে অপরিচিত হন, তবে আপনি রেফারেন্স ম্যাটেরিয়াল [1]-এর মতো বাহ্যিক উপকরণগুলোর পরামর্শ নিতে পারেন। একটি URL শর্টনারের প্রাথমিকভাবে দুটি API এন্ডপয়েন্ট প্রয়োজন।
-
URL শর্টনিং (URL shortening): একটি নতুন শর্ট URL তৈরি করতে, ক্লায়েন্ট একটি POST রিকোয়েস্ট পাঠায়, যাতে একটি প্যারামিটার থাকে: অরিজিনাল বড় URL। API টি এমন দেখায়:
POST api/v1/data/shorten- রিকোয়েস্ট প্যারামিটার:
{longUrl: longURLString} - রিটার্ন: shortURL
- রিকোয়েস্ট প্যারামিটার:
-
URL রিডাইরেক্টিং (URL redirecting): একটি শর্ট URL কে সংশ্লিষ্ট বড় URL-এ রিডাইরেক্ট করতে, ক্লায়েন্ট একটি GET রিকোয়েস্ট পাঠায়। API টি এমন দেখায়:
GET api/v1/shortUrl- রিটার্ন: HTTP রিডাইরেকশনের জন্য longURL
URL রিডাইরেক্টিং (URL redirecting)
আপনি যখন ব্রাউজারে একটি tinyurl এন্টার করেন তখন কী ঘটে চিত্র ১ তা দেখায়। সার্ভার একবার একটি tinyurl রিকোয়েস্ট পেলে, এটি ৩০১ রিডাইরেক্ট সহ শর্ট URL টিকে বড় URL-এ পরিবর্তন করে।
[চিত্র ১-এর বর্ণনা: ছবিটি একটি নেটওয়ার্ক রিকোয়েস্ট রেসপন্স উপস্থাপন করে, বিশেষ করে একটি HTTP GET রিকোয়েস্ট এবং এর সংশ্লিষ্ট রেসপন্স হেডারগুলোর বিবরণ দেখায়। উপরের অংশটি রিকোয়েস্টের বিবরণ প্রদর্শন করে: URL (https://tinyurl.com/qtj5opu), মেথড (GET), একটি ৩০১ স্ট্যাটাস কোড (যা একটি রিডাইরেক্ট নির্দেশ করে), রিমোট সার্ভারের ঠিকানা ([2606:4700:10::6814:391e]:443), এবং রেফারার পলিসি (‘no-referrer-when-downgrade’)। নিচে, ‘Response Headers’ বিভাগটি সার্ভার দ্বারা পাঠানো বিভিন্ন হেডার তালিকাভুক্ত করে, যার মধ্যে রয়েছে alt-svc (বিকল্প সার্ভিস প্রোটোকল নির্দিষ্ট করে), cache-control (ক্যাশিং নির্দেশিকা সেট করে), cf-cache-status (Cloudflare থেকে একটি ডাইনামিক রেসপন্স নির্দেশ করে), cf-ray (একটি Cloudflare রিকোয়েস্ট আইডেন্টিফায়ার), content-type (UTF-8 এনকোডিং সহ HTML কন্টেন্ট নির্দিষ্ট করে), date (রেসপন্সের টাইমস্ট্যাম্প), expect-ct (সার্টিফিকেট ট্রান্সপারেন্সি সম্পর্কিত), এবং সবচেয়ে গুরুত্বপূর্ণভাবে, location (যাতে রিডাইরেক্ট URL রয়েছে: https://www.amazon.com/dp/B017V4NTFA?pLink=63eaef76-979c-4d&ref=adblp13nvvxx_0_2_im)। বিন্যাসটি রৈখিক, রিকোয়েস্টের বিবরণ উপরে এবং রেসপন্স হেডারগুলো নিচে, এবং প্রতিটি হেডার একটি কী-ভ্যালু পেয়ার হিসাবে উপস্থাপিত। তথ্যের প্রবাহ একমুখী, ক্লায়েন্ট থেকে রিকোয়েস্ট করে সার্ভার রিডাইরেক্ট লোকেশন সহ রেসপন্স প্রদান করে।]
চিত্র ১
ক্লায়েন্ট এবং সার্ভারের মধ্যে বিস্তারিত যোগাযোগ চিত্র ২-এ দেখানো হয়েছে।
[চিত্র ২-এর বর্ণনা: ছবিটি একটি সরলীকৃত URL রিডাইরেকশন সিস্টেম উপস্থাপন করে। একটি ‘ক্লায়েন্ট’ (একটি স্মার্টফোন আইকন দ্বারা উপস্থাপিত) একটি শর্ট URL ভিজিট করে প্রক্রিয়াটি শুরু করে: https://tinyurl.com/qtj5opu। এই রিকোয়েস্টটি একটি ‘tinyurl সার্ভার’-এ পাঠানো হয়, যা তারপর একটি ৩০১ স্ট্যাটাস কোড (যা একটি স্থায়ী রিডাইরেক্ট নির্দেশ করে) এবং বড় URL-এর ‘location’ সহ রেসপন্স করে: https://www.amazon.com/dp/B017V4NTFA?pLink=63eaef76-979c-4d&ref=adblp13nvvxx_0_2_im। ক্লায়েন্ট তারপর স্বয়ংক্রিয়ভাবে এই রিডাইরেক্ট অনুসরণ করে, বড় URL ভিজিট করতে ‘Amazon সার্ভার’-এ একটি নতুন রিকোয়েস্ট পাঠায়। ডায়াগ্রামটি ক্লায়েন্ট, tinyurl সার্ভার এবং Amazon সার্ভারের মধ্যে রিকোয়েস্ট এবং রেসপন্সের প্রবাহ দেখাতে তীর চিহ্ন ব্যবহার করে। টেক্সট লেবেলগুলো জড়িত URL গুলো এবং রিডাইরেক্টের HTTP স্ট্যাটাস কোড স্পষ্টভাবে নির্দেশ করে।]
চিত্র ২
এখানে আলোচনা করার মতো একটি বিষয় হলো ৩০১ রিডাইরেক্ট বনাম ৩০২ রিডাইরেক্ট।
- ৩০১ রিডাইরেক্ট (301 redirect): একটি ৩০১ রিডাইরেক্ট দেখায় যে অনুরোধ করা URL টি “স্থায়ীভাবে” (permanently) বড় URL-এ সরিয়ে নেওয়া হয়েছে। যেহেতু এটি স্থায়ীভাবে রিডাইরেক্ট করা হয়েছে, ব্রাউজার রেসপন্সটি ক্যাশ করে নেয়, এবং একই URL-এর পরবর্তী রিকোয়েস্টগুলো URL শর্টনিং সার্ভিসে পাঠানো হবে না। পরিবর্তে, রিকোয়েস্টগুলো সরাসরি বড় URL সার্ভারে রিডাইরেক্ট করা হয়।
- ৩০২ রিডাইরেক্ট (302 redirect): একটি ৩০২ রিডাইরেক্ট এর অর্থ হলো URL টি “অস্থায়ীভাবে” (temporarily) বড় URL-এ সরিয়ে নেওয়া হয়েছে, যার অর্থ হলো একই URL-এর পরবর্তী রিকোয়েস্টগুলো প্রথমে URL শর্টনিং সার্ভিসে পাঠানো হবে। তারপর, সেগুলো বড় URL সার্ভারে রিডাইরেক্ট করা হয়।
প্রতিটি রিডাইরেকশন পদ্ধতির নিজস্ব সুবিধা এবং অসুবিধা রয়েছে। যদি সার্ভারের লোড কমানো অগ্রাধিকার হয়, তবে ৩০১ রিডাইরেক্ট ব্যবহার করা যুক্তিযুক্ত কারণ একই URL-এর শুধুমাত্র প্রথম রিকোয়েস্টটি URL শর্টনিং সার্ভারে পাঠানো হয়। তবে, যদি অ্যানালিটিক্স গুরুত্বপূর্ণ হয়, তবে ৩০২ রিডাইরেক্ট একটি ভালো পছন্দ কারণ এটি ক্লিকের হার এবং ক্লিকের উৎস আরও সহজে ট্র্যাক করতে পারে।
URL রিডাইরেক্টিং বাস্তবায়ন করার সবচেয়ে সহজবোধ্য উপায় হলো হ্যাশ টেবিল ব্যবহার করা। ধরে নিচ্ছি হ্যাশ টেবিলে <shortURL, longURL> পেয়ার সংরক্ষিত আছে, URL রিডাইরেক্টিং নিম্নরূপে বাস্তবায়ন করা যেতে পারে:
- longURL পাওয়া যাক:
longURL = hashTable.get(shortURL) - একবার আপনি longURL পেয়ে গেলে, URL রিডাইরেক্ট সম্পাদন করুন।
URL শর্টনিং (URL shortening)
ধরে নেওয়া যাক শর্ট URL টি এমন দেখায়: www.tinyurl.com/{hashValue}। URL শর্টনিংয়ের ব্যবহারের ক্ষেত্র সমর্থন করতে, আমাদের অবশ্যই একটি হ্যাশ ফাংশন f(x) খুঁজে বের করতে হবে যা একটি বড় URL কে hashValue-তে ম্যাপ করে, যেমনটি চিত্র ৩-এ দেখানো হয়েছে।
[চিত্র ৩-এর বর্ণনা: ছবিটি একটি সরলীকৃত URL শর্টনিং সিস্টেম উপস্থাপন করে। ‘longURL’ লেবেলযুক্ত একটি আয়তক্ষেত্রাকার বাক্স যাতে ‘longURL’ টেক্সট রয়েছে মূল, দীর্ঘ URL নির্দেশ করে। এই বাক্স থেকে একটি তীর চিহ্ন গাণিতিক ফাংশন প্রতীক ‘ƒ(x)’ ধারণকারী একটি দ্বিতীয় আয়তক্ষেত্রাকার বাক্সের দিকে নির্দেশ করে, যা একটি হ্যাশিং ফাংশন নির্দেশ করে। এই ফাংশনটি ‘longURL’-কে ইনপুট হিসাবে নেয়। ‘ƒ(x)’ বাক্সের নিচে, ‘hash’ লেবেলযুক্ত একটি নিচের দিকে নির্দেশকারী তীর চিহ্ন এটিকে একটি তৃতীয় আয়তক্ষেত্রাকার বাক্সের সাথে সংযুক্ত করে, যা একটি শর্ট করা URL প্রদর্শন করে: ‘https://tinyurl.com/qtj5opu’। শর্ট করা URL বাক্সের নিচে ‘Viewer does not support full SVG’ টেক্সটটি উপস্থিত, যা সিস্টেমটির নয় বরং ছবি প্রদর্শনের একটি সীমাবদ্ধতা নির্দেশ করে। সামগ্রিক ডায়াগ্রামটি একটি দীর্ঘ URL ইনপুট নেওয়া, একটি ছোট হ্যাশ তৈরি করতে একটি হ্যাশিং ফাংশন (ƒ(x)) প্রয়োগ করা এবং তারপর একটি শর্ট করা, অ্যাক্সেসযোগ্য URL তৈরি করতে সেই হ্যাশ ব্যবহার করার প্রক্রিয়াটি চিত্রিত করে।] চিত্র ৩
হ্যাশ ফাংশনটিকে নিম্নলিখিত শর্তগুলো পূরণ করতে হবে:
- প্রতিটি longURL অবশ্যই একটি hashValue-তে হ্যাশ করতে হবে।
- প্রতিটি hashValue কে আবার longURL-এ ম্যাপ back করা যেতে হবে।
হ্যাশ ফাংশনের বিস্তারিত ডিজাইন ডিপ ডাইভে আলোচনা করা হয়েছে।