RESTful API শুধু রুটের উপর নির্ভর করে না। মূল নীতিসমূহ ও বাস্তবায়ন:
| নীতি | ব্যাখ্যা ও এক্সপ্রেসে বাস্তবায়ন |
|---|---|
| Stateless (স্টেটলেস) | প্রতিটি রিকোয়েস্টে সব তথ্য থাকতে হবে। সার্ভার কোন ক্লায়েন্ট স্টেট সংরক্ষণ করবে না। Authentication-এ JWT ব্যবহার করুন। |
| Client-Server Separation | ফ্রন্টএন্ড (React/Vue) এবং ব্যাকএন্ড (Express API) স্বাধীনভাবে কাজ করে। ব্যাকএন্ড JSON এন্ডপয়েন্ট প্রদান করে, ফ্রন্টএন্ড তা ব্যবহার করে। |
| Resource-Based (রিসোর্স ভিত্তিক) | URL-এ সবকিছু noun (সত্তা) হিসাবে প্রকাশিত। উদাহরণ: /api/users সকল ইউজারের জন্য, /api/users/:id একটি নির্দিষ্ট ইউজারের জন্য। |
| Uniform Interface (সদৃশ ইন্টারফেস) | API ডিজাইন সবসময় একরকম হবে — স্ট্রাকচার, নামকরণ, রেসপন্স ফরম্যাট, স্ট্যাটাস কোড। |
| Cacheable (ক্যাশেবল) | রেসপন্স ক্যাশ করা যায় (HTTP Cache-Control) পারফরম্যান্স উন্নত করার জন্য। |
| Layered System (লেয়ার্ড সিস্টেম) | API প্রক্সি, গেটওয়ে বা লোড ব্যালান্সারের পিছনে থাকতে পারে ক্লায়েন্ট জানার প্রয়োজন নেই। |
| Code on Demand (ঐচ্ছিক) | রেয়ারলি ব্যবহৃত হয়। ক্লায়েন্টকে ডাইনামিক স্ক্রিপ্ট পাঠানোর সুযোগ দেয়। |
লেয়ার্ড আর্কিটেকচার উদাহরণ:
Client (React/Vue/Angular)
|
[Routes/Controllers]
|
[Services/Business Logic]
|
[Models / Database Layer]
- Routes: এন্ডপয়েন্ট নির্ধারণ।
- Controllers: রিকোয়েস্ট/রেসপন্স লজিক।
- Services: ব্যবসায়িক লজিক, হিসাব, বাইরের API কল।
- Models: ডাটাবেস ইন্টারফেস।
- Middleware: ভ্যালিডেশন, অটেনটিকেশন, লগিং, এরর হ্যান্ডলিং।
- Utils/Helpers: রিইউজেবল ফাংশন (যেমন হ্যাশিং, ফরম্যাটিং)।
Router দিয়ে গ্রুপ করা:
// routes/api.js
import express from 'express';
import userRoutes from './userRoutes.js';
import postRoutes from './postRoutes.js';
const router = express.Router();
router.use('/users', userRoutes);
router.use('/posts', postRoutes);
export default router;- API Versioning:
/api/v1/users,/api/v2/users - বড় প্রজেক্টে মডুলার রুট রক্ষণাবেক্ষণ সহজ করে।
// utils/asyncHandler.js
export const asyncHandler = fn => (req, res, next) => {
Promise.resolve(fn(req, res, next)).catch(next);
};// controllers/userController.js
import User from '../models/userModel.js';
import { asyncHandler } from '../utils/asyncHandler.js';
export const getUsers = asyncHandler(async (req, res) => {
const users = await User.find();
res.status(200).json(users);
});- প্রতিটি কন্ট্রোলারে
try/catchলিখতে হয় না।
export const getUsers = asyncHandler(async (req, res) => {
const page = Number(req.query.page) || 1;
const limit = Number(req.query.limit) || 10;
const keyword = req.query.keyword
? { name: { $regex: req.query.keyword, $options: 'i' } }
: {};
const users = await User.find({ ...keyword })
.limit(limit)
.skip(limit * (page - 1));
const count = await User.countDocuments({ ...keyword });
res.json({ users, page, pages: Math.ceil(count / limit) });
});উপকারিতা:
- ফ্রন্টএন্ডে পেজ ডিসপ্লে করা যায়।
- বড় ডাটাসেট সার্ভারকে ওভারলোড করে না।
- কোয়েরি প্যারামিটার দিয়ে সার্চ/ফিল্টার করা যায়।
// middleware/errorMiddleware.js
export const notFound = (req, res, next) => {
const error = new Error(`Not Found - ${req.originalUrl}`);
res.status(404);
next(error);
};
export const errorHandler = (err, req, res, next) => {
const statusCode = res.statusCode === 200 ? 500 : res.statusCode;
res.status(statusCode).json({
message: err.message,
stack: process.env.NODE_ENV === 'production' ? null : err.stack,
});
};- সব এরর কনসিসটেন্ট থাকে।
- রক্ষণাবেক্ষণ সহজ।
JWT প্যাটার্ন:
import jwt from 'jsonwebtoken';
export const generateToken = (id) => {
return jwt.sign({ id }, process.env.JWT_SECRET, { expiresIn: '30d' });
};Protect Routes:
import jwt from 'jsonwebtoken';
import User from '../models/userModel.js';
export const protect = async (req, res, next) => {
let token;
if (req.headers.authorization?.startsWith('Bearer')) {
token = req.headers.authorization.split(' ')[1];
try {
const decoded = jwt.verify(token, process.env.JWT_SECRET);
req.user = await User.findById(decoded.id).select('-password');
next();
} catch (err) {
res.status(401).json({ message: 'Not authorized' });
}
}
if (!token) res.status(401).json({ message: 'No token' });
};- Role-based authorization:
req.user.roleচেক করুন।
- Response caching: Redis ব্যবহার করুন।
- Rate limiting:
express-rate-limitদিয়ে অব্যবহৃত রিকোয়েস্ট ব্লক করুন। - Compression:
compressionmiddleware ব্যবহার করুন। - Database Indexing: প্রায়ই কোয়েরি করা ফিল্ডে ইনডেক্স যোগ করুন।
- HTTP Headers:
helmetmiddleware ব্যবহার। - Input Validation:
express-validatorবাJoiব্যবহার করে SQL/NoSQL Injection প্রতিরোধ। - HTTPS: ট্রাফিক এনক্রিপশন।
- Authentication: JWT, OAuth2, API Keys।
- CORS: শুধু ট্রাস্টেড ডোমেইনের জন্য।
- Logging & Monitoring:
morgan,winston। প্রোডাকশনে পারফরম্যান্স মনিটরিং।
- Unit Testing Controllers:
Jestওsupertestব্যবহার করুন।
import request from 'supertest';
import app from '../server.js';
describe('GET /api/users', () => {
it('should return users', async () => {
const res = await request(app).get('/api/users');
expect(res.statusCode).toEqual(200);
expect(Array.isArray(res.body)).toBeTruthy();
});
});- Integration Testing: টেস্ট ডাটাবেস দিয়ে API পরীক্ষা।
- Postman/Insomnia: ম্যানুয়াল টেস্টিং ও কালেকশন তৈরির জন্য।
- E-commerce Backend: প্রোডাক্ট, ক্যাটাগরি, অর্ডার, পেমেন্ট।
- Social Network API: ইউজার, পোস্ট, লাইক, কমেন্ট, ফ্রেন্ড।
- Blog Platform: CRUD পোস্ট, অথর, ট্যাগ।
- Microservices: স্বতন্ত্র সার্ভিসের মধ্যে কমিউনিকেশন।
- Mobile Apps: React Native বা Flutter API ব্যবহার।
| নীতি | উদাহরণ |
|---|---|
| Use nouns, not verbs | /api/users ✅, /api/getUsers ❌ |
| Version your API | /api/v1/users |
| Proper HTTP status codes | 200 OK, 201 Created, 404 Not Found |
| Consistent JSON response | { success: true, data: {...} } |
| Secure endpoints | JWT auth, CORS, HTTPS |
| Paginate large results | /api/users?page=1&limit=10 |
| Centralized error handling | errorHandler middleware |
- API-কে microservices-এ ভাগ করুন: User Service, Product Service, Order Service।
- সার্ভিস কমিউনিকেশনের জন্য RESTful API বা gRPC ব্যবহার।
- API Gateway ব্যবহার করুন: রাউটিং, অটেনটিকেশন, লগিং।