slim
0 Liked

بناء Rest API باستخدام Slim Freamwork

تحدثنا سابقا عن تطوير المواقع وماهي الخطوات التي يجب عليك اتباعها لبناء اي موقع وايضا ماهو السيرفر وكيف تتعامل معه في مقالة “طريقك لبرمجة الويب” وايضا في مقالة “ماهو الـ API و REST API” وضحنا المفهوم العام للـ API وماهو الـ Rest , ولزيادة الفهم واستيعاب الموضوع بالكامل سنوضح في هذه المقالة كيف تبني Rest API بشكل جدا مبسط.

Slim Framework

Slim هي منصة مبنية على الـ PHP وتعد من اسهل واسرع المنصات التي تساعدك في بناء REST API عن طريق بعض الاسطر البسيطة, ومن الامور التي تميز هذه المنصة هو خفتها وبساطتها بالاضافة لدعمها العديد من المميزات القوية منها HTTP messages’ method, status, URI, headers, cookies, and body بالاضافة لدعمها الـ Caching, Sessions و Crypto  وغيرها من الامور.

فكرة الـ API

قبل ان نبدا في شرح طريقة البرمجة وبناء الـ API سنوضح الفكرة التي سنقوم ببرمجتها ستكون جدا بسيطة وفقط لتوضح طريقة التعامل مع المنصة واساسيات الـ Rest API, الفكرة هي نظام بسيط لتسجيل بضائع المستودع وتستطيع تحميل المشروع بالكامل من Github.

قاعدة البيانات

سنستخدم في هذا المثال قاعدة بيانات MySQL وسننشئ جدول واحد فقط لتسجيل البضائع وليكن اسمه items ويحتوي على الحقول التالية id, name, count, date

3

CREATE TABLE IF NOT EXISTS <code>items</code> (
 <code>id</code> int(11) NOT NULL,
 <code>name</code> varchar(255) NOT NULL,
 <code>count</code> int(3) NOT NULL,
 <code>date</code> timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

التعامل مع منصة Slim

اولا قم بانشاء مجلد باسم api داخل السيرفر ومن ثم قم بتحميل المنصة من هذا الرابط, بعد ذلك فك الضغط عن الملف وانسخ مجلد Slim الى المجلد API وانشئ ثلاث ملفات داخل مجلد API بالمسميات التالية index.php, config.php , .htaccess

4

ملف .htaccess

من احد اهم فوائد هذا الملف هو للتحكم في الكثير من خصائص الموقع والملفات, وذلك من خلال بعض الاوامر التي سندخلها في هذا الملف وسيقوم السيرفر بقرائتها وتنفيذها, قم بنسخ الكود التالي واضفه الى الملف:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [QSA,L]

في الكود السابق قمنا بتفعيل الـ mod_rewrite عن طريق السطر الاول وبعد ذلك قمنا باضافة شرطين للتحقق من الرابط اذا كان الملف او المجلد غير موجودين سنقوم باعادة توجيه الرابط الى الملف index.php

ملف confing.php

<?php
function getDB() {
$dbhost="localhost";
$dbuser="root";
$dbpass="root";
$dbname="store";
$dbConnection = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass);
$dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
return $dbConnection;
}
?></pre>
<p dir="rtl" style="text-align: justify;">في هذا الملف سنضيف جميع المعلومات الخاصة بالاتصال بقاعدة البيانات, فقط قم بتغيير المتغيرات dbuser, dbpass, dbname بالبيانات الخاصة بك.</p>

<h4 dir="rtl" style="text-align: justify;"> ملف index.php</h4>
<p dir="rtl" style="text-align: justify;">هذا الملف هو الملف الرئيسي وهو ماسنكتب بداخله جميع  الـ Services الخاصة بالـ API, ولكن في البداية لابد ان نضيف هذه الاسطر في بداية الملف</p>

<pre> <?php
require 'confing.php';
require 'Slim/Slim.php';
\Slim\Slim::registerAutoloader();
$app = new \Slim\Slim();

اول سطرين قمنا باستدعاء الملفين config.php و slim/slim.php وبعد ذلك قمنا باستدعاء الدالة registerAutoloader الخاصة بالمنصة Slim لتفعيلها, واخيرا قمنا بانشاء متغير app وهو ماسنستخدمه كثير في الكود.

عرض البيانات

لعرض جميع البيانات الموجودة في قاعدة البيانات وبالتحديد جدول items سنقوم باستخدام البروتوكول GET وسنحدد الرابط الخاص بعرض البيانات وليكن /items

$app->get('/items', function() use ($app) {
 $db =getDB();
 $sql = "SELECT * from items";
 $stmt = $db->query($sql);
 $items = $stmt->fetchAll(PDO::FETCH_OBJ);
 echo json_encode($items);
});

في السطر الاول قمنا باستخدام البروتوكول GET ومن ثم قمنا بتحديد الرابط الخاص بالخدمة وهو /items وبعد ذلك قما بكتابة الكود الخاص بالاتصال بقاعدة البيانات وجلب جميع البيانات ومن ثم طباعتها كـ JSON Object, وسنقوم باعادة نفس الخطوات مع بقية الخدمات "اضافة, تعديل والحذف"

اضافة عنصر

بنفس طريقة العرض ولكن في الاضافة سنقوم باستخدام البروتوكول POST وايضا نحتاج الى بعض البيانات مثل اسم المنتج وعدده, لذلك سنستقبل هذه البيانات في الـ Body بصيغة JSON ومن ثم نقوم بتحويلها الى مصفوفة Array للتعامل معها, ومن الامور المهمة ايضا ان نقوم بتغير كود الحالة HTTP Status Code عند اضافة العنصر او عند حدوث اي مشكلة, هذا الكود سيستفيد منه الطرف الثاني Client لكي يعرف حالة طلبه, فالكود رقم 201 يعني ان البيانات تمت اضافتها بنجاح بينما الكود رقم 422 يعني ان السيرفر قام بمعالجة البيانات ولكن حصل خطأ اثناء الاضافة.

$app-&gt;post('/items', function() use ($app) {
 $db =getDB();
 $json = $app-&gt;request-&gt;getBody();
 $data = json_decode($json, true);

 $sql = &quot;insert into items (<code>name</code>,<code>count</code>) values ('&quot;.$data['name'].&quot;','&quot;.$data['count'].&quot;')&quot;;
 $result = $db-&gt;query($sql);
 if($result){
 $app-&gt;response-&gt;setStatus(201);
 echo '{&quot;flag&quot;: &quot;true&quot;,&quot;msg&quot;: &quot;item successfully added&quot;}';
 }else{
 $app-&gt;response-&gt;setStatus(422);
 echo '{&quot;flag&quot;: &quot;false&quot;,&quot;msg&quot;: &quot;Oops! An error occurred&quot;}';
 }

});
تعديل عنصر

بنفس طريقة الاضافة ولكن سنستخدم البروتوكول PUT وسنقوم ببعض التعديلات على كود الـ SQL.

$app-&gt;put('/items', function() use ($app) {
 $db =getDB();
 $json = $app-&gt;request-&gt;getBody();
 $data = json_decode($json, true);
 $sql = &quot;update items set <code>name</code> = '&quot;.$data['name'].&quot;',<code>count</code> ='&quot;.$data['count'].&quot;' where id ='&quot;.$data['id'].&quot;'&quot;;
 $result = $db-&gt;query($sql);
 if($result){
 $app-&gt;response-&gt;setStatus(200);
 echo '{&quot;flag&quot;: &quot;true&quot;,&quot;msg&quot;: &quot;item successfully updated&quot;}';
 }else{
 $app-&gt;response-&gt;setStatus(422);
 echo '{&quot;flag&quot;: &quot;false&quot;,&quot;msg&quot;: &quot;Oops! An error occurred&quot;}';
 }
});
حذف عنصر

في الحذف سنحتاج امر واحد فقط الا وهو موقع العنصر المراد حذفه وسنستقبله من خلال الـ Parameter لذلك سنقوم بتعديل الرابط من items الى item/delete وايضا سنستخدم البروتوكول DELETE

$app->delete('/item/delete/:id', function($id) use ($app) {
 $db =getDB();
 $sql = "delete from items where id ='".$id."'";
 $result = $db->query($sql);
 if($result){
 $app->response->setStatus(200);
 echo '{"flag": "true","msg": "item successfully deleted"}';
 }else{
 $app->response->setStatus(422);
 echo '{"flag": "false","msg": "Oops! An error occurred"}';
 }
});
تفعيل الـ Rest API

 كل مانحتاجه لتفعيل الـ API هو استدعاء الدالة run() في اخر ملف الـ index.php

 $app->run();

التحقق من الـ API

اذا وصلت الى هذه النقطة فهنيئاً لك قمت بكتابة Rest API بالكامل ولكن للتاكد من انه يعمل بالكامل لديك اكثر من طريقة سواء كانت عن طريق برمجة موقع او تطبيق للاتصال بالـ API او عن طريق بعض الادوات الجميلة التي تساعدك في اختبار الـ API وهي اضافات لمتصفح الكروم منها Postman و Advanced REST client. فعلى سبيل المثال اذا اردت استخدام الـ Postman قم بتحميله من الرابط

5

واجهة Postman

لعرض جميع البيانات استخدم الرابط التالي http://localhost/api/items مع البروتوكول GET

6

عرض جميع البيانات

اما في الاضافة سنقوم بتغير البروتوكول الـ POST وبنفس الرابط ولكن سنرسل في الـ Body البيانات التي نود اضافتها

7

اضافة عنصر

للتعديل قم بتغير البروتوكول فقط الة PUT اما بالحذف فاستخدم البروتوكول DELETE وغير الرابط الى http://localhost/api/item/delete/id مع استبدال id برقم العنصر المراد حذفه.

الشرح بالفيديو

-- سيتم تحديث الموضوع لاحقاً

رابط المشروع على GitHub

https://github.com/alhazmy13/RestAPI-using-Slim-Framework

5 Comments

  • fanonh

    October 04, 10 2015 12:14:29

    استاذ عبدالله ايش الفرق باني اكتب كود الـ php مثلا حذف العنصر
    بده الكود

    $app->delete(‘/item/delete/:id’, function($id) use ($app) {
    $db =getDB();
    $sql = “delete from items where id ='”.$id.”‘”;
    $result = $db->query($sql);
    if($result){
    $app->response->setStatus(200);
    echo ‘{“flag”: “true”,”msg”: “item successfully deleted”}’;
    }else{
    $app->response->setStatus(422);
    echo ‘{“flag”: “false”,”msg”: “Oops! An error occurred”}’;
    }
    });

    وده الكود
    if(isset($_POST[‘delete’]))
    {
    $dbhost = ‘localhost’;
    $dbuser = ‘root’;
    $dbpass = ”;
    $conn = mysql_connect($dbhost, $dbuser, $dbpass);
    if(! $conn )
    {
    die(‘Could not connect: ‘ . mysql_error());
    }

    $email = $_POST[’email’];

    $sql = “DELETE FROM sign_up WHERE email=’$email’ “;

    mysql_select_db(‘sasa website’, $conn );
    $retval = mysql_query( $sql, $conn );
    if(! $retval )
    {
    die(‘Could not delete your account: ‘ . mysql_error());
    }
    echo “your account has been delete\n”;
    mysql_close($conn);
    }
    else
    {
    ?>

  • SalmanMD

    January 30, 01 2016 09:50:24

    اذا امكن شرح عملية التحقق من الذي يستخدم الـapi

    وهل هو مصرح له

    وشكراً

    • خةشق

      March 15, 03 2016 10:33:24

      بالنسبة لموضو ع التحقق شفت موضوع في مدونة androidhive يستخدم API KEY لكل يوزر من أول مايسوي register لليوزر يسند له API KEY ثم في اي طلب من اليوزر لازم يرفق معه API KEY لتحقق منه .

  • omar altawyan

    March 12, 03 2016 10:16:41

    الله يكتب أجرك عبدالله فعلا موضوع جدا جميل أحسنت الشرح و التقديم المحتوى المفيد الكثير يستصعب موضوع rest API وبفضل الله ثم شرحك بإذن الله يستفيد منه الجميع

Leave a Reply