রেস্ট এপিআই এর বেসিক প্রিন্সিপাল
রেস্ট এপিআই ডিজাইনিং এর জন্য প্রথমেই কিছু ডিজাইন প্রিন্সিপাল জেনে নেই। রেস্ট এপিআই ডেভেলপমেন্টের প্রধান যে চারটি প্রিন্সিপাল ডেভেলপারদের মনোযোগ আকর্ষণ করেছে তা হল:
- HTTP মেথড গুলোর স্পষ্ট ব্যবহার
- স্টেটলেস রিকোয়েস্ট
- ডাইরেক্টরী ব্রাউজিং এর মত ইউআরএল
- এক্সএমএল এবং জেসনে রেসপন্স।
(১) HTTP মেথড গুলোর স্পষ্ট ব্যবহার
REST এর প্রধান প্রিন্সিপাল হল ডাটা রিড, রাইট, আপডেট এবং ডিলেট অপারেশনগুলোর মধ্যে এটি one-to-one ম্যাপিং তৈরী করা । এই ম্যাপিংএ আমাদের অপারেশনগুলোকে চার ভাগে ভাগ করা হয়েছে ।
১) সার্ভারে কোন রিসোর্স তৈরী করার জন্য POST মেথড ব্যবহার করতে হবে
২) কোন রিসোর্স রিড করার জন্য GET মেথড
৩) রিসোর্স আপডেটের জন্য PUT মেথড
৪) আর রিসোর্স ডিলেট করার জন্য DELETE মেথড ব্যবহার করতে হবে।
এই মেথড [GET,POST,PUT, DELETE ] গুলোকে HTTPVerb বলে ।
(২) স্টেটলেস রিকোয়েস্ট :
রেস্ট এপিআই এর একটি প্রধান বৈশিষ্ট হল প্রতিটি রিকোয়েস্ট সতন্ত্র । HTTP হেডার এবং বডিতে একটি রিকোস্টের জন্য অথোরাইজেশন প্যারামিটার সহ প্রয়োজনীয় সকল ডাটা দিয়ে একটি রিকোয়েস্ট সম্পন্ন করতে হয় । সাধারনত এপিআই এক্সেসের জন্য একটি এপিআই কি বা টোকেন প্রোভাইড করা হয় যেটি কখনো মেয়াদউত্তীর্ন হয় না । ফলে কোন রিকোয়েস্ট সেশন বা কুকির উপর নির্ভর করে না ।
(৩) ডাইরেক্টরী ব্রাউজিং এর মত ইউআরএল :
ওয়েব সার্ভিসের লিংকগুলো সাধারনত এমন হয় :
http://example.com/getUser?id=735 GET /getUser?id=735 HTTP/1.1
আর রেস্ট এপিআইতে সেটা হবে :
http://example.com/user/735 GET user/735 HTTP/1.1
রেস্ট এপিআই এ URI বা লিংক গুলো অনেকটা ফোল্ডার এর লিংক এর মত হবে ।
/entertainment/movies/english/romantic/titanic/
উপরের ফোল্ডার স্ট্রাকচারটি দেখে যে কেউ সহজেই বলে দিতে পারবে যে /entertainment/movies/hindi/
এই ফোল্ডারে গেলে সকল হিন্দি একশন মুভি পাওয়া যাবে । তেমনি /entertainment/
এ গেলে হয়ত music video, comedy clips, audio music ইত্যাদি ফোল্ডার দেখতে পাবেন ।
কোন সিস্টেমের ব্যবহারকারীদের তথ্যগুলো যদি বিভিন্ন ফোল্ডারে সুন্দর করে গুছানো থাকত তাহলে সেটা কেমন হত ?
GET /user | সকল ইউজাররে একটি লিস্ট দেখাবে |
GET /user/12 | 12 তম ইউজাররে সকল তথ্য দেখাবে |
GET /user/12/profile | 12 তম ইউজাররে প্রোফাইলের তথ্য দেখাবে |
GET /user/12/contacts | 12 তম ইউজাররে কন্টাক্ট নাম্বার দেখাবে |
GET /user/12/albums/2014/birthday | 12 তম ইউজাররে ২০১৪ সালের বার্থডে এলবাম দেখাবে |
(৪) এক্সএমএল এবং জেসনে রেসপন্স:
এপিআই রিকোয়েস্টের আউটপুট হবে জেসন কিংবা এক্সএমল অথবা দুই ফরমেটেই । এপিআই যদি দুই ফরম্যাটেই ডাটা রিটার্ন করে তবে ব্যবহারকারী যেই ফরম্যাটে আউটপুট চান তা হেডার বা ডাটা প্যারামিটার হিসেবে দিয়ে রিকোয়েস্ট করতে হবে। রেসপন্স ফরম্যাট নিয়ে পরবর্তীতে আরো বিস্তারিত আলোচনা করা হবে ।
HATEOAS
উপরের চারটি প্রিন্সিপাল ছাড়াও রেস্ট এপিআই এর আরো কিছু বৈশিষ্ট আছে যেগুলোর মধ্যে সবচেয়ে বেশি গুরুত্বপূর্ন হল HATEOAS [Hypermedia as the Engine of Application State ] যিনি [Roy T. Fielding] প্রথম রেস্ট প্যারডিজম ডিজাইন করেন, তার মতে রেস্ট এপিআইকে অবশ্যই হাইপারটেক্সট ড্রিভেন হতে হবে [REST APIs must be hypertext-driven] ।
ক্লায়েন্ট এ্যাপ্লিকেশন সার্ভারের সাথে কিভাবে কমিউনিকেশন করবে তার একটি সুস্পষ্ট কন্সেপ্ট হল HATEOAS. এই তত্বের সারাংশ হল রুট এবং এন্টিটি লিংক ব্যতিত অন্যান্য রিকোয়েস্ট লিংক আপনাকে মনে রাখতে হবে না । সার্ভার নিজেই বলে দিবে কি জন্য, কোথায়, কিভাবে রিকোয়েস্ট করতে হবে । গিটহাব এপিআই পেজে গিয়ে লিংক গুলো একটি ভিজিট করে আসুন।
https://api.github.com/
ফেসবুকের বুকমার্ক এর একটা স্ক্রীনশট টা কে কল্পনা করলে তার লিংক গুলো যেমন হত:
{"profile":{"name":"Ikrum Hossain", "links":[{"rel":"profile", "href":"https://facebook.com/ikrum"},{"rel":"profile_image", "href":"https://fbcdn-profile-a.akamaihd.net/~~~~~9183672560427867185_n.jpg"}]},"bookmarks":{"links":[{"rel":"News Feed", "href":"https://www.facebook.com/?sk=nf"},{"rel":"My FV Pages", "href":"https://www.facebook.com/lists/3513635729195"},{"rel":"Events", "href":"https://www.facebook.com/events/upcoming?ref=46"},{"rel":"Messages", "href":"https://www.facebook.com/messages/"},{"rel":"Close Friends", "href":"https://www.facebook.com/lists/1786229927628"},{"rel":"Browse", "href":"https://www.facebook.com/games/?app_id=300909120010335"},{"rel":"Family", "href":"https://www.facebook.com/lists/1786731047621"}]}}
এবার একটি সম্পূর্ন উদাহরনের জন্য পেপাল এপিআই এর একটি রেসপন্স দেখা যাক । পেপাল এ পেমেন্ট রিকোয়েস্ট করলে নিচের মত রেসপন্স রিটার্ন করে
[{"href":"https://api.sandbox.paypal.com/v1/payments/payment/PAY-6RV70583SB702805EKEYSZ6Y","rel":"self","method":"GET"},{"href":"https://www.sandbox.paypal.com/webscr?cmd=_express-checkout&token=EC-60U79048BN7719609","rel":"approval_url","method":"REDIRECT"},{"href":"https://api.sandbox.paypal.com/v1/payments/payment/PAY-6RV70583SB702805EKEYSZ6Y/execute","rel":"execute","method":"POST"}]
উপরের রেসপন্স দেখে সহজেই বলে দেয়া যায় পরবর্তীতে কি করতে হবে । আপনি যে রিকোয়েস্টটি [rel:self]
করেছেন সেটার স্ট্যাটাস এবং বিস্তারিত তথ্যের জন্য প্রথম লিংক [href]
এ GET মেথডে রিকোয়েস্ট করতে হবে। অনুরুপ ভাবে পেমেন্ট প্রসেস এক্সিকিউট এবং শেষ পর্যায়ে কোথায় রিডাইরেক্ট করতে হবে তার লিংক দেয়া আছে । রিকোয়েস্টটি আরো খুটিনাটি জানতে পেপাল ডকুমেন্টেশনটি দেখুন ।
ফেসবুকে এ্যালবাম রিকোয়েস্ট করলে রেসপন্স এ প্রত্যেকটি এ্যালবাম এর নাম এবং বিভিন্ন তখ্যের সাখে ঐ এলবামের পাবলিক লিংক ও দেখতে পাবেন :
{"albums":{"data":[{"name":"MobileUploads","link":"https://www.facebook.com/album.php?fbid=xx&id=yy","cover_photo":"40000000000000004"},{"name":"TimelinePhotos","link":"https://www.facebook.com/album.php?fbid=xx&id=yy","cover_photo":"60000000000000006"},{"name":"ProfilePictures","link":"https://www.facebook.com/album.php?fbid=xx&id=yy","cover_photo":"70000000000000007"}]}}
HATEOAS কেন প্রয়োজন ?
একটি এপিআ্ই তে হাজারো লিংক থাকতে পারে যেগুলো আপনার সিস্টেমে হার্ডকোড ইন্টিগ্রেট করার প্রয়োজন পড়বে না । এপিআইতে ফিচার আপডেট জন্য যদি লিংক পরিবর্তন করা হয় তাহলে আপনি সেই খবর কবে আপনার চোখে পড়বে আর তার কতদিন পর আপনি আবার নিজের সিস্টেমে আপডেট আনবে? ঐ এপিআই আপডেট টা যদি সিকিউরিটি প্যাচ হয়ে থাকে তাহলে আপনি আপনার সিস্টেম আপডেট করার আগ পর্যন্ত ঐ বাগটি থেকে যাবে। আর যেসব সিস্টেমে পেপালের মত ডাইনামিক লিংক জেনারেট করে তাদের ক্ষেত্রে চিন্তা করুন, কিভাবে এসব লিংক হ্যান্ডেল করবে? এপিআই HATEOAS ভিত্তিক হলে পেজিনেশন লিংক, পরবর্তী পোস্ট লিংক, কিংবা যে কোন অপারেশনের লিংক এবং মেথড নিয়ে আপনাকে মনে রাথতে হবে আর কোন লিংক পরিবর্তন হয়ে গেলেও আপনার চিন্তা নেই । আপনার সিস্টেম আপ-টু-ডেট থাকবে ।
সব জায়গায় একই (ফেসবুকের) কোড ব্যবহার করা হয়েছে। দয়া করে আপডেট করবেন।
আপনার কমেন্টের জন্য ধন্যবাদ । ফেসবুকের কোডটি আসলে একটি উদাহরন । শুধু মাত্র একটি ব্লক এর জন্য এপিআই রেসপন্স কেমন হতে পারে, সেটাই দেখানোর চেষ্টা করেছি। ঠিক কি আপডেট করার কথা বলছেন, সেটা যদি আরেকটু বুঝিয়ে বলতেন তবে আমার জন্য সহজ হত।
পেপালের রেস্পন্সের জায়গায় ফেসবুকের রেস্পন্স দেখাচ্ছেন ভুলে …
“পেপাল এ পেমেন্ট রিকোয়েস্ট করলে নিচের মত রেসপন্স রিটার্ন করে”-এর নিচে …
ধন্যবাদ আমার ভুলটি ধরিয়ে দেয়ার জন্য । পোস্ট এ জেসন কোড ঠিকই দেয়া ছিল। jsonviewer.js এ একটি বাগ এর কারনে সবগুলো জেসন পার্স না হয়ে একই জেসন বার বার পার্স করছিল। সমস্যাটি সমাধান করা হয়েছে।
Thanks for visiting apikothon.com