🌐 درس هشتم: API نویسی حرفهای (RESTful)؛ ساخت سرویسهای وب مدرن و امن
🎯 هدف این درس: آشنایی با اصول طراحی APIهای RESTful، پیادهسازی احراز هویت با JWT (JSON Web Token)، مدیریت Rate Limiting برای جلوگیری از سوءاستفاده و مستندسازی استاندارد با Swagger.
مهمان عزیز! 👋
تا اینجا یاد گرفتی چطور دادهها را در دیتابیس ذخیره کنی و آنها را در صفحات HTML نمایش دهی. اما در دنیای مدرن، وبسایتها جزایر جداگانه نیستند؛ آنها باید با اپلیکیشنهای موبایل، سایتهای دیگر و سرویسهای خارجی ارتباط برقرار کنند.
زبان مشترک این ارتباط API است. اما هر APIای خوب نیست. یک API حرفهای باید استاندارد (RESTful)، امن (با توکنهای JWT) و پایدار (با محدودیت درخواست) باشد. در این درس تمام این موارد را پوشش میدهیم.
💡 چرا REST و JWT؟
۱. REST: استانداردی که باعث میشود API شما برای همه توسعهدهندگان قابل فهم و پیشبینی باشد.
۲. JWT: روشی Stateless (بدون وضعیت) برای احراز هویت که برای اپلیکیشنهای موبایل و SPAها عالی است و بار سرور را کاهش میدهد.
1️⃣ اصول اولیه RESTful
در معماری REST، ما از متدهای HTTP برای انجام عملیات روی منابع (Resources) استفاده میکنیم. به جای اینکه آدرسهای عجیب و غریب بسازیم، از ساختار استاندارد استفاده میکنیم.
| متد HTTP | کاربرد | مثال URL |
|---|---|---|
GET |
دریافت اطلاعات | /api/users |
POST |
ایجاد منبع جدید | /api/users |
PUT |
بروزرسانی کامل | /api/users/1 |
DELETE |
حذف منبع | /api/users/1 |
2️⃣ ساختار پاسخ استاندارد JSON
یک API حرفهای نباید فقط داده خام بفرستد. باید وضعیت (Status Code)، پیام و داده را در یک ساختار منظم برگرداند.
ApiResponse.php
PHP
8.x
<?php
function sendResponse($data, $message = '', $status = 200) {
header('Content-Type: application/json');
http_response_code($status);
$response = [
'success' => $status >= 200 && $status < 300,
'message' => $message,
'data' => $data
];
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}
3️⃣ احراز هویت با JWT (JSON Web Token)
به جای Session، از توکنهای JWT استفاده میکنیم. وقتی کاربر لاگین میکند، یک توکن امضا شده دریافت میکند و برای درخواستهای بعدی آن را در Header ارسال میکند.
JwtAuth.php
PHP
8.x
<?php
// نکته: در پروژه واقعی از کتابخانه firebase/php-jwt استفاده کنید
class JwtAuth {
private $secretKey = 'YOUR_SUPER_SECRET_KEY';
public function generateToken($userId) {
$payload = [
'iss' => 'rajestary.com',
'iat' => time(),
'exp' => time() + 3600, // انقضا پس از ۱ ساعت
'userId' => $userId
];
// شبیهسازی امضای توکن (Base64Url Encode)
return base64_encode(json_encode($payload));
}
public function verifyToken($token) {
$decoded = json_decode(base64_decode($token), true);
if ($decoded['exp'] < time()) {
return false; // توکن منقضی شده
}
return $decoded;
}
}
4️⃣ مدیریت Rate Limiting (محدودیت نرخ درخواست)
برای جلوگیری از حملات Brute Force یا فشار بیش از حد به سرور، تعداد درخواستهای هر IP را محدود میکنیم.
RateLimiter.php
PHP
8.x
<?php
function checkRateLimit($ip, $limit = 60, $period = 3600) {
$key = "rate_limit:$ip";
// در محیط واقعی از Redis استفاده کنید
$currentCount = apcu_fetch($key) ?: 0;
if ($currentCount >= $limit) {
sendResponse(null, 'تعداد درخواستهای شما بیش از حد مجاز است.', 429);
}
apcu_store($key, $currentCount + 1, $period);
}
❌ خطاهای رایج در API نویسی
🚫 اشتباه مرگبار:
نمایش خطاهای دقیق دیتابیس یا Stack Trace به کاربر نهایی. همیشه خطاها را لاگ کنید و به کاربر یک پیام عمومی و کد خطای استاندارد (مثل 500) برگردانید.
- عدم اعتبارسنجی ورودیها: هرگز به دادههای ارسالی از سمت کلاینت اعتماد نکن.
- استفاده از GET برای تغییر داده: عملیات حذف یا ویرایش باید حتماً با POST, PUT یا DELETE انجام شود.
- نادیده گرفتن CORS: اگر API قرار است توسط دامنه دیگری صدا زده شود، هدرهای CORS را به درستی تنظیم کنید.
🏁 جمعبندی درس هشتم
مهمان عزیز، در این درس یاد گرفتی:
- ✅ اصول طراحی RESTful و متدهای HTTP.
- ✅ نحوه ساخت پاسخهای استاندارد JSON.
- ✅ مکانیزم احراز هویت با JWT.
- ✅ اهمیت Rate Limiting برای امنیت و پایداری.
🎓 تمرین عملی درس هشتم
یک endpoint ساده برای “دریافت لیست محصولات” بساز که فقط در صورت وجود توکن معتبر در Header، دادهها را برگرداند و در غیر این صورت خطای 401 بدهد.
🗺️ نقشه راه دوره: شما اینجا هستید!
برای اینکه بدانی دقیقاً کجای مسیر هستی و چه درسهایی در انتظار توست، به جدول زیر نگاه کن. درس فعلی با رنگ متفاوت مشخص شده است.
| درس | عنوان درس | آنچه یاد میگیرید |
|---|---|---|
| ۱ | اصول SOLID در PHP | تکمسئولیتی، باز/بسته، جایگزینی لیسکوف، جداسازی رابط، وارونگی وابستگی |
| ۲ | الگوهای طراحی (Design Patterns) | Singleton, Factory, Strategy, Observer, MVC پیشرفته |
| ۳ | برنامهنویسی تابعی در PHP | توابع ناشناس (Closures)، Arrow Functions، Map/Filter/Reduce |
| ۴ | مدیریت وابستگی با Composer | نصب پکیجها، مدیریت نسخهها، Autoloading (PSR-4) |
| ۵ | تستنویسی حرفهای (TDD) | آشنایی با PHPUnit، نوشتن Unit Test، Mocking |
| ۶ | کار با Redis و Caching | کش کردن دادهها، Session Handler با Redis |
| ۷ | پردازشهای پسزمینه (Queue & Jobs) | استفاده از صفها برای ایمیلزنی یا پردازش سنگین |
| ۸ | API نویسی حرفهای (RESTful) | استانداردهای REST، احراز هویت با JWT، Rate Limiting |
| ۹ | امنیت سایبری پیشرفته | تحلیل حملات پیچیده، Secure Headers، CSP |
| ۱۰ | پروژه نهایی پیشرفته | ساخت یک CMS ماژولار با قابلیت نصب پلاگین و تم |



