BACKEND ARCHITECTURE

REST API Design Principles

Definition: REST (Representational State Transfer) is a software architectural style that defines a set of constraints to be used for creating robust, predictable Web services.

API তো সবাই বানাতে পারে, কিন্তু একটি Industry Standard REST API ডিজাইন করতে পারে খুব কম ডেভেলপার। URL Naming Convention কেমন হওয়া উচিত এবং কোন HTTP Status Code কখন ব্যবহার করতে হয়— এগুলো একজন ফুল-স্ট্যাক ইঞ্জিনিয়ারের কোর আর্কিটেকচারাল নলেজ।

1. Resource-Oriented Routing

The "Verb" Trap (RPC vs REST)

ধরি, আমরা একটি ইউজার ম্যানেজমেন্ট সিস্টেম বানাচ্ছি। অনেক নতুন ডেভেলপার API এর URL এর ভেতরেই অ্যাকশন বা Verb (যেমন: get, create, delete) লিখে ফেলে। যেমন: /api/getUsers বা /api/deleteUser?id=5। একে বলা হয় RPC (Remote Procedure Call) স্টাইল, যা মেইনটেইন করা খুব কষ্টকর।

REST Solution: REST API এর মূল শর্ত হলো URL সবসময় Noun বা Resource (যেমন: /users) হবে। আপনি কী করতে চাচ্ছেন তা বোঝানোর দায়িত্ব URL এর নয়, বরং সেটি বোঝানোর দায়িত্ব হলো HTTP Methods (GET, POST, PUT, DELETE) এর।

Bad Practices (RPC Style)

  • /getAllUsers
  • /createUser
  • /deleteUser?id=5
  • /users/update/5

Standard Practices (REST)

  • GET /api/users
  • POST /api/users
  • DELETE /api/users/5
  • PUT /api/users/5

2. Express.js Clean Architecture

প্রফেশনাল ব্যাকএন্ডে Router এবং Controller কে আলাদা রাখা হয়। রাউটারের কাজ শুধু HTTP মেথড আর পাথ (Path) চেক করা, আর কন্ট্রোলারের কাজ হলো বিজনেস লজিক হ্যান্ডেল করা। নিচের কোডে দেখুন router.route() ব্যবহার করে আমরা কীভাবে ক্লিন কোড লিখতে পারি।

routes/userRoutes.js
const express = require('express');
const { getUsers, createUser, getUserById, updateUser } = require('../controllers/userController');
const { verifyAdmin } = require('../middlewares/auth');

const router = express.Router();

// Base Route: /api/users
router.route('/')
    .get(getUsers)             // GET /api/users
    .post(verifyAdmin, createUser); // POST /api/users (Protected)

// Dynamic ID Route: /api/users/:id
router.route('/:id')
    .get(getUserById)          // GET /api/users/123
    .patch(updateUser)         // PATCH /api/users/123
    .delete(verifyAdmin, deleteUser); 

module.exports = router;

3. REST Endpoint Visualizer

নিচের ড্রপডাউন থেকে একটি সিনারিও সিলেক্ট করুন। দেখুন একজন সিনিয়র ডেভেলপার একটি নির্দিষ্ট অ্যাকশনের জন্য ঠিক কোন HTTP Method, URL এবং Status Code ব্যবহার করে।