حتما شما از تلگرام استفاده کردهاید و به احتمال زیاد هم نرمافزار موبایلش را در تلفنهای همراه خود دارید و شاید بعضی اوقات بنا بر نیازتان از نسخه دسکتاپ یا وب آن استفاده کردهاید، شاید برایتان سوال باشد که چطور میشود که من هر چیزی که در تلگرام موبایلم دارم در وب و دسکتاپ نیز دارم و حتی میتوانم همزمان از آنها استفاده کنم، سوال بسیار جالبی است و قرار است که با هم در این مقاله جزئیات آن را بررسی کنیم.
API برگرفته از 3 کلمهي Application Programming Interface است، به معنای (رابط برنامه نویسی اپلیکیشن) که مانند موتور زیر کاپوت عمل میکند و تمامی کارهایی را که ما انتطار داشته باشیم در پشت صحنه انجام میدهد.
ولی سوالی که خیلیها میپرسند این است که API چیست؟ و احتمالا شما هم این عبارت را در گوگل جستجو کردهاید.
API مثل یک پیامرسان است که درخواستش را به سیستم میدهد و به سیستم میگوید که چه کاری میخواهد انجام بدهد و سیستم به آن پاسخ میدهد.
فرض کنید که پدرتان به شما یه لیست خرید داده است و شما میخواهید از فروشگاه مربوطه خرید کنید، میروید و لیستی که پدرتان به شما داده است را به فروشنده میدهید و میخواهید که این لیست را برای شما بیاورد و فروشنده بعد از چند دقیقه اجناس را برای شما آماده میکند و شما هم برمیگردید و آنها را تحویل پدرتان میدهید.
در این مثال پدر شما همان درخواستکننده است و فروشنده همان سیستم است که به درخواست پدرتان پاسخ میدهد، اما API چه کسی است؟
درست حدس زدید API دقیقا خود شما هستید که درخواست را از پدرتان دریافت کردهاید و به فروشنده تحویل دادهاید و از همان فروشنده پاسخ را دریافت کردید و به پدرتان تحویل دادهاید.
حال فکر کنید که میخواهید یک بلیط هواپیما بخرید، اگر به سایتهایی مثل ماهان ایر، ایرانایر و … بروید شما محدود هستید به اینکه فقط از پروازهای آنها بلیط تهیه کنید اما وقتی شما به سایتهایی مانند علی بابا مراجعه میکنید، این سایتها تمامی پروازها را از مبدا هر جایی به مقصد هر جایی در اختیار دارند پس متوجه میشویم که این سایتها در حال صحبت کردن با سایر سایتها میباشند، در اینجا APIها نقش اساسی در عملکرد آنها دارند.
Rest برگرفته از 3 کلمهی Representational State Transfer که به معنای (انتقال بازنمودی حالت) است، به طور دقیقتر Rest چگونگی ظاهر APIها را تعیین میکند.
4 کار از عهده Rest برمیآید که یکیش را در بالا گفتیم و به ترتیب مابقی را توضیح میدهیم.
شاید با مفهوم CRUD آشنا باشید، CRUD مختصر شده 4 کلمهی Create – Read – Update – Delete است که این عملیات در پایگاه داده انجام میشود که Create وظیفهی ایجاد را دارد، Read وظیفهی خواندن، Update وظیفهی بروزرسانی و در نهایت Delete وظیفهی حذف کردن را دارد، این موارد را در متدهای HTTP هم داریم که عملیاتی مشابه را انجام میدهند. (اگر به خواندن درباره پروتکل HTTP علاقه دارید مقاله پروتکل HTTP چیست؟ را از دست ندهید)
به طور کلی Code statusهایی که به سمت ما برمیگردد به 5 دسته تقسیم میشوند.
پس به خاطر داشته باشید که API یک پیامرسان میباشد و Rest این امکان را به ما میدهد تا از HTTP استفاده کنیم و به این پیامها استایل بدهیم.
منظور از استایلدهی همان تبادل اطلاعات در قالب JSON میباشد. JSON به اختصار رسیده 3 کلمه JavaScript Object Notation است که ساختاری شبیه به این را دارد.
تعریف در Restful API اینگونه بیان میشود که به APIهایی که از قوانین Rest پیروی میکنند Restful API یا Rest API گفته میشود، یا خیلی سادهتر به تمامی فرایند ارسال و دریافت API از Server و Client که انجام میشود Rest API گفته میشود که هیچ محدودیتی در اجرای آن نیست به این معنا که در تمامی زبانهای برنامهنویسی قابل استفاده است.
با هم یک مثال از آن را در سایت گیتهاب مشاهده میکنیم، برای این کار شما میتوانید آدرس https://api.github.com/users را در مرورگر خود وارد کنید و شاهد ساختار JSON که گیتهاب به ما برگردانده است خواهید بود. برای اینکه مشخصات خود را در ساختار JSON ببینید باید در انتهای آدرس یک / قرار دهید و نام کاربری گیتهاب خود را وارد کنید، بعد از این کار شما جزئیات پروفایل خود را در گیت هاب مشاهده میکنید.
حالا وقت آن رسیده که یک نمونه Restful API با همدیگر در PHP بنویسیم، برای شروع یک سری پیشنیازها داریم که باید آنها را تهیه کنید.
بعد تهیه ابزارهای مورد نیاز باید کدنویسی را شروع کنیم.
کدهایی که پایین قرار دادهایم باید در فایل config.php قرار بگیرد تا بتوانیم به پایگاه داده متصل شویم، در ادامه خط به خط کدها را توضیح خواهیم داد.
<?php
class Connect extends PDO
{
public function __construct()
{
parent::__construct("mysql:host=localhost;dbname=api_db","root","");
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8");
$this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
}
?>
و در فایل index.php این خط کدها را قرار دهید.
require_once "config.php";
class API
{
function Select(){
$db = new Connect();
$users = array();
$data = $db->prepare("SELECT * FROM users ORDER BY id;");
$data->execute();
while($outPutData = $data->fetch(PDO::FETCH_ASSOC)){
$users[$outPutData['id']] = array(
'id' => $outPutData['id'],
'name' => $outPutData['name'],
'age' => $outPutData['age'],
);
}
return json_encode($users);
}
}
$users = new API();
header("Content-Type: application/json");
echo $users->Select();
حال اگر شما این کدها را اجرا کنید باید شاهد این خروجی باشید.
// 20200229194615
// http://localhost/php/API/
{
"1": {
"id": 1,
"name": "Amir",
"age": "18"
},
"2": {
"id": 2,
"name": "Mohammad",
"age": "13"
},
"3": {
"id": 3,
"name": "Zahra",
"age": "28"
},
"4": {
"id": 4,
"name": "Sahar",
"age": "22"
}
}
تمامی توضیحات درباره کدهای بالا در ویدئو پایین قرار دارد، توصیه میکنیم این ویدئو را مشاهده نمائید.
class Connect extends PDO
{
}
با کلمه کلیدی class ما میتوانیم در PHP یک کلاس تعریف کنیم و با آوردن یک نام دلخواه جلوی class میتوان آن کلاس را با آن نام بشناسیم، کلمهی کلیدی extends PDO که بعد از نام class آمده به این معناست که خصوصیات PDO که یک روش شیگرایی برای اتصال به پایگاه داده است را برای ما ارثبری میکند.
public function __construct()
{
}
وقتی ما در تعریف یک تابع درون یک شیء از تابع construct__ استفاده میکنیم زمانی اجرا میشود که ما آن کلاس را فراخوانی کنیم، پس اولین تابعی که در این کلاس به طور پیشفرض اجرا میشود construct__ است.
parent::__construct("mysql:host=localhost;dbname=api_db","root","");
کلمهی کلیدی parent ویژگی پدر خودش که PDO بود که آن را به ارث بردیم برای ما میآورد، در تابع construct__ مشخصات پایگاه داده خود را وارد میکنیم.
در مقابل =mysql:host نام host خود را میآوریم که در اینجا localhost میباشد و با ; (سمیکالن) جدا میکنیم و در مقابل =dbname نام پایگاه داده خود را وارد میکنیم.
در قسمت بعدی خارج از ” (دابل کوتیشن)، یک رشتهي دیگر باز میکنیم و نام کاربری پایگاه داده خود را وارد میکنیم که به طور پیشفرض root است و در رشتهي بعدی رمز پایگاه داده خود را وارد میکنیم که به طور پیش فرض خالی است.
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8");
در کد بالا کاراکتر utf8 برای mysql ست کردهایم.
$this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
با کلمه this$ ما در اصل داریم به آن تابع اشاره میکنیم و با تابع setAttribute ما میتوانیم یک سری صفت برای آنها ست کنیم که در اینجا ما PDO::ATTR_ERRMODE که کار گزارشدهی خطا و ERRMODE_EXCEPTION هندل کردن خطا را بر عهده دارند.
Require_once "config.php";
با require_once میتوانیم یک فایل را لود کنیم تا از محتویات آن در کدهایمان استفاده کنیم.
class API
{
function Select(){
}
}
همانطور که مشاهده میکنید ما یک کلاس با نام API ساختهایم که کدهای API خود را درون آن میریزیم و درون آن یک تابع به نام Select ایجاد کردهایم تا بتوانیم کدی که نوشتهایم را بارها و بارها استفاده کنیم.
$db = new Connect();
$users = array();
$data = $db->prepare("SELECT * FROM users ORDER BY id;");
$data->execute();
به بررسی 4 خط کد اول داخل تابع میپردازیم.
while($outPutData = $data->fetch(PDO::FETCH_ASSOC)){
$users[$outPutData['id']] = array(
'id' => $outPutData['id'],
'name' => $outPutData['name'],
'age' => $outPutData['age'],
);
}
ما در قسمت شرط این حلقه با PDO::FETCH_ASSOC هر بار یک آرایه associative، از هر سطر در tableمان داخل پایگاه داده دریافت میکنیم (آرایه associative یک آرایهای است که کلیدها را ما خودمان در آن با نام دلخواه تعریف میکنیم) و در متغیر outPutData$ قرار میگیرد و ما هر بار مقدار بازگشتی را در یک عضو از آرایه users ذخیره میکنیم و در آخر وقتی که مقدار بازگشتی وجود نداشته باشد شرط false میشود و از حلقه خارج میشود.
return json_encode($users);
و در آخر مقداری که درون آرایه users ذخیره شده است را به یک ساختار JSON تبدیل میکنیم و آن را به عنوان خروجی کار برمیگردانیم.
$users = new API();
header("Content-Type: application/json");
echo $users->Select();
در ادامه کار و در خارج از ساختار کلاس ما یک نمونه از کلاس API در users میسازیم، در خط دوم که header را آوردهایم از اهمیت بالایی بر خوردار است چون مشخص میکند محتوای ما از چه نوعی است.
و در نهایت نیز خروجی را چاپ میکنیم و نتیجه زیر را میبینیم.
جمع بندی
شاید تا الان نمیدانستیم ولی متوجه شدیم که تلفنهای همراهمان، وب سایتها، نرمافزارهای دسکتاپ و … به یکدیگر متصل هستند و با یکدیگر صحبت میکنند پس امکانات بسیار زیادی را به ما میدهند، ساختار آنها درست مثل نمونهی سادهای که نوشتهایم است، پس اگر با هر زبان برنامهنویسی و یا فریمورکی کار میکنید فرا گرفتن این بخش میتواند بسیار شما را در کارتان حرفهای کند لازم به ذکر است که شما اگر به دنیای تکنولوژی علاقهمند هستید باید همیشه خودتان را بروز نگه دارید.
$output = array();
foreach ($query->result() as $row) {
$output[] = $row->id . ' ' . $row->name;
}
echo json_encode($output);
آقا دم شما گرم واقعا
فقط دو تا موضوع نیاز هست
1 - چطوری میشه authentication برای دسترسی به api را انجام داد؟
2 - یه مثال در خصوص put - Update - Delete نیز ارائه کنید لطفا
برای مورد اول این سرفصل و برای مورد دوم این آموزش رو مطالعه کنید.