system-design-bangla

Principle of REST API

Client এবং Server পৃথক

REST Architecture এর প্রধান Principle হল Client এবং Server পৃথক থাকতে হবে। Client শুধু Request করবে এবং Server Response দিবে। User Interface এবং Data Storage পৃথক থাকবে।

Stateless

প্রতিটি Request self-contained হবে। Server কোনো Client Session Memory ধরে রাখবে না। Authentication, Authorization বা প্রয়োজনীয় Context প্রতিটি Request-এর সাথেই পাঠাতে হবে।

Uniform Interface

REST API এর সবচেয়ে গুরুত্বপূর্ণ Principle হল Uniform Interface। এর মানে হল, Client এবং Server এর মধ্যে communication এর জন্য একটি standard এবং consistent পদ্ধতি থাকতে হবে। Uniform Interface এর কয়েকটি মূল বিষয় হলঃ

Cacheable

Stateless হওয়ার পরেও আমরা Request এবং Response কে Cache করতে পারব।

REST Api মূলত ৫’টি প্রধান HTTP Methods দ্বারা স্টেট ট্রান্সফার নিশ্চিত করে থাকে।

GET

GET ম্যাথোড ব্যবহারের মাধ্যমে ক্লায়েন্ট কিছু স্পেসিফিক রির্সোস এর জন্য সার্ভারকে রিকুয়েস্ট করতে পারবে।

যেমন, ক্লায়েন্ট ইউজারদের লিস্ট এর জন্য রিকুয়েস্ট করতে পারে,

GET request

POST

POST Method মূলত Server-কে কোনো Request process করার জন্য ব্যবহৃত হয়। সবচেয়ে সাধারণ ব্যবহার হলো নতুন Resource তৈরি করা।

যেমন, ক্লায়েন্ট নতুন ইউজার তৈরি করতে সার্ভারকে POST রিকুয়েস্টের মাধ্যমে রিকুয়েস্ট করতে পারে,

POST request

PUT

PUT Method সাধারণত নির্দিষ্ট Resource সম্পূর্ণ replace বা update করার জন্য ব্যবহৃত হয়।

যেমন, ক্লায়েন্ট সার্ভারকে রিকুয়েস্ট করতে পারে কোন ইউজারের নাম পরিবর্তন করতে,

PUT request

PATCH

PATCH ম্যাথোড ব্যবহার করা হয় কোন স্পেসিফিক রিসোর্সের স্পেসিফিক ভ্যালু পরিবর্তন করতে।

যেমন, ক্লায়েন্ট সার্ভারকে রিকুয়েস্ট করতে পারে কোন ইউজারের শুধু ইমেইল পরিবর্তন করতে,

PATCH request

DELETE

DELETE ম্যাথোড ব্যবহার করা হয় কোন স্পেসিফিক রিসোর্স ডিলিট করতে।

যেমন, ক্লায়েন্ট সার্ভারকে রিকুয়েস্ট করতে পারে কোন স্পেসিফিক ইউজার ডিলিট করতে যার নাম হবে John,

DELETE request

POST এবং PUT এর মধ্যে পার্থক্য

POST এবং PUT এর মধ্যে পার্থক্য হল, POST Method মূলত Server-কে কোনো Request process করার জন্য ব্যবহার করা হয়। সবচেয়ে সাধারণ ব্যবহার হলো নতুন Resource তৈরি করা, তবে POST শুধু Resource তৈরির মধ্যেই সীমাবদ্ধ নয়। Server-side processing প্রয়োজন এমন কাজেও POST ব্যবহার করা হয়। PUT হল idempotent মানে রিসোর্স যদি ইতিমধ্যে থাকে তাহলে সে আর নতুন রিসোর্স তৈরি করবে না।

PUT এবং PATCH এর মধ্যে পার্থক্য

PUT এবং PATCH এর মধ্যে পার্থক্য হল, PUT এর ক্ষেত্রে ক্লায়েন্ট একটি স্পেসিফিক ডাটার কিছু পরিবর্তন করতে চাইলে তাকে সেই ডাটার সম্পূর্ণ Attributes সার্ভারকে দিতে হবে এবং PATCH এর ক্ষেত্রে ক্লায়েন্ট সেই ডাটার যে Attribute পরিবর্তন হবে সেই Attribute টাই শুধু সার্ভারকে দিতে হবে।

অনেকে মনে করে থাকেন REST API মানে হচ্ছে GET/POST/PUT/DELETE। যা একটি ভুল ধারণা। এটি মূলত resource modeling + stateless design + uniform interface।

HTTP Headers

REST API তে Client এবং Server একে অপরের মধ্যে কিছু অতিরিক্ত তথ্য আদান-প্রধান করতে পারে তা করা হয় HTTP Headers ব্যবহার করে।

HTTP Headers কে ৪ category তে ভাগ করা হয়,

REST API best practices

router.get("/users", (req, res) => {
  res.status(200).json(users); // response format is JSON
});
--- recommended ---
'/users'
'/users/{id}'
'/products'

--- not recommended ---
'/get-users'
'/get-user'
'/fetch-products'

{api_endpoint}/posts?tags=react

? এর পরের অংশটুকু হল Query Parameters.

Rest API security best practices

Rest API performance best practices

Caching

Caching নিয়ে আমার লিখা পড়তে পারেন

CDN

Caching নিয়ে আমার লিখা পড়তে পারেন

Pagination

২ রকমের pagination techniques আমাদের কাছে আছে। Offset এবং Cursor। আমাদের requirements এর উপর ভিত্তি করে আমরা pagination technique ব্যবহার করব।

Data Compression

Data Compressed করলে আমরা API response এর size কমাতে পারবো।

Unnecessary property send to payload and response

Payload এবং Response এর মধ্যে অপ্রয়োজনীয় প্রপার্টি(object, array) পাঠাবো না।

HTTP Status Code

HTTP Status Code আমাদেরকে বলে দেয় একটি নির্দিষ্ট HTTP Method(GET, POST, PUT) এর রিকুয়েস্ট সাকসেসফুল হয়েছে কি না।

এটি ব্যবহার করা একটি উওম প্রাকটিস বলে গণ্য করা হয়।

HTTP Status Code কে পাঁচ শ্রেণিতে ভাগ করা হয়,

নিচে কিছু HTTP Status Code এর নির্দিষ্ট ব্যবহার বলা হল,

আরও জানতে এই লিংকে যেতে পারেন, https://developer.mozilla.org/en-US/docs/Web/HTTP/Status

REST API এবং GraphQL এর মধ্যে পার্থক্য

Idempotent API

Idempotent API বলতে বোঝায় - একটি নির্দিষ্ট API রিকোয়েস্ট একবার কল করলে সার্ভারে যে পরিবর্তন বা স্টেট ট্রান্সফার হয়, একই প্যারামিটার দিয়ে সেই রিকোয়েস্টটি বারবার (১০০ বারও) কল করলেও সার্ভারের স্টেটে ঠিক একই প্রভাব থাকবে, নতুন কোনো পরিবর্তন হবে না। অর্থাৎ, একাধিকবার একই রিকোয়েস্ট পাঠালেও চূড়ান্ত ফলাফল সবসময় একই থাকবে।

GET, PUT, DELETE, HEAD এবং OPTIONS idempotent। POST সাধারণত non-idempotent। PATCH idempotent হবে কি না, তা API-এর implementation-এর উপর নির্ভর করে।

আপনি যখন GET api ব্যবহার করে বার বার কিংবা api retry করে api call করবেন তখন আপনি নির্দিষ্ট রিসোর্স পাবেন, ডেটাবেসে কোনো নতুন রিসোর্স তৈরী হবে না। একই ভাবে PUT এবং DELETE এর ক্ষেত্রেও সমান, ঐখানে নতুন রিসোর্স তৈরী হবে না বরং নির্দিষ্ট রিসোর্স আপডেট এবং ডিলিট হবে। POST সাধারণত নতুন Resource তৈরি বা Server-side processing-এর জন্য ব্যবহৃত হয়। অন্যদিকে PATCH বিদ্যমান Resource-এর আংশিক (partial) পরিবর্তনের জন্য ব্যবহৃত হয়।

কেন এবং কিভাবে API কে Idempotent বানানো যায়?

ধরুন আপনি কোনো কিছুর জন্য Payment করছেন, আপনি Payment button click করার পর আপনার রিকোয়েস্ট সার্ভারে প্রসেস হচ্ছে এখন প্রসেস হওয়ার সময় আপনি কোনোভাবে আবার Payment button click করলেন। এখন সার্ভারের কাছে আপনার দুটি রিকোয়েস্ট আছে, সার্ভার আপনার দুটি payment request প্রসেস করবে। এতে করে আপনার payment একবার এর জায়গায় দুবার (payment) হয়ে গেলো।

এরকম আরো অনেক scenario আছে যেখানে API মানে POST API Idempotent না হওয়ার কারণে আপনার সিস্টেম এর End User এর ক্ষতি হতে পারে।

এই সমস্যার সমাধানের জন্য আমরা একটি পদ্ধতি মেনে চলতে পারি,

——– এতেই প্রথমবারের মত API request তার response পেয়ে যাবে ——-

বি:দ্র: অনেকের মনে প্রশ্ন আসতে পারে ইউনিক key কোথায় তৈরী করবো? সাধারণত security দিক থেকে চিন্তা করলে ইউনিক key সার্ভার থেকে তৈরী হয়ে আসা ভালো। ক্লায়েন্ট থেকে key তৈরী করলে security concern থেকে যায়।

গুরুত্বপূর্ণ প্রশ্নগুলো