ویژگی تصویر

RESTful API چیست و چرا در PHP مهم است

  /  PHP   /  آموزش RESTful API در PHP
بنر تبلیغاتی الف
آموزش PHP

APIهای RESTful سبک، مقیاس‌پذیر و به‌راحتی قابل مصرف توسط کلاینت‌های مختلف (وب، موبایل، سرویس‌ها) هستند. در زبان PHP، ساخت RESTful API یکی از مهارت‌های پایه برای توسعه‌دهندگان وب محسوب می‌شود. این مقاله به صورت عملی و مرحله‌به‌مرحله نحوه طراحی، پیاده‌سازی و بهینه‌سازی یک RESTful API ساده با PHP را توضیح می‌دهد.

مبانی و اصول REST

  • منابع (Resources): هر چیزی که API ارائه می‌دهد (مثل users، products).
  • URLها: باید توصیفی و منطبق با منابع باشند (/api/users).
  • متدهای HTTP: GET برای خواندن، POST برای ایجاد، PUT/PATCH برای به‌روزرسانی، DELETE برای حذف.
  • وضعیت‌ها و خطاها: استفاده مناسب از HTTP status codes (200، 201، 400، 401، 404، 500).
  • بی‌حالت بودن: هر درخواست باید تمام اطلاعات لازم را داشته باشد (stateless).

ساختار پروژه پیشنهادی

  • public/index.php — نقطه ورود و روتینگ ساده
  • src/Database.php — اتصال به دیتابیس با PDO
  • src/Controllers/UserController.php — منطق CRUD
  • config/config.php — تنظیمات پایه

نمونه روتینگ ساده و نقطه ورود

getUser($id);
            else $controller->getUsers();
            break;
        case 'POST':
            $controller->createUser();
            break;
        case 'PUT':
        case 'PATCH':
            $controller->updateUser($id);
            break;
        case 'DELETE':
            $controller->deleteUser($id);
            break;
        default:
            http_response_code(405);
            echo json_encode(['error' => 'Method Not Allowed']);
    }
} else {
    http_response_code(404);
    echo json_encode(['error' => 'Not Found']);
}
?>

توضیح: این فایل نقش روتینگ بسیار ساده را دارد؛ مسیرهای /api/users و /api/users/{id} را تشخیص می‌دهد و بر اساس متد HTTP کدام تابع کنترلر را فراخوانی کند. در پروژه‌های واقعی بهتر است از فریم‌ورک‌های مینی‌روتر یا مسیرساز پیشرفته استفاده کنید.

دیتابیس و دسترسی ایمن با PDO

 PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
        ];
        $this->pdo = new PDO($dsn, $user, $pass, $options);
    }

    public static function getInstance() {
        if (!self::$instance) self::$instance = new Database();
        return self::$instance->pdo;
    }
}
?>

توضیح: این کلاس یک Singleton برای اتصال PDO فراهم می‌کند و تنظیمات خطا و حالت fetch امن را تعیین می‌کند. استفاده از prepared statements در کنترلرها، از حملات SQL Injection جلوگیری می‌کند.

نمونه کنترلر: CRUD برای کاربران

db = Database::getInstance();
    }

    public function getUsers() {
        $stmt = $this->db->query('SELECT id, name, email FROM users');
        $users = $stmt->fetchAll();
        echo json_encode($users);
    }

    public function getUser($id) {
        $stmt = $this->db->prepare('SELECT id, name, email FROM users WHERE id = ?');
        $stmt->execute([$id]);
        $user = $stmt->fetch();
        if ($user) echo json_encode($user);
        else { http_response_code(404); echo json_encode(['error' => 'User not found']); }
    }

    public function createUser() {
        $data = json_decode(file_get_contents('php://input'), true);
        if (empty($data['name']) || empty($data['email'])) {
            http_response_code(400);
            echo json_encode(['error' => 'Invalid input']);
            return;
        }
        $stmt = $this->db->prepare('INSERT INTO users (name, email) VALUES (?, ?)');
        $stmt->execute([$data['name'], $data['email']]);
        http_response_code(201);
        echo json_encode(['id' => $this->db->lastInsertId()]);
    }

    public function updateUser($id) {
        $data = json_decode(file_get_contents('php://input'), true);
        $stmt = $this->db->prepare('UPDATE users SET name = ?, email = ? WHERE id = ?');
        $stmt->execute([$data['name'] ?? null, $data['email'] ?? null, $id]);
        echo json_encode(['updated' => $stmt->rowCount()]);
    }

    public function deleteUser($id) {
        $stmt = $this->db->prepare('DELETE FROM users WHERE id = ?');
        $stmt->execute([$id]);
        echo json_encode(['deleted' => $stmt->rowCount()]);
    }
}
?>

توضیح: کنترلر بالا عملیات پایه CRUD را با استفاده از prepared statements انجام می‌دهد. دریافت ورودی از php://input و decode کردن JSON، الگوی استاندارد برای APIهای RESTful است. در عمل لازم است اعتبارسنجی ورودی‌ها و مدیریت خطاها تقویت شود.

بهینه‌سازی، امنیت و بهترین شیوه‌ها

  • استفاده از HTTPS برای رمزنگاری ترافیک.
  • احراز هویت: توکن‌محور (مثلاً JWT) یا OAuth برای کنترل دسترسی.
  • Rate limiting و throttling برای جلوگیری از سوءاستفاده.
  • اعتبارسنجی و نرمال‌سازی ورودی‌ها قبل از ذخیره در DB.
  • تنظیم صحیح هِدرهای CORS و Content-Type: application/json.
  • لاگ‌برداری و مانیتورینگ درخواست‌ها و خطاها.

نمونه وضعیت‌های HTTP — مرجع سریع

کدمعنی
200OK — درخواست موفق
201Created — منبع جدید ساخته شد
400Bad Request — ورودی نامعتبر
401Unauthorized — احراز هویت لازم
404Not Found — منبع موجود نیست
405Method Not Allowed — متد پشتیبانی نمی‌شود
500Internal Server Error — خطای سمت سرور

نتیجه‌گیری و راهکارهای پیشرفته

پیاده‌سازی یک RESTful API در PHP از پایه ساده است اما رسیدن به سطح تولیدی نیازمند توجه به امنیت، مانیتورینگ و طراحی صحیح است. برای پروژه‌های بزرگ‌تر از فریم‌ورک‌هایی مانند Laravel یا Slim استفاده کنید که روتینگ، میدلورها، احراز هویت و تست‌پذیری را ساده‌تر می‌کنند. همچنین مستندسازی API با ابزارهایی مثل OpenAPI/Swagger و تست با Postman و automated tests را فراموش نکنید.

با رعایت اصول REST، استفاده از PDO، مدیریت هدرها و وضعیت‌ها و اضافه کردن احراز هویت و rate limiting می‌توانید APIهایی ایمن و مقیاس‌پذیر با PHP بسازید.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: