Email: info@developit.ir

ساخت یک RESTful Web Service با استفاده از slim 3

REST چیست؟ 
representational state transfer یا به طور خلاصه REST معماري است که مجموعه اي از اصولی را تعریف میکند تا به وسیله ي آن server و client بتوانند با هم ارتباط برقرار کنند. 
RESTful به سیستم هایی گفته میشود که داراي معماري کلی REST هستند. 
RESTful معمولا بر روي پرتکل HTTP و با استفاده از 4 عملیات پایه GET, PUT, POST, DELETE کار میکند.
علاوه بر این میتواند براي تعریف یک پیغام SOAP از WSDL بروي HTTP استفاده کند یا میتواند یک کلاس انتزاعی باشد که صرفاً بروي SOAP بنا شده باشد.
REST میتواند جایگزین مناسبی براي SOAP باشد، اما براي کار هاي ساده...
Slim چیست؟
Slim یک PHP micro framework هست که در نوشتن برنامه هاي کاربردي و در عین حال قدرتمند به ما کمک میکند.
Slim امکان دریافت یک درخواست HTTP، فراخوانی یکروال و ارسال پاسخ آن را به ما میدهد، فوق العاده سریع و داراي کد بسیار کمی هست در نتیجه ابزار مناسبی براي کار ما میباشد.

نصب Slim
نیازمندي ها:
- یک Web server با امکان URL rewriting
- PHP 5.5 یا نسخه هاي بالاتر
از composer براي نصب استفاده میکنیم:

composer require slim/slim "^3.0"

ﻣﻦ ﺑﺮاي اﯾﻦ ﭘﺮوژه ﺳﺎﺧﺘﺎر ﭘﻮﺷﻪ ﺑﻨﺪي زﯾﺮ ﺗﻌﺮﯾﻒ ﮐﺮدم:

-webservice
   -slim
index.php
test.php

framework را داخل پوشه ي slim قرار دادم.

در index.php هم توابع Web Service را مینویسیم.

از test.php هم براي تست توابع Web Service استفاده میکنیم.

نکته: قطعا slim امکانات زیادي دارد اما تا جایی که به موضوع ما مربوط هست از آن استفاده میکنیم.

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

در index.php بعد از دریافت slim آن را require کرده و یک شی از آن میسازیم.

require 'slim\vendor\autoload.php';
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Message\ResponseInterface;
// Create and configure Slim app
$app = new \Slim\App;

مثال اول: دریافت تمام اطلاعات یک جدول

میخواهیم تمام اطلاعات جدول t_post را خوانده و نمایش دهیم.

$app->get('/posts', function (ServerRequestInterface $request, ResponseInterface $response) {
$db = db_connection();
$posts = $db->query("SELECT * FROM t_post")->fetchAll(PDO::FETCH_ASSOC);
return json_encode($posts);
});

app->get نوع درخواست HTTP را مشخصمیکند که میتواند get,post,put,delete باشد.

Router تنها به درخواست هاي مشخصی پاسخ میدهد. در پارامتر اول app->get الگوي این درخواست را تعریف میکنیم.

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

http://localhost/webservice/index.php/posts

request درخواستی هست که از سمت client ارسال شده.

response پاسخی هست که از طرف server ارسال میشود.

db_connection تابعی براي برقراري یک ارتباط ساده با database میباشد:

function db_connection()
{
$connection = new PDO("mysql:host=127.0.0.1;dbname=ws",'root', '');
$connection->exec("SET CHARACTER SET utf8");
return $connection;
}

مثال دوم: دریافت یک سطر از جدول

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

$app->get('/post/{id}', function (ServerRequestInterface
$request, ResponseInterface $response, $args) {
$db = db_connection();
$post = $db->query("SELECT * FROM t_post WHERE
id={$args['id']}")->fetch(PDO::FETCH_ASSOC);
return json_encode($post);
});

جهت دریافت مقادیر از سمت کاربر نیاز هست هنگام تعریف الگو در پارامتر اول تابع app->get آن را مشخص کنیم. با تعریف الگوي post/{id} مشخصمیکنیم در درخواست مورد نظر ما آرگومانی به نام id وجود دارد.

آرگومان ها در متغییر args قرار میگیرند. args یک آرایه انجمنی هست که به عنوان مثال جهت دسترسی به مقدار id باید از args['id'] استفاده کنیم.

براي دستیابی به مقادیر post و get روشهاي متفاوتی وجود دارد که جهت مطالعه بیشتر میتوانید به مستندات slim مراجعه کنید. به عنوان مثال:

$myvar1 = $request->getParam('myvar'); //checks both _GET and _POST [NOT PSR-7 Compliant]
$myvar2 = $request->getParsedBody()['myvar']; //checks _POST [IS PSR-7 compliant]
$myvar3 = $request->getQueryParams()['myvar']; //checks _GET [IS PSR-7 compliant]

 مثال سوم: افزودن یک سطر در جدول

$app->post('/add', function (ServerRequestInterface $request, ResponseInterface $response) {
$db = db_connection();
$data = json_decode($request->getBody());
$db->prepare("INSERT INTO t_post (title) VALUES ('{$data->title}')")->execute();
return $db->lastInsertId();
});

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

توجه داشته باشین در REST براي ارسال یا دریافت اطلاعات به طور معمول از فرمت json  استفاده میشود.

اگر درخواست HTTP ناشناخته و یا خیلی بزرگ است(مثلا اطلاعات ارسال شده زیاد باشد) ترجیحا از request->getBody براي دریافت اطلاعات استفاده کنید.

تست و مشاهده:

$addPost = post_curl('http://localhost/webservice/index.php/add', ['title' => 'new post...']);
echo $addPost;
function post_curl($url, $fields = '')
{
$fields = json_encode($fields);
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($ch);
curl_close($ch);
return $result;
}

مثال چهارم: حذف یک سطر از جدول

$app->delete('/delete/{id}', function (ServerRequestInterface $request, ResponseInterface $response, $args) {
$db = db_connection();
$db->prepare("DELETE FROM t_post WHERE id={$args['id']}")->execute();
});

 بهتر است نوع درخواست ارسال شده جهت انجام عملیات حذف delete باشد.

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

دریافت سورس کد این مقاله

منابع:

http://www.slimframework.com
https://www.wikipedia.org

این مطلب آخرین بار در تاریخ 22:56 - 1395/12/03 ویرایش شده است.
ارسال نظر
عضویت در خبرنامه
جهت اطلاع از آخرین فعالیت های من لطفا در خبرنامه عضو شوید