آموزش rest api

آموزش rest api در کد ایگنایتر

کد ایگنایتر یک فریم ورک بسیار قوی در php می باشد که به سادگی امکان ساخت برترین برنامه های تحت وب را به ما می دهد.

در این آموزش به نحوه ساخت یک  RESTful API در کد ایگنایتر می پردازیم و کلیه تراکنشهای آن را با سیستم client مدیریت می کنیم .قبل از مطالعه این مقاله شما می بایست به زبان پی اچ پی و فریم ورک کد ایگنایتر مسلط باشید .

درصورت عدم اطلاع از کد ایگنایتر مقاله زیر را دانلود و مطالعه نمایید:

پیشنهاد پیرو برای شما :   کتاب آموزش کدایگنایتر - جلد ۱

پس از خواندن این مقاله شما به راحتی می توانید یک api سروز راه اندازی نمایید.

قبل از شروع کار نیاز است شما ابتدا در سرور خودتان کد ایگنایتر را دانلود و نصب نمایید :

پیشنهاد پیرو برای شما :   شروع کار با کدایگنایتر

همچنین نیاز است اطلاعات کمی راجع به نحوه کارکرد برنامه های api داشته باشید در غیر این صورت مقاله زیر را مطالعه نمایید:

REST API

ساخت سرور api

ابتدا نیاز است شما کتابخانه codeigniter-restserver  را از گیت هاب دانلود نمایید وبرروی سرور خود extract کنید ویا در صورتی که پروژه ای جدید می باشد ابتدا کد ایگنایتر را دانلود و نصب نمایید و فایل فشرده دانلود شده را روی آن extract کنید .

برای بارگزاری کافی است فقط کافی است فایل فشرده نصبی را دانلود وبرروی سرور فود از حالت فشرده خارج نمایید توجه نمایید اقدام extract باید در پوشه اصلی قرار گید در کنار فایل index.php همچنین توجه نمایید اگر اسم پوشه application خود را تغییر داده ای باید محتوای extract شده در پوشه application را در پوشه تغییر نام یافته جایگزین کنید.

برای اجرای rest server خود فقط یک گام مانده است ان هم تنظیم url در فایل config.php می باشد .به فایل “application/config/config.php رفته و پارامتر base_url را مناسب به سرور و پوشه سرور خود تنظیم نمایید :

همانگونه که قبلا گفته بودیم شما میتوانید پارامتر base_url را در کد ایگنایتر به صورت داینامیک پیاده سازی نمایید فقط کافی است کد زید را جایگزین پارامتر base_url نمایید :

$config['base_url'] = ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == "on") ? "https" : "http");
$config['base_url'] .= "://".$_SERVER['HTTP_HOST'];
$config['base_url'] .= str_replace(basename($_SERVER['SCRIPT_NAME']),"",$_SERVER['SCRIPT_NAME']);
به شما تبریک می گوییم اکنون سرور شما نصب شده و به راحتی می توانید از ان استفاده نمایید .

آدرسها در کد ایگنایتر

اکنون برای اجرا یا تست سرود خود آدرس آن را فراخوانی نمایید به طور مثال :

http://localhost/restserver

تمامی مدلها و مثالهای url ها در “application/controllers/example_api.php موجود می باشد ولی برای شرح بیشتر ما چندین مورد را بررسی می نماییم:

همانگونه که می بینید آددسها همانند خود آدرسهای کدایگنایتر می باشد ولی خروجی آن مناسب با restserver می باشد ولی همانگونه که در مثال زیر می بینید این آدرسها به صورت پیشرفته ای می تواند توسعه یابد .

همانگونه که می بینید تا قسمت format دقیقا مثل قبل است و درقسمت فرمت می توانید نوع خروجی را تعیین نمایید :

چرا خروجی های مختلف مهم می باشد ؟

برنامه های مختلف بسته به نوع پیاده سازی و زبان برنامه نویسی امکان کار با فرمتهای مختلف دارد و در این کتابخانه حدودا تمامی خروجی ها برای همه برنامه ها پشتیبانی می شود .

فرمتهای پشتیبانی :

  1. XML:حدودا تمامی برنامه های از این فرمت پشتیبانی می کنند .
  2. json: بیشتر برای برنامه هایی که با جوا اسکریپت و PHP نوشته شده است استفاده می شود.
  3. csv:خروجی استاندارد برای برنامه های محاسباتی مانند اکسل.
  4. HTML:فروجی استاندارد صفحات وب.
  5. PHP : خروجی مختص برای برنامه های PHP با قابلیت eval().
  6. serialize : خروجی سریال شده که بیشتر برنامه قابلیت دریافت آن و UNSERILIZE کردن آن را دارند.

به راحتی شما می توانید فرمت را در URL تان تغییر دهید و با مرورگرتان تست نمایید.

ولی حالا به سراغ کد برنامه می رویم تا روند اجرای rest api  را در برنامه ببینیم .

در ساختار اصلی برنامه ما داده ها را به ویو از کنترلر جهت نمایش ارسال می نماییم ولی در این ساختار ما دیگر ویو برای نمایش نداریم در کنترلرمان خروجی برنامه را به صورتهای تعریف شده مثلا json اریه می دهیم.

در حالت عادی کلاس کنترلر ما از کلاس CI_CONTROLLER مشتق می شود :

<?php
class Example_api extends Controller {
 
}

ولی از حالت rest full api ما کنترلرمان را از REST_Controller ارث می بریم البته قبل از آن باید کلاس پدر را فراخوانی نماییم

<?php
require(APPPATH'.libraries/REST_Controller.php');
 
class Example_api extends REST_Controller {
 
}

کار با منابع

اکنون شما یک کنترلر خام دارید و باید نوع ورودی را تعیین نمایید هر ورودی باید تشخص داده شود که از چه نوعی است مثلا get یا post است .

<?php
require(APPPATH'.libraries/REST_Controller.php');
 
class Example_api extends REST_Controller {
 
    function user_get()
    {
        // respond with information about a user
    }
     
    function users_get()
    {
        // respond with information about several users
    }
}

همانگونه که می بینید ما از سیستم مسیر یاب فوق العاده کدایگنایتر برای کنترل ورودی هایمان استفاده می کنیم که دارای مقادیر زی می باشد:

از این نوع ورودی برای برداشت اصلاعات استفاده می نماییم مثلا بخواهیم لیت محصولاتمان را استخراج نماییم و بیاد داشته باشید وقتی آدرس را در مرورگر اجرا می نماییم پیش فرض این نوع بارگزاری می شود.

در این نوع ورودی برای بروز رسانی داده های فعلیمان استفاده می نماییم مثلا محصولی را اضافه می کنیم.

جهت افزودن داده استفاده می شود به طور مثال محصولی را اضافه می کنیم.

همانگونه که از اسم آن مشخص است به منظور حذف داده ها استفاده می شود مثلا محصولی را حذف می نماییم.

 

در نهایت تمام عملیاتها برای تابع user به شرح زیر می باشد

<?php
require(APPPATH'.libraries/REST_Controller.php');
 
class Example_api extends REST_Controller {
 
    function user_get()
    {
        // respond with information about a user
    }
 
    function user_put()
    {
        // create a new user and respond with a status/errors
    }
 
    function user_post()
    {
        // update an existing user and respond with a status/errors
    }
 
    function user_delete()
    {
        // delete a user and respond with a status/errors
    }
}

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

اکنون که روال کلی را داریم می توانبم مقادیری را به برنامه ی مورد نظرمان ارسال و خروجی را برگردانیم. در این مرحله بهتر است از مدلها در کدایگنایتر استفاده نماییم .

<?php
require(APPPATH'.libraries/REST_Controller.php');
 
class Example_api extends REST_Controller {
 
    function user_get()
    {
        $data = array('returned: '. $this->get('id'));
        $this->response($data);
    }
     
    function user_post()
    {       
        $data = array('returned: '. $this->post('id'));
        $this->response($data);
    }
 
    function user_put()
    {       
        $data = array('returned: '. $this->put('id'));
        $this->response($data;
    }
 
    function user_delete()
    {
        $data = array('returned: '. $this->delete('id'));
        $this->response($data);
    }
}

در این تابع ما مقدارمان را برای خروجی به صورتی که تعریف شده است ارسال می نماییم.

همچنین نوع داده اطلاعات را نیز مشخص می نماییم مثلا نوع ۴۰۴ وقتی دادهای یافت نمی شود.

$this->response(array(‘error’ => ‘User not found.’), 404);

کار با مدلها

در گام بعدی ما مدل مورد نظرمان را می سازیم و در جای مناسب از آن استفاده می کنیم:

<?php
require(APPPATH.'/libraries/REST_Controller.php');
 
class Api extends REST_Controller
{
    function user_get()
    {
        if(!$this->get('id'))
        {
            $this->response(NULL, 400);
        }
 
        $user = $this->user_model->get( $this->get('id') );
         
        if($user)
        {
            $this->response($user, 200); // 200 being the HTTP response code
        }
 
        else
        {
            $this->response(NULL, 404);
        }
    }
     
    function user_post()
    {
        $result = $this->user_model->update( $this->post('id'), array(
            'name' => $this->post('name'),
            'email' => $this->post('email')
        ));
         
        if($result === FALSE)
        {
            $this->response(array('status' => 'failed'));
        }
         
        else
        {
            $this->response(array('status' => 'success'));
        }
         
    }
     
    function users_get()
    {
        $users = $this->user_model->get_all();
         
        if($users)
        {
            $this->response($users, 200);
        }
 
        else
        {
            $this->response(NULL, 404);
        }
    }
}
?>

همانگونه که می بینید در این مثال ما نوع ورودی را تشخیص و در مدل اقدام مناسب را انجام میدهیم و پس از در یافت خروجی از مدل آن را به مقصد می فرستیم:

امنیت برنامه

یکی از مسایل خیلی مهم در برنامه های rest api امنیت آنها می باشد مثلا برنامه ای داریم که اطلاعات فقط با نام کاربری و رمز عبور در دسترس می باشد . به این منظور وارد فایل “application/config/rest.php می شویم و نوع تاایید اعتبارمان را مشخص می نماییم.

/*
|--------------------------------------------------------------------------
| REST Login
|--------------------------------------------------------------------------
|
| Is login required and if so, which type of login?
|
|   '' = no login required, 'basic' = relatively secure login, 'digest' = secure login
|
*/
$config['rest_auth'] = 'basic';

شما می بایست نوع rest_auth را بر اساس مقادیر زیر مشخص نمایید.

هیچ نوع امنیتی وجود ندارد و هر کسی اطلاعاتی که می خواهد را بر می دارد

یک روش ورودی نسبتا ناامن که فقط باید در شبکه های داخلی / امن استفاده شود.

یک روش امن و مناسب جهت استفاده در api ها که نام کاربری و رمز عبور به صورت محافظت شده در آن نگه داری می شود. هنگامی که برروی digest تنظیم میشود می بایست همانند مثال زیر نام های کاریری و رمزهای عبور را درون آرای

/*
|--------------------------------------------------------------------------
| REST Login usernames
|--------------------------------------------------------------------------
|
| Array of usernames and passwords for login
|
|   array('admin' => '1234')
|
*/
$config['rest_valid_logins'] = array('admin' => '1234');

در این نوع اعتبار سنجی از session استفاده می شود بهنظر می رسد برای برنامه های عامیانه این مدل پیشرفته ترین مدل می باشد که در آینده بیشتر به شرح آن می پردازیم .

در این نوع اعتبار سنجی ما از سیستم پیشرفته session ها استفاده می شود که به صورت مناسبی امنیت سیستم شما را فراهم می سازد ولی دز گام بعدی باید مقدارauth_source را در فایل تنظیم rest مقدار دهی نمایید .که شامل مقادیر زیر می شود:

/*
|--------------------------------------------------------------------------
| REST Login Source
|--------------------------------------------------------------------------
|
| Is login required and if so, the user store to use
|
| ''        Use config based users or wildcard testing
| 'ldap'    Use LDAP authentication
| 'library' Use a authentication library
|
| Note: If 'rest_auth' is set to 'session' then change 'auth_source' to the name of the session variable
|
*/
$config['auth_source'] = 'library';

 

LDAP

LDAP روش استانداردی برای دسترسی و به روزرسانی فهرست‌های(دایرکتوری‌های) توزیع شده (Distributed) ارائه می‌دهد.

LDAP مخفف Lightweight Directory Access Protocol است و مجموعه ای از پادمان ها (Protocols) و متدها، برای دسترسی به اطلاعات شاخه‌های توزیع شده است. متدهایی که در LDAP در اختیار دارید به شما این امکان را می‏دهد تا از اطلاعاتی که در درخت اطلاعات شاخه‌ها (Directory Information Tree – DIT) قرار دارد استفاده کنید. برای مثال در یک شبکه، این درخت شامل اطلاعاتی از اشیاء موجود در شبکه مانند کاربران، پرینترها، برنامه ها و … است.

 

library

در صورتی که مقدار rest_auth برابر session باشد شما باید نام session مان را در اینجا وارد نمایید.

البته این مفهوم بسیار پیچیده و کاربردی است باید بدانید کدایگنایتر لایبرری بسیار حرفه ای در خصوص کنتر لsession ها دارد که شما می توانید آنها را به حالت عادی یا در بانک اطلاعاتی ذخیره نمایید و نامو مقدار session را دریافت وذخیره یا بازیابی مینماید .

پیشنهاد پیرو برای شما :   کتاب آموزش کدایگنایتر - جلد ۱

 

برخی از تنظیمات حرفه ای در rest api

همانگونه که قبلا گفته شد در پوشه config و فایل rest.php یک سری تنظیمات حرفه ای وجود دارد که شما می توانید بسته به سیستم نرم افزاری خود آنها را تغییر دهید و به قدرت و امنیت اپلیکیشن خود بیفزایید.

درخواستهای ajax

در این تنظیم شما تنظیم می نمایید فقط دستورهای اجاکس را بپذیرید و از درخواستهای http جلوگیری نمایید :

/*
|--------------------------------------------------------------------------
| REST AJAX Only
|--------------------------------------------------------------------------
|
| Set to TRUE to allow AJAX requests only. Set to FALSE to accept HTTP requests
|
| Note: If set to TRUE and the request is not AJAX, a 505 response with the
| error message 'Only AJAX requests are accepted.' will be returned.
|
| Hint: This is good for production environments
|
*/
$config['rest_ajax_only'] = true;

 

محدود کردن کاربران در صفحه

شما قابلیت این را دارید که هر صفحه را به تعداد بازدیدکنندگان در زمان محدود نمایید که این قابلیت قدرت فوق العاده به برنامه شما می دهد . روند انجام کار به صورت زیر است

/*
|--------------------------------------------------------------------------
| REST Enable Limits
|--------------------------------------------------------------------------
|
| When set to TRUE, the REST API will count the number of uses of each method
| by an API key each hour. This is a general rule that can be overridden in the
| $this->method array in each controller
|
| Default table schema:
|   CREATE TABLE `limits` (
|       `id` INT(11) NOT NULL AUTO_INCREMENT,
|       `uri` VARCHAR(255) NOT NULL,
|       `count` INT(10) NOT NULL,
|       `hour_started` INT(11) NOT NULL,
|       `api_key` VARCHAR(40) NOT NULL,
|       PRIMARY KEY (`id`)
|   ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
| To specify the limits within the controller's __construct() method, add per-method
| limits with:
|
|       $this->method['METHOD_NAME']['limit'] = [NUM_REQUESTS_PER_HOUR];
|
| See application/controllers/api/example.php for examples
*/
$config['rest_enable_limits'] = FALSE;

/*
|--------------------------------------------------------------------------
| REST API Limits Table Name
|--------------------------------------------------------------------------
|
| If not using the default table schema in 'rest_enable_limits', specify the
| table name to match e.g. my_limits
|
*/
$config['rest_limits_table'] = 'limits';

/*

مدیریت دسترسی ها

در این تنظیم می توانید مدیریت نمایید که دسترسی ها به کنترلرها چگونه باشد:

/*
|--------------------------------------------------------------------------
| REST Method Access Control
|--------------------------------------------------------------------------
| When set to TRUE, the REST API will check the access table to see if
| the API key can access that controller. 'rest_enable_keys' must be enabled
| to use this
|
| Default table schema:
|   CREATE TABLE `access` (
|       `id` INT(11) unsigned NOT NULL AUTO_INCREMENT,
|       `key` VARCHAR(40) NOT NULL DEFAULT '',
|       `all_access` TINYINT(1) NOT NULL DEFAULT '0',
|       `controller` VARCHAR(50) NOT NULL DEFAULT '',
|       `date_created` DATETIME DEFAULT NULL,
|       `date_modified` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|       PRIMARY KEY (`id`)
|    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
*/
$config['rest_enable_access'] = FALSE;

/*
|--------------------------------------------------------------------------
| REST API Access Table Name
|--------------------------------------------------------------------------
|
| If not using the default table schema in 'rest_enable_access', specify the
| table name to match e.g. my_access
|
*/
$config['rest_access_table'] = 'access';

غیر فعال سازی آی پی ها

در این تنظیم یک سری آی پی را بلاک می نمایید و آنها دسترسی به سرور شما را ندارند:(در تنظیم اول آن را فعال نمایید و در تنظیم دوم لیست ای پی ها را بدهید)

/*
|--------------------------------------------------------------------------
| Global IP Blacklisting
|--------------------------------------------------------------------------
|
| Prevent connections to the REST server from blacklisted IP addresses
|
| Usage:
| ۱٫ Set to TRUE and add any IP address to 'rest_ip_blacklist'
|
*/
$config['rest_ip_blacklist_enabled'] = FALSE;

/*
|--------------------------------------------------------------------------
| REST IP Blacklist
|--------------------------------------------------------------------------
|
| Prevent connections from the following IP addresses
|
| e.g: '123.456.789.0, 987.654.32.1'
|
*/
$config['rest_ip_blacklist'] = '';

/*

توصیه می شود قسمت client وبسیات خود را با کتابخانه های javascript همانند reactJS بسازید . در آینده سعی می شود مقالات متفاوتی در این خصوص در وب سایت پیرو انتشار یابد . بنابراین همراه ما باشید.