ساخت RESTful API با استفاده از PHP PDO و MySQL

0 79
۵/۵ - (۴ امتیاز)

فهرست

امروزه در اکثر برنامه های تحت وب مدرن رد پای Rest را می بینیم. یکی از نیازمندی های شرکت ها برای استخدام یک برنامه نویس تحت وب هم اطمینان از دانش برنامه نویس در زمینه توسعه API و مخصوصا توسعه Restful API می باشد. در این مقاله به ساخت RESTful API با استفاده از PHP PDO و MySQL می پردازیم.

این مقاله یک مقاله آموزش برنامه نویسی PHP نیست. هرچند سعی شده کدهایی که نوشته می شوند ساده باشند و توضیح کوتاهی داشته باشند اما هدف مقاله دقیقا آموزش مقدمات برنامه نویسی PHP نیست و بلکه آموزش ایجاد یک وب سرویس ساده با PHP است.

API چیست؟

API مخفف Application Programming Interface می باشد که امکان ارتباط بین برنامه های مختلف را میسر می سازد. با یک مثال مفهوم را روشن می سازیم: فرض کنید قصد دارید یک برنامه بنویسید که اطلاعات آب و هوای یک نقطه از زمین با دریافت مختصات جغرافیایی به کاربر نمایش می دهد. یک راه این است که سنسورهایی بخرید و در جای جای جهان یا به صورت ماهواره ای حول کره زمین کار بگذارید که قبل از تصمیم برای چنین اقدامی باید ببینید شما ایلان ماسک یا شخص با چنین قدرت هایی هستید یا خیر! اگر نیستید راه دیگری وجود دارد! وب سایتی که چنین اطلاعاتی ارائه می دهد را پیدا کنید. آن را Scrape کنید و با استفاده از تگ ها و عبارات منظم و دردسرهای دیگر اطلاعات را از صفحه استخراج و به کاربر نشان دهید. دقت کنید این اطلاعات در هر بار درخواست به برنامه شما باید دریافت شود و احتمالا به خاطر تجربه بد کاربر در استفاده از برنامه شما آن را سریعا حذف می کند. اما بالاخره راه حل چیست؟! واضح است: استفاده از API.
وب سایت هایی که چنین اطلاعاتی در اختیار کاربران قرار می دهند عموما به توسعه دهندگان API ارائه می کنند تا بتوانند برنامه خود را با استفاده از اطلاعات موجود در آن وب سایت توسعه دهند. برنامه شما با برنامه تحت وب صحبت می کند و وب سرویس برنامه تحت وب اطلاعات را در اختیار برنامه شما قرار می دهد و می توایند هرطور دلتان خواست آن را روی Frontend در اختیار کاربر قرار دهید. این مقاله هم توضیحی بر API می باشد.

REST API چیست؟

روی فیلدینگ (Roy Fielding) در سال ۲۰۰۰ معماری Representational State Transfer یا REST را در قالب رساله دکتری خود در دانشگاه کالیفرنیا ارواین (Irvine) معرفی کرد. به طور خلاصه REST یک سبک در معماری نرم افزار است که چارچوبی برای توسعه وب سرویس ها ارائه می کند. وب سرویس هایی که از این معماری استفاده می کنند وب سرویس های رستفول (RESTful Web Service) نامیده می شوند. وب سرویس های RESTful امکان درخواست منابع متنی موجود در وب و تغییر در آن ها را با استفاده از مجموعه ای از عملیات یکنواخت و از پیش تعیین شده فراهم می کند.

ایجاد یک وب سرویس Restful بسیار ساده با PHP و MySQL

در این بخش قصد ساخت RESTful API با استفاده از PHP PDO و MySQL را داریم.
وب سرویسی که قصد توسعه آن را داریم دو عمل ساده را انجام میدهد:

  • دریافت اطلاعات کلیه دانشجویان
  • دریافت اطلاعات یکی از دانشجویان با استفاده از شماره دانشجویی

از همین هدف مشخص می شود که این پروژه ساده نیاز به یک پایگاه داده و یک کنترل کننده دارد که بتواند اطلاعات را از پایگاه داده دریافت کند. API ای که این وب سرویس ارائه می دهد دارای دو نقطه پایانی است:

  • read: ارائه اطلاعات کلیه دانشجویان
  • single_read: ارائه اطلاعات یک دانشجو با ارائه شماره دانشجویی

برای سادگی در این پروژه ساده هر نقطه انتهایی را در یک فایل جدا کدنویسی می کنیم. همچنین برای پیروی از شئ گرایی نیاز به کلاسی داریم که بتواند اشیایی در حوزه مساله (در اینجا دانشجو) را برای ما فراهم کند. 

ساختار پروژه به صورت زیر است: 

-Simple-Restful-PHP
--api
---read.php
---single_read.php
--class
---students.php
--config
---database.php

پروژه را می توانید به هر صورتی که علاقمندید اجرا کنید اما ما در این مقاله از CLI استفاده می کنیم و به صورت زیر می توان پروژه را اجرا کرد:

$ cd /var/www/Simple-Restful-PHP
$ php -S 127.0.0.1:8080

اگر به مرورگر خود بروید و آدرس http://127.0.0.1:8080 را وارد کنید می توانید نتیجه را ببینید. دقت کنید ما از وب سرور آپاچی (Apache) در لینوکس استفاده می کنیم.

پایگاه داده (Database)

اولین قدم ساخت پایگاه داده است. در ابتدا به MySQL وارد می شویم:

$ mysql -u root -p

اگر MySQL رو سیستم شما نصب نیست می توانید به روش زیر اقدام کنید:

$ sudo apt install mysql-server

یا

$ sudo apt install mariadb-server

در ویندوز پیشنهاد می شود از XAMP یا WAMP استفاده کنید.
یک پایگاه داده به نام simplerestfulphp ایجاد می کنیم (شما هر اسمی دوست داشتید بگذارید):

CREATE DATABASE simplerestfulphp;

پایگاه داده ایجاد شده را به کار میگیریم:

use simplerestfulphp

حال جدولی برای نگهداری اطلاعات دانشجویان ایجاد می کنیم (برای سادگی یک جدول با تنها دو ستون که شماره دانشجویی و نام دانشجو را ذخیره می کند در نظر گرفته ایم):

CREATE TABLE IF NOT EXISTS `Student` (
    `id` int(8) NOT NULL AUTO-INCREMENT,
    `name` varchar(256) NOT NULL,
    PRIMARY KEY (`id`)
)

id همان شماره دانشجویی است که فرض کنید از ۱ شروع می شود.
حال دو دانشجو (هرچند که شما بخواهید می توانید ایجاد کنید) وارد جدول می کنیم:

INSERT INTO `Student` (`id`, `name`) VALUES (1, 'Andy'), (2, 'David');

پایگاه داده حاضر است و حال باید اسکریپتی بنویسیم که بتوان با آن تعامل کرد. این اسکریپت همان database.php در دایرکتوری config می باشد. کد به قرار زیر است:

<?php
    class Database {
        private $host = "127.0.0.1";
        private $db_name = "simplerestfulphp";
        private $username = "root";
        private $password = "xxxxxxxxxxxxxxx"

        public $conn;

        public function getConnection() {
            $this->conn = null;
            try{
                $this->conn = new PDO("mysql:host=" . $this->host . ";dbname=" . $this->db_name, $this->username, $this->password);
            $this->conn->exec();
            }catch(PDOException $e){
                echo "Error in connecting to database: " . $e->getMessage();
            }
            return $this->conn;
        }
    }
?>

کد ساده است: ابتدا اطلاعات مربوط به پایگاه داده را در متغیرها ذخیره می کنید و سپس از PDO برای ارتباط با پایگاه داده استفاده میکنید.

برنامه نویسی شئ گرا (Object Oriented Programming)

برای استفاده از برنامه نویسی شئ گرا لازم است کلاسی تعریف کنیم که داده های درون پایگاه داده را برای ما کپسوله کند. برای ایجاد کلاس اسکریپتی می نویسم که این اسکریپت همان students.php در دایرکتوری class می باشد. کد درون آن به قرار زیر است:

<?php
    class Student{
        private $table = "Student";
        private $conn;
        
        public $id, $name;

        public function __construct($db){
            $this->conn = $db;
        }
        
        public function getStudents(){
            $query = "SELECT * FROM " . $this->table . "";
            $prep = $this->conn->prepare($query);
            $prep->execute();
            return $prep;
        }

        public function getStudent($sid){
            $query = "SELECT id, name FROM " . $this->table . " WHERE id = $sid ";
            $prep = $this->conn->prepare($query);
            $prep->execute();
            
            $row = $prep->fetch(PDO::FETCH_ASSOC);

            $this->id = $row['id'];
            $this->name = $row['name'];
        }

کد ساده است:  یک کلاس برای دانشجو تعریف شد و در آن دو تابع که یکی مسئول دریافت اطلاعات کل دانشجویان و دیگری مسئول دریافت اطلاعات یک دانشجو می باشد تعریف شدند.

نقاط انتهایی (Endpoint)

حال نوبت به توسعه هر یک از نقاط انتهایی (Endpoint) در API می رسد. همانطور که گفتیم دو نقطه انتهایی به نام های read , single_read داریم که هر کدام را جدا توسعه می دهیم.

نقطه انتهایی api/read/

همانطور که اشاره کردیم این نقطه انتهایی قرار است اطلاعات کل دانشجویان را در اختیار بگذارید. کد به قرار زیر است:

<?php

    include_once '../config/database.php';
    include_once '../class/students.php';

    $database = new Database();
    $db = $database->getConnection();

    $student = new Student($db);

    $query = $student->getStudents();
    $count = $query->rowCount();

    if ($count > ۰){
        
        $studentAssoc = array();
        $studentAssoc["data"] = array();
        
        while ($row = $query->fetch(PDO::FETCH_ASSOC)){
            extract($row);
            $stuAssoc = array("id" => $id, "name"=>$name);
            array_push($studentAssoc["data"], $stuAssoc);
        }
    http_response_code(200);
    echo json_encode($studentAssoc);
    }
    else {
        http_response_code(404);
        echo json_encode(array("message" => "No student found."));
    }
?>  

کد ساده بالا ابتدا یک نمونه از کلاس Database و یک نمونه از کلاس Student دریافت می کند وعمل کپسوله سازی را انجام می دهد. لزم به ذکر است پاسخی که از یک RESTful API دریافت می شود به صورت JSON است (در SOAP این پاسخ به صورت XML است).

حال اگر با استفاده از مرورگر یا Postman یا هر برنامه دیگر توسعه API یک درخواست GET به http://127.0.0.1:8080/api/read.php ارسال کنید اطلاعات درون پایگاه داده در حالت JSON به شما پاسخ داده می شود:

postman-rest-api-thregence

نقطه انتهایی api/single_read/

حال به جای اینکه با یک درخواست اطلاعات همه دانشجویان را دریافت کنیم می خواهیم یک شماره دانشجویی ارائه و اطلاعات دانشجوی دارنده آن شماره را استخراج کنیم. کد به قرار زیر است:

<?php

    include_once '../config/database.php';
    include_once '../class/students.php';

    $database = new Database();
    $db = $database->getConnection();

    $student = new Student($db);

    $student->getStudent($_GET['id']);

    if ($student->name != null){
        $studentAssoc = array("id" => $student->id, "name" => $student->name);
        http_response_code(200);
        echo json_encode($studentAssoc);
    }
    else {
        http_response_code(404);
        echo json_encode("Student not found.");
    }
?>

کار تمام است. مقدار id از طریق url گرفته می شود و با آن تابع getStudent فراخوانی می شود.
حال اگر با استفاده از مرورگر یا Postman یا هر برنامه دیگر توسعه API یک درخواست GET به http://127.0.0.1:8080/api/single_read.php ارسال کنید اطلاعات درون پایگاه داده مربوط به شماره مشخص شده در حالت JSON به شما پاسخ داده می شود:

postman restful id thregence

سخن پایانی

در این مقاله در مورد ساخت RESTful API با استفاده از PHP PDO و MySQL صحبت کردیم و یک مورد را توسعه دادیم. API ما دارای دو نقطه انتهایی بود که توسط آن ها عملیات دریافت اطلاعات انجام می شد. در مقالات بعدی این وب سرویس ساده را توسعه داده و عملیات نوشتن، بروزرسانی و حذف را به آن اضافه می کنیم.

درباره ما

ترجنس | thregence.ir
آکادمی ترجنس | edu.thregence.ir
دوره‌های آکادمی ترجنس | courses.thregence.ir
اینستاگرام | instagram.com/thregence
تلگرام | t.me/thregence
یوتوب | https://bit.ly/30mGowo
آپارات | aparat.com/thregence

ارسال یک پاسخ