سلام.
شاید وقتی اسم وب سرویس به گوشتون میخوره میگین وای! وب سرویس! حتما باید چیز سختی باشه! اما اگر اینطور فکر میکنید حتما در این آموزش همراه من باشید تا بهتون ثابت کنم که ساختن وب سرویس چقدر شیرین و آسونه و اصلا اسمش ترسناک نیست! در این آموزش میخوام فقط نحوه ساخت یک REST API رو توضیح بدم و نحوه عملکردش رو ببینیم. اما اولش بیاین ببینیم اصلا API چیه؟ REST چیه؟ وب سرویس چیه و به چه دردی میخوره؟

قبل از شروع یه این نکته توجه کنید که تو این آموزش ما فرض میکنیم که شما:

  • برنامه نویس هستید
  • با روش کار http و متدهای اون آشنا هستید
  • php در حد ابتدایی بلدید

تعریف API

API مخفف Application Programming Interface (فارسی: رابط برنامه نویسی نرم افزار) هست. اگر تو اینترنت یه جست و جو درباره تعریف API بکنید متوجه میشید که انواع تعاریف موجوده اما یه تعریف اصلی داره:
API شامل توابع یا متدهایی هست که به شما اجازه میده از این طریق بتونید به ویژگی های سیستم عامل، نرم افزار و یا یک سرویس دسترسی پیدا کنید( و یا در اون تغییر ایجاد کنید). ایجاد API باعث میشه برنامه شما بتونه با روشهای گوناگون قابل دسترس و تغییر پذیر بشه یعنی توسعه نرم افزار شما رو گسترده تر میکنه و بوسیله API ها، سیستمهای کامپیوتری میتونن با هم ارتباط برقرار کنن.

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

"دارم کم کم متوجه میشم. مثال میزنی؟"
البته!
برای مثال یک سایت صرافی رو در نظر بگیرید که قیمت بروز طلا و سکه رو در سایتش میذاره. اگر این سایت API نداشته باشه شما مجبور هستید برای چک کردن قیمت ها به سایتش مراجعه کنید. اما اگر اون سایت API ارائه کرده باشه شما میتونید بدون مراجعه به وب سایت صرافی از قیمت ها با خبر بشید. البته که این فقط یکی از کاربردهای API هاست که تو این مثال یک وب سرویس هست.

"چقدر خوب و جالب! پس API خیلی بدرد بخوره!"

تعریف وب سرویس

حالا که API رو تعریف کردیم. توضیح وب سرویس خیلی راحته. وب سرویس ها در واقع API هایی هستن که از طریق شبکه (معمولا با پروتکل HTTP) قابل دستیابی ان. دو مدل پر استفاده برای ساخت وب سرویس ها استفاده از SOAP و یا REST هست که با توجه به محبوبیت REST ما میخوایم درباره این حرف بزنیم.

تعریف SOAP

SOAP مخفف Simple Object Access Protocol یک پروتکل تحت XML برای ارتباط بین کامپیوترها در بستر شبکه هست بدون در نظر گرفتن نوع سیستم عامل، تکنولوژی ها و یا زبان برنامه نویسی. اما نسبت به REST پیچیدگی بالاتری داره و سرعت و انعطاف پذیری کمتری هم داره.

تعریف REST

REST مخفف (Representational State Transfer) یکی از معماری های بسیار محبوب برای ساخت وب سرویس ها هست. REST بر خلاف SOAP یک استاندارد نیست بلکه فقط یک استایل یا یک معماری هست و یکسری محدویت ها و قواعدی برای خودش داره که اگر شما در برنامه خودتون اونها رو رعایت کرده باشید میشه گفت که یک برنامه یا سیستم RESTful ساختید.

[color=#f1c40f]image from linkedin.com[/color]

قواعد REST

  • Client-Server - سیستمREST از مدل کلاینت-سرور پیروی میکنه یعنی وظایف هر کدوم مشخص هست. کلاینت فقط درخوست رو میفرسته و جمع آوری داده ها، امنیت و پاسخ مربوط به سرویس دهنده هست.
  • Uniform Interface - منابع باید در قالب URL های منحصر به فرد قابل دسترس و از طریق متدهای اساسی http مثل GET - POST - PUT و DELETE قابلیت دسترسی و تغییر داشته باشن
  • Stateless - وضعیت کلاینت در خود کلاینت ذخیره و در هر درخواست به سرور فرستاده میشه و سرور از درخواست های قبلی هیچ اطلاعی نداره و هیچ نوع history (Session) در سرور وجود نداره. در واقع در درخواستی که از سمت کلاینت به سرور فرستاده میشه یه درخواست جدید تلقی میشه.
  • Cacheable - قابلیت کش شدن یا نشدن منابع باید در سمت سرور مشخص بشه تا کلاینت برای منابع ثابت بتونه درخواست ها رو بهینه کنه.
  • Layered System - مربوط به سمت سرور هست و اجازه میده که چندین سرور در سیستم وجود داشته باشه مثلا یه سرور برای خود API، یه سرور برای داده ها و ... و کلاینت هیچ اطلاعی از این لایه بندی نداره(نیازی نیست) و نمیدونه دقیقا به کدوم از سرورها متصل میشه.
  • Code on demand (اختیاری) - شما اجازه دارید تو درخواست های که از سمت سرور به کلاینت میفرستید در صورت نیاز کدهای اجرایی مثل جاوا اسکریپت رو هم بفرستید تا در سمت کلاینت کار خاصی انجام بدید اما این روش پیشنهاد نمیشه و ممولا استفاده نمیشه.

SOAP یا REST

خوب این رو باید بدونیم که SOAP برای خودش یک استاندارد هست یعنی وقتی میگیم قراره با SOAP کار کنیم میدونیم روش استفادش چطور هست و در SOAP همیشه از XML استفاده میشه و قاعده ی خاصی داره و *معمولا در موارد تجاری و معمولا وقتی نیاز به وب سریس های پیچیده تر داریم استفاده میشه(توجه کنید که از واژه *معمولا استفاده کردم چون در خیلی موارد از REST استفاده میشه. مثلا Paypal داره از REST استفاده میکنه ). اما در مورد REST اینطور نیست. در حقیقت REST استاندارد خاصی نداره و ممکنه خروجی اون از نوع XML یا JSON و... باشه که اغلب JSON هست و همچنین REST بخاطر سادگی و انعطاف پذیری بالا بسیار محبوب هست. البته این دو هر کدوم مزیت و مشکلاتی هم دارند که با توجه به اونا برنامه نویس نوع وب سرویس رو انتخاب میکنه که تحقیق بیشتر در مورد تفاوت ها رو بر عهده خودتون میذارم. چیزی که توصیه میشه تا وقتی که دلیل خاصی برای استفاده از SOAP ندارید از REST استفاده کنید.

نوشتن یک وب سرویس RESTful

خوب بعد از توضیح مفاهیم، نوبت به مثال هست. در حال حاضر فریمورکهای خوبی برای ساختن سرویس های RESTful وجود داره اما اینجا ما فقط برای مثال یک وب سرویس پایه ای رو مینویسیم.

خوب ما به یه فایل نیاز داریم که درخواست ها رو از کلاینت بگیره و پاسخ بده که اصطلاحا بهش میگیم API endpoint . برای ساده تر کردن مثال هم از اتصال به پایگاه داده خودداری میکنیم و صرفا یک سری داده ی ثابت رو نمایش میدیم.

سمت سرور

<?php
// We dedided to our resourses represent in JSON format
header("Content-Type:application/json");


// function to get price of products
function get_price($name)
{
    // dummy data
    // in real world it should be fetch from database
    $products = array(
        "book"   => 20,
        "pen"    => 10,
        "pencil" => 5,
    );

    foreach ($products as $product => $price) {
        if ($product == $name) {
            return $price;
            break;
        }
    }
}

// used to send response to the client
function response($status, $status_message, $data)
{
    header("HTTP/1.1 " . $status);

    $response['status']         = $status;
    $response['status_message'] = $status_message;
    $response['data']           = $data;

    $json_response = json_encode($response);
    echo $json_response;
    exit;
}

// check for user input
if (!empty($_GET['name'])) {
    $name  = $_GET['name'];
    $price = get_price($name);

    if (empty($price)) {
        response(200, "Product Not Found", null);
    } else {
        response(200, "Product Found", $price);
    }

} else {
    response(400, "Invalid Request", null);
}

همونطور که میبینید کد بالا بسیار سادست و هیچ چیز پیچیده ای توش نیست. اما در حقیقت یک وب سرویس REST هست که میتونه بنا به درخواست کاربر نتیجه رو در قالب JSON نمایش بده.

توضیح کد:
ما در لاین ابتدایی تعیین کردیم که منابع باید با فرمت JSON ارائه بشن البته ما میتونیم به XML یا هر چیز دیگه ای تغییرش بدیم.
بعد آرایه ای از ۳ محصول ایجاد کردیم (در وب سرویس واقعی اینها معمولا از دیتابیس گرفته میشن) و یه تابع برای چک کردن اینکه آیا محصولی که کاربر میخواد در لیست ما هست یا خیر. و یه تایع دیگه برای نمایش نتیجه در قالب JSON.
در لاین های انتهایی هم بررسی میکنیم که اگر کاربر در فرمتی که ما مشخص کردیم مقادیر رو برای چک کردن فرستاده یا نه. اگر درست فرستاده باشه موجودیت محصول بررسی و اگر در فرمت اشتباه باشه پیفام invalid request برای کلاینت فرستاده میشه.

سمت کلاینت

کلاینت میتونه هر چیزی باشه در صورتی که بتونه از طریق HTTP صحبت کنه. یعنی میتونه یه برنامه به زبان جاوا یا سویفت یا پایتون و یا یه اپ موبایل یا به برنامه Desktop باشه.

برای مثال این خروجی تست insomnia (برنامه ای برای تست API ها )هست:

برای تست از طریق اسکریپت PHP هم میشه کد زیر رو مثال زد:

<?php
    if(isset($_POST['submit']))
    {
        $name = $_POST['name'];
        
        $url = "http://localhost/api/".$name;
        
        $client = curl_init($url);
        curl_setopt($client,CURLOPT_RETURNTRANSFER,true);
        $response = curl_exec($client);
        
        $result = json_decode($response);
        
        echo $result->data; 
    }
   ?>

کوئری میتونه از طریق فرم HTML با متد POST ارسال بشه.

خوب همونطور که دیدید ما یه وب سرویس REST بسیار پایه ای ایجاد کردیم که میتونه به کلاینت پاسخ بده و تو این وب سرویس از متدهای GET و POST استفاده شده.

در اخر هم یه اسکریپت کاربردی به نام php-crud-api برای ساخت وب سرویس RESTful معرفی میکنم که میتونید باهاش وب سرویس های خوب بسازید.

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

از برنامه نویسی لذت ببرید ;)

آخرین ویرایش: 17-03-2018 ???? 12:20، توسط رضا رمضانپور