در این آموزش از سایت وبنولوژی میخواهیم به شما طریقه ایجاد یک API در PHP از نوع REST را آموزش دهیم. به زبانی ساده و به همراه یک ویدیوی جذاب و به زبان فارسی! که در کمتر جایی خواهید یافت. REST API به شما امکان استفاده از سرویسهای اینترنتی را توسط یک برنامهٔ دیگر میدهد. به عبارتی دیگر برای ایجاد ارتباط بین برنامههای مختلف روی رایانههای مختلف که به شبکه متصل هستند، میتوان از REST API استفاده نمود.
REST چیست؟
این عبارت سرنام Representational State Transfer میباشد. REST ساختاری است که مجموعهای از قوانین را برای توسعه و استفاده از وب سرویسها بر بستر HTTP تعریف میکند. REST API هم ساده است و به سادگی اجرا میگردد، هم اینکه بدون وابستگی به سکویی قابلیت اجرایی با هر زبان برنامه نویسی را دارد.
نوعی دیگر از وب سرویس SOAP نام دارد که سرنام عبارت Simple Object Access Protocol است و توسط مایکروسافت توسعه داده شده.
REST API چطور کار میکند؟
درخواستهای REST مرتبط با عملیات چهارگانهٔ CRUD یعنی Create, Read, Update, Delete در پایگاه داده است. REST از درخواستهای GET, POST, PUT و DELETE بهره میگیرد.
- GET برای دریافت اطلاعات که مشابه Readاست.
- POST برای ایجاد رکورد جدید که مشابه Create است.
- PUT برای به روزرسانی رکورد که شبیه Update است.
- DELETE برای حذف رکورد که شبیه Delete است.
طریقه ساخت REST API در PHP
خروجی اصلی REST API به سبک JSON است و ما هم از همین فرمت برای ایجاد ارتباط با API مان استفاده میکنیم. کل این آموزش به دو مرحله تقسیم میگردد:
- ایجاد REST API برای ارسال اطلاعات (سرویس دهنده)
- استفاده از REST API برای دریافت اطلاعات (سرویس گیرنده)
راه اندازی REST API
در این مرحله کارهایی که صورت میپذیرد شامل موارد زیر میباشد:
- ساخت پایگاه داده MySQL و جدول درون آن
- ایجاد اتصال به پایگاه داده با PHP
- ساخت سند REST API با PHP
پایگاه داده را هم میتوان از طریق phpMyAdmin از کنترل پنل ایجاد کرد. هم با یک دستور SQL ساده بدین ترتیب:
CREATE DATABASE phpapi;
یک جدول هم باید درون این پایگاه داده ایجاد کرد که دستورات SQL زیر چاره نیاز ماست:
CREATE TABLE IF NOT EXISTS `transactions` (
`id` int(20) NOT NULL AUTO_INCREMENT,
`order_id` int(50) NOT NULL,
`amount` decimal(9,2) NOT NULL,
`response_code` int(10) NOT NULL,
`response_desc` varchar(50) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `order_id` (`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
حالا باید ایجاد ارتباط با دیتابیس را ایجاد کنیم. روی هاست یک سند با نام db.php میسازیم. کدهای زیر را درون آن قرار میدهیم. اطلاعات اتصال به دیتابیس را با موارد حقیقی آنها جایگزین کنید.
<?php
// Enter your Host, username, password, database below.
$con = mysqli_connect("localhost","db_username","db_password","phpapi");
if (mysqli_connect_errno()){
echo "Failed to connect to MySQL: " . mysqli_connect_error();
die();
}
?>
یک سند دیگر هم با نام api.php ایجاد میکنیم که برای ایجاد ارتباط با دیتابیس به کار میرود. کدهای زیر را درون آن قرار میدهیم.
<?php
header("Content-Type:application/json");
if (isset($_GET['order_id']) && $_GET['order_id']!="") {
include('db.php');
$order_id = $_GET['order_id'];
$result = mysqli_query(
$con,
"SELECT * FROM `transactions` WHERE order_id=$order_id");
if(mysqli_num_rows($result)>0){
$row = mysqli_fetch_array($result);
$amount = $row['amount'];
$response_code = $row['response_code'];
$response_desc = $row['response_desc'];
response($order_id, $amount, $response_code,$response_desc);
mysqli_close($con);
}else{
response(NULL, NULL, 200,"No Record Found");
}
}else{
response(NULL, NULL, 400,"Invalid Request");
}
function response($order_id,$amount,$response_code,$response_desc){
$response['order_id'] = $order_id;
$response['amount'] = $amount;
$response['response_code'] = $response_code;
$response['response_desc'] = $response_desc;
$json_response = json_encode($response);
echo $json_response;
}
?>
این سند درخواستها را به صورت GET میگیرد و نتیجه با فرمت JSON بر میگرداند. ما همهٔ این اسناد را در پوشه ای با نام rest ایجاد کردیم. پس ساختار URL درخواست از API به این صورت خواهد بود:
http://localhost/rest/api.php?order_id=15478959
اگر یک چنین id ای در دیتابیس وجود داشته باشد، نتیجه زیر بر خواهد گشت.
اما URL ای که در بالا استفاده شد چندان کاربرپسند نیست. پس بهتر است که با کد .htaccess آن را اصلاح کنیم. این دو خط را در سند .htaccess در پوشه rest میگذاریم. اگر یک چنین سندی نیست آن را ایجاد کنید.
RewriteEngine On # Turn on the rewriting engine
RewriteRule ^api/([0-9a-zA-Z_-]*)$ api.php?order_id=$1 [NC,L]
حالا همان نشانی بالا با ساختار زیر هم قابل دسترس است.
http://localhost/rest/api/15478959
تا اینجای کار ما REST API را ایجاد کردیم. حالا در ادامهٔ کار میخواهیم یک برنامهٔ دیگر بسازیم که با این API ارتباط برقرار نماید.
استفاده از REST API
کارهایی که در این مرحله انجام میپذیرد شامل:
- ساخت یک سند Index با فرم HTML
- دریافت رکوردها بواسطهٔ CURL
پس ما در اینجا یک پوشهٔ دیگر میسازیم. حالا این پوشه میتواند روی یک هاست دیگر باشد. یک سند index.htm ساخته و محتوای زیر را درون آن قرار میدهیم.
<form action="fetch.php" method="POST">
<label>Enter Order ID:</label><br />
<input type="text" name="order_id" placeholder="Enter Order ID" required/>
<br /><br />
<button type="submit" name="submit">Submit</button>
</form>
یک سند دیگر هم ساخته که کار پردازش اطلاعات فرم را به عهده دارد و نام آن را fetch.php می گذارد و خطوط زیر را درون آن قرار میدهیم.
<?php
if (isset($_POST['order_id']) && $_POST['order_id']!="") {
$order_id = $_POST['order_id'];
$url = "http://localhost/rest/api/".$order_id;
$client = curl_init($url);
curl_setopt($client,CURLOPT_RETURNTRANSFER,true);
$response = curl_exec($client);
$result = json_decode($response);
echo "<table>";
echo "<tr><td>Order ID:</td><td>$result->order_id</td></tr>";
echo "<tr><td>Amount:</td><td>$result->amount</td></tr>";
echo "<tr><td>Response Code:</td><td>$result->response_code</td></tr>";
echo "<tr><td>Response Desc:</td><td>$result->response_desc</td></tr>";
echo "</table>";
}
?>
اگر با مرورگر به نشانی فرم اینترنتی رفته و یک order_id وارد کنید که همان رکورد در پایگاه داده وجود داشته باشد، یک نتیجهٔ پر به شما برگردانده خواهد شد. اما اگر چنین رکوردی در دیتابیس موجود نباشد، هیچ چیزی برگردانده نخواهد شد.
ویدیوی آموزشی ساخت PHP API
جمع بندی
این از روال ساخت REST API در PHP بود. توضیحات بیشتر را در ویدیویی که در همین صفحه خدمت شما تقدیم کردیم گفته شده. با دیدن این فیلم به راحتی میتوانید از همهٔ جوانب کار این کدهای سر در بیاورید. امیدوارم که این آموزش برنامه نویسی هم برای شما جذاب بوده باشد.
فقط میتونم بگم فوق العاه بود!
هیچ جا ندیدم به این تمیزی کد بنویسه و مرحله به مرحله آموزش بده
ممنونم
این کد نه تمیز بود نه بی خطا
دقت کنید میبینید آسیب sql injection هم در این کد وجود داره
علاوه بر اون کدنویسی تمیز و تفکیک شده انجام نشده، در مورد اصول کدنویسی مطالعه بفرمایید منظور بنده رو متوجه میشید
اما مطلب در نهایت سادگی و وضوح بیان شده
تشکر از نویسنده
خسته نباشید عالی بود
با سلام.
علت خطای زیر چیست؟
Trying to get property of non-object
سپاس از شما. بسیار جامع و عالی و ساده توضیح دادید.
سلام
عالی بود میشه اموزشی درباره post man Api هم بزارید ؟
بهتون تبریک میگم
واقعا آموزش استاندارد و شفاف و کاملی بود
با این که بیش از ۱۰ سایت آموزش رو برای این کار چک و تست کردم اما آموزش شما از همه توی این زمینه بهتر بود.
خیلی خیلی از وبسایتتون خوشم اومد
بسیار عالی
آیا به صورت لوکال میشه apiایجاد کرد که با fetch جاوااسکریپت از اون اطلاعات استخراج کرد؟
بله. میشه.
سلام و درود.من با خطای trying to get property of non object مواجه میشم .چند بار هم فیلم رو مرور کردم ولی عیب کار رو متوجه نمیشم .چه دلایلی میتونه داشته باشه؟لطفا راهنمایی کنید
سلام من response_code کد رو به reason ری نیم کردم
می خوام وقتی طرف api رو خراب بزنه reason رو بزنه که من ست کردم reason رو بنویسه invalid
وقتی درست بزنه api رو دیگه واسش reason یا همون response_code رو براش نشون نده
اگه میشه کمکم کنین ممنون می شم
سلام تشکر آموزشتون خیلی خوب و روان بود.
فقط یک سوال من یک برنامه با c# دارم و می خوام به فروشگاه اینترنتیم متصلش کنم تا کاربرها از اون طریق به اکانتشون وارد بشن و یک سری کارها را فقط روی همون برنامه به شرط ورود بتونن انجام بدن. برای این کار هم نیاز دارم یک بعد ورود از طریق برنامه یک سری فیلدها از چند جدول مختلف بکشم بیرون. چطوری C# را به سایت وصل کنم و این کوئری ها را بگیرم؟ امکانش هست راهنمایی کنید لطفا
سلام. در برنامهٔ C# خودتون باید بتونید با استفاده از روش هایی مثل استفاده از کلاس HttpClient یک درخواست HTTP به API برنامهٔ تحت وب تون بدید و ارتباط رو برقرار کنید.
ممنون بابت آموزش عالی تون
سلام
علت خطای trying to get property of non object رو بیزحمت توضیح میدید؟؟؟
خیلی خیلی خیلی دمت گرمممممممممممممممممممم 😉 😉 😉
خیلی ممنون از شما، من از این آموزش استفاده کردم و به راحتی برای افزونه هایی که خودم برای وردپرس مینوسم، توکن فعال سازی ساختم، حالا سوال اینجاست، که خروجی ای که بصورت جیسون برای ما میده رو چطور میتونیم مخفی کنیم…تا زمانی که یک ریزالت رو اکو میکنیم، به راحتی کد رو تشخیص میده و توکن رو درست شناسایی میشه، اما خروجی رو کامنت میکنی، توکنی شناخته نمیشه….چطور میتونم خروجی رو توی یک متغیر داشته باشم که نمایش داده نشه. ممنون از راهنمایی های شما.
خیلی ممنون از شما عالی بود تشکر