ডিজাইনিং রেস্ট এপিআই [১] : ডিফাইন রিসোর্স স্টাইল

in ডিজাইনিং রেস্ট এপিআই,

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

রিসোর্স কি?

রেস্টফুল এপিআই এর মুল ভিত্তি হল রিসোর্স ।  যে কোন তথ্য যেটাকে আমরা একটি নাম দিতে পারব সেটাই রিসোর্স। উদাহরন: বই,ডকুমেন্ট, ছবি, কোন সেবা,পরিমাপ, আচরন ইত্যাদি। রিসোর্স কে অবজেক্ট ওরিয়েন্টেড অবজেক্টের সাথে তুলনা করা যেতে পারে । ওওপি’র অবজেক্টের মত রেস্ট এর প্রতিটি রিসোর্সের কিছু ডাটা থাকবে, একটি রিসোর্সের সাথে অন্য রিসোর্সের রিলেশন থাকবে এবং এটাকে অপারেট করার জন্য একটি মেথড সেট থাকবে । পার্থক্য শুধু এতটুকু যে ওওপি তে অনেক মেথড থাকতে পারে আর রেস্ট এর মেথড সীমাবদ্ধ [GET,POST,PUT,DELETE] । একটি রিসোর্সের মধ্যে আবার অনেক চাইল্ড রিসোর্স থাকতে পারে । এক্ষেত্রে একে কালেকশন বলে এবং এতে শর্ত হচ্ছে একটি কালেকশনে কেবল একই টাইপের রিসোর্স থাকবে । রেস্ট এর রিসোর্স মডেলের একটি চিত্র দেয়া হল:

রেস্ট এপিআই রিসোর্স

কিভাবে রিসোর্স ডিফাইন করবেন ?

রিসোর্স নামকরনের ক্ষেত্রে মনে রাখতে হবে যে রিসোর্সকে অবশ্যই noun হতে হবে । এতে এপিআই কনজিউমার রা এটার উদ্দেশ্য এবং ব্যবহার সহজেই বুঝতে পারবে । উদাহরন :book, user, ticket, group

রিসোর্স এর নামে Verb ব্যবহার করা যাবে না:

/getAllUser
/addUser
/deleteUser

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

সিস্টমে নতুন বই যোগ করতে পারবেন
যে কোন বই এর বিস্তারিত তথ্য দেখতে পারবেন
যে কোন বই এর তথ্য হালনাগাদ বা আপডেট করতে পারবেন
যে কোন বই ডিলেট করতে পারবেন
সকল বই এর লিস্ট দেখতে পারবেন

তবে book রিসোর্সের মেথড ম্যাপিং হত:

POST /book - ডাটাবেজে একটি নতুন বই এর এন্ট্রি দিবেন
GET /books - বই এর একটা লিস্ট রিটার্ন করবে
GET /book/17 –একটা নির্দিষ্ট বই রিটার্ন করবে যার আইডি 17
PUT /book/17 –একটি বই এর তথ্য আপডেট করবেন যার আইডি 17
DELETE /book/121 – বইটি ডিলেট করে দিবেন
এই অপারেশনগুলো প্র্যাকটিস করতে এখানে ক্লিক  করে মাথা ঝালিয়ে আসুন ।

Books vs Book:

আমার উদাহরনে আমি একাধিক ডাটার জন্য Books আর একটি নির্দিষ্ট ডাটার জন্য Book ব্যবহার করেছি । মতভিন্নতার কারনে ধরে নেয়া হয় দুইটাই সঠিক তবে বেশিরভাগ কমিউনিটি noun এর বহুবচন [Books] ব্যবহারে উৎসাহিত করেন । এতে URL এর বৈচিত্রতা কমে আর এটি অনেক বেশি সামন্জস্যপূর্ন লাগে । তাছাড়া রেস্ট এপিআই এর একটি প্রিন্সিপাল হল ডাইরেক্টরী ব্রাউজিং এর মত ইউআরএল । সে অনুযায়ী http://apikothon.com/dummy/browse/book/17 লোকেশনে যদি ১৭ নাম্বার বইটি থাকে তবে প্রশ্ন হল http://apikothon.com/dummy/browse/book এই লোকেশনে কি থাকবে?

  • ১) ঐ লোকেশনে পেজ খুজে পাওয়া যায়নি ইরর [404] রিটার্ন করবেন
  • ২) সকল বই এর লিস্ট রিটার্ন করবেন
  • ৩) রিসোর্সকে বহুবচনে লিখবেন /books/

আপনি যদি প্রথম অপশনটি বেছে নেন তবে আপনি অযথাই একটি লিংক বাড়াচ্ছেন। কনজিউমার কে মনে রাখতে হবে যে একটা নির্দিষ্ট বই এর জন্য /book আর সব বই এর জন্য /books লোকেশনে বা ফোল্ডারে রিকোয়েস্ট করতে হবে । দ্বিতীয় অপশনটি বেছে নিলে কিছু বলার থাকবে না, সেক্ষেত্র আপনি সিঙ্গুলার /book এর মধ্যে অনেকগুলো বই রাখছেন। তবে এ ক্ষেত্রে আপনার /books লোকেশনটি ব্যবহার করার দরকার নেই। তিন নাম্বার অপশনটি সবচেয়ে স্মার্ট পছন্দ হলেও রিসোর্স তৈরীর ক্ষেত্রে অনেকের মাঝে প্রশ্ন জাগে: /browse/books এ যখন আমি নতুন কোন বই যোগ করব তখন তো আমি মাত্র একটা বই যোগ করছেন তবে সেটার লিংক বহুবচন হবে কেন? উত্তর হল: /browse/books/x যেমন ঐ ফোল্ডারের অনেকগুলো বইয়ের মাঝে শুধু এক্স বইটি প্রকাশ করে তেমনি, আপনি যখন নতুন রিসোর্স তৈরী করছেন অর্থাৎ নতুন বই যোগ করছেন তখন ঐ ফোল্ডারেই যোগ করছেন। অনেকটা আপনার ফোনের /photos ফোল্ডারে আপনি আরেকটা ছবি যোগ করলেন ।

এক রিসোর্সের মাঝে আরকে রিসোর্স থাকলে?

ধরুন প্রতিটি বইয়ের জন্য কমেন্ট রয়েছে । এখানে কমেন্ট আরেকটি রিসোর্স, তাহলে সেগুলো কিভাবে হ্যান্ডল করতে পারি:

GET /books/21/comments – একুশ নাম্বার বইয়ের কমেন্টগুলোর একটি লিস্ট রিটার্ন করবে ।
GET /books/21/comments/231 - ঐ বইয়ের দুইশ-একত্রিশ নাম্বার কমেন্ট রিটার্ন করবে ।
DELETE /books/21/comments/231 - ঐ বইয়ের দুইশ-একত্রিশ নাম্বার কমেন্ট ডিলেট করবে ।
GET /books/21/comments/231/likes -ঐ বইয়ের দুইশ-একত্রিশ নাম্বার কমেন্টে কতগুলো লাইক দেয়া হয়েছে তা রিটার্ন করবে ।

মনে রাখতে হবে, রিসোর্স কখনো / দিয়ে শেষ করা যাবে না। উদাহরন: http://apikothon.com/dummy/browse/book/17/ এই লিংক কোন রিসোর্স কে প্রকাশ করে না বরং এটি লোকেশন প্রকাশ করে অর্থাৎ আমি এখন একটা ফোল্ডারে আছি যে ফোল্ডারের নাম 17 এবং এই ফোল্ডারের ভিতরে কি আছে সেটা দেখতে চাচ্ছি।

snake_case vs camelCase:

ফিল্ড এর নামকরন নিয়ে অনেক দ্বিধা দন্দ থাকে । দুটো শব্দের মাধে কেউ আন্ডারস্কোর দিয়ে লিখতে পছন্দ করে আবার কেউ বড় হাতের অক্ষর দিয়ে । যদি এপিআই এর প্রেজেন্টেশনে আপনি JSON (JavaScript Object Notation)  ফরম্যাট ব্যবহার করে থাকেন তবে জাভাস্ক্রিপ্ট এর নেমিং কনভেনশন (camelCase) ব্যবহার করাই ভালো। কিন্তু একটি গভেষণায় [eye tracking study on camelCase and snake_case (PDF) ] দেখা গেছে রিডিং এর জন্য camelCase এর চেয়ে snake_case ২০% বেশি সহজ।

স্টেটলেস রিসোর্স

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

পরবর্তী পোস্ট   »  ডিজাইনিং রেস্ট এপিআই [২] : রিকোয়েস্ট এবং রেসপন্স


মুক্ত জ্ঞান ছড়িয়ে দিন সবার মাঝে!