ডিজাইনিং রেস্ট এপিআই [২] : রিকোয়েস্ট এবং রেসপন্স
এপিআই ডেভেলপের ক্ষেত্রে আমাদের অবশ্যই মাথায় রাখতে হবে যেন এপিআই টি কনজিউমারদের কাছে অনেক ফ্লেক্সিবল হয়। বিভিন্ন প্লাটফর্মে রেস্ট এপিআইতে রিকোয়েস্ট করতে গিয়ে নতুনদের অনেক হিমশিম খেতে হয় । যারা কখনও PUT এবং DELETE ব্যবহার করেননি তারা হয়তো অনেকেই ভাবছেন এইচ.টি.এম.এল ফরম কিংবা প্রোগ্রামিং ল্যাংগুয়েজে যেভাবে GET, POST রিকোয়েস্ট করেন সেভাবে করলেই হয়ে যাবে।
<form method="DELETE" action="update.php"> .... </from>
না বিষয়টা মোটেই তেমন না । বেশিরভাগ ব্রাউজার, ফ্রেমওয়ার্ক,সার্ভিস এবং ফায়ারওয়াল GET, POST ছাড়া অন্যন্য মেথড যেমন HEAD, PUT, DELETE, OPTION, PATCH ইত্যাদি সাপোর্ট করে না । সেক্ষেত্রে এপিআই কনজিউমার-রা কি করবে?
রিকোয়েস্ট মেথড ওভাররাইড
POST মেথডের হেডারে একটি বাড়তি মেথড প্যারামিটার যোগে রিকোয়েস্ট করে মেথড ওভাররাইড করতে পারেন । বস পাবলিকরা যেভাবে কাস্টম হেডার প্রস্তাব করেন:
- X-HTTP-Method (Microsoft)
- X-HTTP-Method-Override (Google/GData)
- X-METHOD-OVERRIDE (IBM)
উল্ল্যেখ্য বেশিরভাগ এপিআই এবং ওয়েব সার্ভিস X-HTTP-Method-Override
ব্যবহার করে । আরো কিছু কমন ওভাররাইড হেডার সম্পর্কে জানতে উইকিপেডিয়া দেখুন । POSTMAN এক্সেটনশন ব্যবহার করে একটি PUT রিকোয়েস্ট এবং তার প্রিভিউ দেখা যাক:
PUT HTTP/1.1
Host: localhost
Cache-Control: no-cache
Content-Type: application/x-www-form-urlencoded
name=newName&address=newAddress
এখন কনজিউমার যেহেতু PUT করতে অক্ষম সেহেতু আমাদেরকে কিছু বিকল্প সামাধানের কথা চিন্তা করতে হবে। আমরা যদি সরাসরি এইচ.টি.এম থেকে রিকোয়েস্ট এর সুবিধা দিতে চাই তবে POST রিকোয়েস্ট এ একটি হিডেন ইনপুট যোগ করে দিলেই ঝামেলা শেষ। এক্ষেত্রে GET মেথড ব্যবহার করা মোটেই উচিত না কারন PUT এর ইনপুট, পার্সওয়ার্ড এর মত গুরুত্বপূর্ন ডাটা হতে পারে যেটা URL এ দেয়াটা বুদ্ধিমানের কাজ হবে না।
<from method="POST" action="http://localhost/api/book/55"> <input name="X-HTTP-Method-Override" type="hidden" value="PUT" /> <input name="description" type="text" /> .... </from>
সম্পূর্ন ব্যাপারটি হ্যান্ডেল করার জন্য একটি পি.এইচ.পি কোডটি খেয়াল করুন :
function getMethod(){ // Handling HTML method override if ( isset( $_POST['X-HTTP-Method-Override'] ) ) { return strtoupper( $_POST['X-HTTP-Method-Override'] ); } // Handling header override elseif ( isset( $_SERVER['HTTP_X_HTTP_METHOD_OVERRIDE'] ) ) { return strtoupper( $_SERVER['HTTP_X_HTTP_METHOD_OVERRIDE'] ); } //Handling Regular request else{ return $_SERVER['REQUEST_METHOD']; } }
আপনি যদি এপিআই ডেভেলপমেন্টের জন্য স্লিম ফ্রেমওয়ার্ক ব্যবহার করে থাকেন তবে জেনে রাখুন স্লিম এ X-HTTP-Method-Override
পাশাপাশি নিচের মত করেও রিকোয়েস্ট করতে পারেন ।
<input type="hidden" name="_METHOD" value="PUT"/>
তবে রিকোয়েস্ট হ্যান্ডেলিং নিয়ে স্লিম ডেভেলপারদের ভাবতে হবে না । রেস্টফুল সার্ভিস ডেভেলপমেন্টের জন্য স্লিম অনেj স্মার্ট এবং লাইট ওয়েট মাইক্রোফ্রেমওয়ার্ক ।
GET vs Post vs PUT ?
নতুনদের কাছে আরেকটা চ্যালেন্জ হল মেথড নির্নয় করা । এপিআই ডেভেলপের সময় কোন রিসোর্সে কোন মেথড এপ্লাই করবে তা নিয়ে অনেকেই দ্বিধা-দ্বন্দতায় ভুগে । লগিন এর জন্য কি GET ব্যবহার করব নাকি POST ? PUT আর POST এর মধ্যে পার্থক্য কি?
এরকম প্রশ্নে জাগলে নিজেদের কয়েকটা প্রশ্ন করেই আমরা এর উত্তর পেয়ে যাব ।
প্রশ্ন ১: লগিন করার জন্য কি আমাকে ডাটাবেজে কিছু এন্ট্রি করা লাগছে ?
SELECT * from Users WHERE username='ikrum'&'password=12345'
এখানে লগিন করার জন্য আমি শুধু ডাটাবেজ রিড করে দেখছি যে এই নাম এবং পাসওয়ার্ডে কোন রেকর্ড আছে কি না, থাকলে বলব লগিন সাক্সেস না হলে ফেইল । যেহেতু এই অপারেশনে আমরা নতুন কোন রিসোর্স তৈরী, আপডেট কিংবা ডিলেট করছি না সেহেতু এটা GET মেথড ।
এবার হয়তো অনেকেই টাস্কি খেয়ে বসে আছেন, লগিনের ডাটা GET মেথডে পাঠাবেন?
না ! আসলে রেস্ট এপিআই তে লগিন বলে কিছু নেই । হতাশ হওয়ার কিছু নেই এপিআই অথেনটিকেশন নিয়ে আমরা পরবর্তীতে আলোচনা করব । এখানে লগিন একটি উদাহরন মাত্র। আপনি কিভাবে নিজেকে প্রশ্ন করে বের করবেন যে রিকোয়েস্টটি কোন মেথডের হবে । তবে হ্যা অন ডিমান্ড আপনি চাইলে কিছুটা ব্যতিক্রম করতে পারেন, তবে সেটা করতে নিরুৎসাহিত করা হয়।
প্রশ্ন ২: প্রতিবার রিকোয়েস্টে কি কোন নতুন রিসোর্স [লিংক] তৈরী হচ্ছে ?
রিসোর্স তৈরীর কিংবা আপডেটের জন্য PUT ব্যবহার করা যায়। তবে PUT এর ব্যবহার হয় যখন আপনার একটি রিসোর্স লিংক আছে । আর POST ব্যবহার করা হয় কালেকশনে নতুন রিসোর্স তৈরী করার জন্য তথা রিসোর্স লিংক পাওয়ার জন্য।
রেজিস্ট্রেশন করার জন্য ব্যবহারকারী তথ্য, ডাটাবেজে একটি রো তে যোগ করতে হচ্ছে এবং এটি একটি ইউনিক আইডি তৈরী করছে এবং সেই আইডি দিয়ে উক্ত ব্যবহারকারীকে এক্সেস করতে পারছি । অর্থাৎ আমাদের একটি রিসোর্স তৈরী করতে হচ্ছে, তাহলে POST মেথড ।
POST /users HTTP/1.1 ..... name=user_full_name&info=other_info
রেজিস্ট্রেশন সফল হওয়ার পর এখন ঐ ব্যবহারকারীর একটি ইউনিক আইডি পেলাম । এখন আমি ঐ ব্যবহারকারীর তথ্য রিড করতে চাইলে আমাকে GET রিকোয়েস্ট করতে হবে। যদি আইডি 87 হয় তাহলে:
GET /users/87 HTTP/1.1
যেহেতু আমার কাছে রিসোর্স এর লিংক আছে সেহেতু এখন আমি ঐ রিসোস আপডেট করতে পারব । আর সেটা করব PUT এর মাধ্যমে।
PUT /users/87 HTTP/1.1 ...... info=new_info
আপনি যদি ১০০ বার PUT রিকোয়েস্ট করেন তবে কালেকশনের স্টেট এর কোন পরিবর্তন হবে না, শুধু নির্দিষ্ট রিসোর্স পরিবর্তন হচ্ছে । আর POST এর ক্ষেত্রে কালেকশনে ১০০টি নতুন রিসোর্স তৈরী হবে।
প্রশ্ন ৩: নতুন লাইক যোগ করতে POST নাকি PUT
কারো স্ট্যাটসে আমি যদি নতুন একটা কমেন্ট করি তবে সেটা comments টেবিলে নতুন একটা রেকর্ড যোগ করবে এবং এই কমেন্টটিরও একটা ইউনিক আইডি থাকবে । সুতরাং এটা POST মেথড । এখন কমেন্টে যখন প্রথম লাইক এড করব তখন তো POST ই হবে ! আপনার মনে যদি একটুও সন্দেহ না লাগে তবে আরেকটু মনোযোগ দিয়ে দেখুন লাইকের জন্য আমি কি নতুন কোন রেকড যোগ করছি ?
status_id | comment_id | comment | likes |
21 | 231 | Mathoscope is the best book I have ever seen #mathmatics! |
এখন কদম আলীর রেস্ট এপিআই এর মত করে যদি 231 নাম্বার কমেন্টের স্টেট জানতে চাই তবে এপিআই উত্তর দিবে: বইএর আইডি এত, কমেন্ট আইডি এত, কমেন্ট হল কখগ…অ অা, লাইক সংখ্যা শুন্য [যেহেতু কোন লাইক নেই ]
GET /users/87/status/comments/231 HTTP/1.1
খেয়াল করুন কমেন্ট করার সাথে সাথে আমরা নতুন একটি লিংক পাচ্ছি তাকে এক্সেস করার জন্য ।
প্রশ্ন ৪: আমি যদি লাইকের জন্য একটি লিংক দেই?
GET /users/87/status/comments/231/likes HTTP/1.1
যেহেতু এটি রিসোর্স না বরং রিসোর্সের একটি ফিল্ড সেহেতু এটা এভাবে এক্সেস করা যাবে না । এটাকে কোয়েরী প্যারামিটার হিসেবে এক্সেস করতে পারেন। পুনরায় নিচের উদাহরনগুলো বোঝার চেষ্টা করি:
GET /users/87/status/comments?fields=likes HTTP/1.1
http://graph.facebook.com/youtube
http://graph.facebook.com/youtube?fields=name,id,likes
এবার স্ট্যাটসে একটি লাইক যোগ করলাম !
status_id | comment_id | comment | likes |
21 | 231 | Mathoscope is the best book I have ever seen #mathmatics! | 1 |
আরেকটা লাইক দিলাম !
status_id | comment_id | comment | likes |
21 | 231 | Mathoscope is the best book I have ever seen #mathmatics! | 2 |
আমি যেহেতু রেকর্ড আপডেট করছি সেহেতু PUT মেথড ।
রেজাল্ট ফিল্টারিং এবং সার্চিং
রেজাল্ট ফিল্টারিং এর প্যারামিটারগুলো কোয়েরী প্যারামিটার হিসেবে যোগ করে দিতে হবে । যদি কোয়েরী প্যারামিটার ব্যবহার না করে পুরোটা URI তে রাখি তাহলে কেমন হবে ?
Query Parameter: http://graph.facebook.com/youtube?fields=name,id,likes URI: http://graph.facebook.com/youtube?fields/name/id/likes
ফিল্টারিং প্যারামিটারগুলো URI হিসেবে রাখলে প্রত্যেকটি ফিল্ড আলাদা আলাদি রিসোর্স হিসেবে গন্য হবে । আর কোনটা আগে দিবেন, কোনটা পরে দিবেন, কিংবা শুধু মাত্র একটা প্যারামিটার দিবেন, এসব কিভাবে হ্যান্ডেল করবে সেটা নিয়ে অনেক ঝামেলায় পড়বেন । বড় কথা তাহলে আপনার আর রেস্ট ফলো করা হল না । এখন কোয়েরী প্যারমিটারও বিভিন্ন ভাবে প্রোভাইড করা যায় যেমন:
/cars?color=blue&doors=4&type=sedan /cars?color=blue;type=sedan /cars?color=black,blue,red;doors=3,5;type=sedan
প্যারমিটার আলাদা করার জন্য আপনি এন্ড সেমিকোলন কিংবা কমা ব্যবহার করতে পারেন তাতে কোন অসুবিধা নেই । তবে কোন ভাবেই আপনার Base URL এর প্যাটার্ন এর মত কোয়েরী প্যারামিটার ব্যবহার করতে পারবেন না । একটি সঠিক এবং সর্ম্পূর্ন উদাহরন দেখি:
Base URL : http://host.com/books Query : ?author=jhon&type=fiction&orderby=rating Full: http://host.com/books?author=jhon&type=fiction&orderby=rating
অনুরুপ ভাবে সার্চিং এর জন্য কিওয়ার্ডটি আরেকটি প্যারামিটার আকারে নিতে পারি ।
http://host.com/books?query=REST Api
এপিআইকে আরেকটু সুন্দর ভাবে ব্যবহারকারীর কাছে তুলে ধরার জন্য সবচেয়ে কমন কুয়েরি গুলোকে আরকেটি রেস্ট লিংক দিয়ে প্রকাশ করতে পারি ।
http://host.com/books/best_seller http://host.com/books/top_ten http://host.com/books/recenty_popular
জেসন রেসপন্স
XML ডকুমেন্ট একপলক দেখেই ডকুমেন্ট বিষয়গুলো বুঝা যায় না, তাছাড়া অনেক প্রোগ্রামিং ল্যাঙ্গুয়েজেই XML পার্স এবং এটা নিয়ে কাজ করতে অনেক ঝামেলা পোহাতে হয় । সময় হয়েছে XML কে বিদায় জানানোর। গুগল ট্রেন্ডস চার্ট দেখে আপনিই বলুন XML এর ভবিষ্যৎ কি ?
Google Trends chart XML API vs JSON API , XML vs JSON
বর্তমান সিস্টেমের জন্য সবাই এখন JSON ফরমেটের কথাই চিন্তা করে ।এক্সএমএল এর তুলনায় জেসন ফরম্যাট অনেক লাইটওয়েট, ফাস্ট এবং পড়তে সুবিধা । শুধু তাই নয়, প্রোগ্রামিং ল্যাঙ্গুয়েজগুলোতে এক্সএমএল পার্সিং এর চেয়ে জেসন পার্সিং সহজ । যেহেতু অনেক বড় বড় সিস্টেম এখনও XML চলছে যেগুলোর মধ্যে এখন কোন পরিবর্তন করতে চায় না সেগুলোর জন্য অনেকেই JSON এর পাশাপাশি XML ও ব্যবহার করে থাকে । আপনি চাইলেই আপনার এপিআই এর জন্য দুইটাই রাখতে পারেন তবে JSON ব্যাধ্যতামুলক হওয়া চাই ।
bhaia, ekdom upore jei example ta likhsen seita run korte hoy kibhabe, aar form tar action ki hobe? form ta ki same page e submit hobe..?