حتما شما از تلگرام استفاده کرده اید و به احتمال زیاد هم نرم افزار موبایلش را در تلفن های همراه خود دارید و شاید بعضی اوقات بنا بر نیازتان از نسخه دسکتاپ یا وب آن استفاده کرده اید، شاید برایتان سوال باشد که چطور می شود که من هر چیزی که در تلگرام موبایلم دارم در وب و دسکتاپ نیز دارم و حتی می توانم همزمان از آن ها استفاده کنم، سوال بسیار جالبی است و قرار است که با هم در این مقاله جزئیات آن را بررسی کنیم.
API چیست؟
API برگرفته از 3 کلمه ي Application Programming Interface است، به معنای (رابط برنامه نویسی اپلیکیشن) که مانند موتور زیر کاپوت عمل می کند و تمامی کارهایی را که ما انتطار داشته باشیم در پشت صحنه انجام می دهد.
ولی سوالی که خیلی ها می پرسند این است که API چیست؟ و احتمالا شما هم این عبارت را در گوگل جستجو کرده اید.
API مثل یک پیام رسان است که درخواستش را به سیستم می دهد و به سیستم می گوید که چه کاری می خواهد انجام بدهد و سیستم به آن پاسخ می دهد.
API در زندگی روزمره
فرض کنید که پدرتان به شما یه لیست خرید داده است و شما می خواهید از فروشگاه مربوطه خرید کنید، می روید و لیستی که پدرتان به شما داده است را به فروشنده می دهید و می خواهید که این لیست را برای شما بیاورد و فروشنده بعد از چند دقیقه اجناس را برای شما آماده می کند و شما هم بر می گردید و آن ها را تحویل پدرتان می دهید.
در این مثال پدر شما همان درخواست کننده است و فروشنده همان سیستم است که به درخواست پدرتان پاسخ می دهد، اما API چه کسی است؟
درست حدس زدید API دقیقا خود شما هستید که درخواست را از پدرتان دریافت کرده اید و به فروشنده تحویل داده اید و از همان فروشنده پاسخ را دریافت کردید و به پدرتان تحویل داده اید.
API در دنیای برنامه نویسی
حال فکر کنید که می خواهید یک بلیط هواپیما بخرید، اگر به سایت هایی مثل ماهان ایر، ایران ایر و ... بروید شما محدود هستید به اینکه فقط از پرواز های آن ها بلیط تهیه کنید اما وقتی شما به سایت هایی مانند علی بابا مراجعه می کنید، این سایت ها تمامی پروازها را از مبدا هر جایی به مقصد هر جایی در اختیار دارند پس متوجه می شویم که این سایت ها در حال صحبت کردن با سایر سایت ها می باشند، در اینجا API ها نقش اساسی در عملکرد آن ها دارند.
Rest چیست؟
Rest برگرفته از 3 کلمه ی Representational State Transfer که به معنای (انتقال بازنمودی حالت) است، به طور دقیق تر Rest چگونگی ظاهر APIها را تعیین می کند.
4 کار از عهده Rest بر می آید که یکیش را در بالا گفتیم و به ترتیب مابقی را توضیح می دهیم.
- Rest تشکیل شده از متدهای HTTP می باشد
- وضعیت کدها را به ما نمایش می دهد.
- نوع پاسخ ها را نیز به نمایش می گذارد.
Rest تشکیل شده از متدهای HTTP می باشد
شاید با مفهوم CRUD آشنا باشید، CRUD مختصر شده 4 کلمه ی Create - Read - Update - Delete است که این عملیات در پایگاه داده انجام می شود که Create وظیفه ی ایجاد را دارد، Read وظیفه ی خواندن، Update وظیفه ی بروزرسانی و در نهایت Delete وظیفه ی حذف کردن را دارد، این موارد را در متدهای HTTP هم داریم که عملیاتی مشابه را انجام می دهند. (اگر به خواندن درباره پروتکل HTTP علاقه دارید مقاله پروتکل HTTP چیست؟ را از دست ندهید)
- POST: یک درخواست به سمت سرور ارسال می کند.
- GET: تمامی اطلاعاتی که از سمت سرور می آید را دریافت می کند.
- PUT: اطلاعاتی که از قبل ارسال شده اند را بروزرسانی یا جای گذاری می کند.
- DELETE: همین طور که از نامش پیداست وظیفه حذف تمامی اطلاعات نمایشی منبع هدف را دارد.
PATCH: متد کمتر شناخته شده از HTTP است اما کار دو متد POST و PUT را انجام می دهد و می توانید با این متد تغییرات جزئی را ایجاد کنید.
HEAD: این متد تقریبا شبیه به GET می ماند ولی یک سری تفاوت ها بین این دو است، برای مثال اگر شما از متد GET لیست کاربران را می خواهید این متد لیست را به شما نمایش می دهد اما متد HEAD این لیست را به شما نمایش نمی دهد ولی شاید برایتان سوال پیش بیاید پس برای چه استفاده می شود؟ این متد زمانی به کار می آید که بخواهید بدانید اطلاعاتی که قرار است بیاید به چه بزرگی و چه چیزی است.
OPTION: این متد درخواست هایی که از سمت سرور می آید را بررسی می کند، برای مثال اینکه این سرور چه متد هایی و چه عملکرد هایی را پشتیبانی می کند. متد OPTION گزینه ی خوبی برای آزمایش کردن Fatal Errorهای API نیز است.
TRACE: برای ارسال درخواست (Request) دریافتی است که مانند یک حلقه ارسال پیام می ماند و مکانیزم مناسبی برای اشکال زدایی است.

وضعیت کدها (Code Status) را به ما نمایش می دهد.
به طور کلی Code statusهایی که به سمت ما برمی گردد به 5 دسته تقسیم می شوند.
- نوع اول: از 100 تا 199
- نوع دوم: از 200 تا 299
- نوع سوم: از 300 تا 399
- نوع چهارم: از 400 تا 499
- نوع پنجم: از 500 تا 599
نوع پاسخ ها را نیز به نمایش می گذارد.
- 1XX: پیام های اطلاعاتی (مثل پیام اطلاعاتی 100)
- 2XX: پیام های موفقیت آمیز (مثل پیام موفقیت آمیز 200)
- 3XX: تغییر مسیرها (مثل پیام 304)
- 4XX: خطاهایی از سمت کاربر (مثل خطاهای 403)
- 5XX: خطاهایی از سمت سرور (مثل خطای 500)
پس به خاطر داشته باشید که API یک پیام رسان می باشد و Rest این امکان را به ما می دهد تا از HTTP استفاده کنیم و به این پیام ها استایل بدهیم.
منظور از استایل دهی همان تبادل اطلاعات در قالب JSON می باشد. JSON به اختصار رسیده 3 کلمه JavaScript Object Notation است که ساختاری شبیه به این را دارد.
Rest API یا Restful API چیست؟
تعریف در Restful API این گونه بیان می شود که به APIهایی که از قوانین Rest پیروی می کنند Restful API یا Rest API گفته می شود، یا خیلی ساده تر به تمامی فرایند ارسال و دریافت API از Server و Client که انجام می شود Rest API گفته می شود که هیچ محدودیتی در اجرای آن نیست به این معنا که در تمامی زبان های برنامه نویسی قابل استفاده است.
Rest API در گیت هاب
با هم یک مثال از آن را در سایت گیت هاب مشاهده می کنیم، برای این کار شما می توانید آدرس https://api.github.com/users را در مرورگر خود وارد کنید و شاهد ساختار JSON که گیت هاب به ما برگردانده است خواهید بود. برای اینکه مشخصات خود را در ساختار JSON ببینید باید در انتهای آدرس یک / قرار دهید و نام کاربری گیت هاب خود را وارد کنید، بعد از این کار شما جزئیات پروفایل خود را در گیت هاب مشاهده می کنید.

Rest API یا Restful API در PHP
حالا وقت آن رسیده که یک نمونه Restful API با همدیگر در PHP بنویسیم، برای شروع یک سری پیش نیازها داریم که باید آن ها را تهیه کنید.
- XAMPP
- IDE
- JSON viewer (افزونه ی Google Chrome برای نمایش شکیل تر JSON)
بعد تهیه ابزارهای مورد نیاز باید کد نویسی را شروع کنیم.
- قدم اول: پایگاه داده
- Phpmyadmin خودتان را باز کنید.
- یک پایگاه داده با نام api_db بسازید.
- یک Table درون پایگاه داده به نام users بسازید.
- در پایگاه داده خود 3 فیلد با نام های id - name- age بسازید.
- درون فیلدها به طور دلخواه داده وارد کنید.
- قدم دوم: آماده سازی فایل ها
- ساخت فایل config.php برای قرار دادن کدهای اتصال به پایگاه داده
- ساخت فایل index.php برای نوشتن کدهای Restful API
کدهایی که پایین قرار داده ایم باید در فایل 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"
}
}تمامی توضیحات درباره کدهای بالا در ویدئو پایین قرار دارد، توصیه می کنیم این ویدئو را مشاهده نمائید.
توضیحاتی درباره ی کدهای نوشته شده در فایل config.php
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 هندل کردن خطا را بر عهده دارند.
[note]توضیحاتی درباره کدهای نوشته شده در فایل index.php[/note]
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 خط کد اول داخل تابع می پردازیم.
در خط اول: یک نمونه از کلاسی که درون فایل config.php ساخته شده بود ایجاد کرده ایم و درون متغیر db$ ریخته ایم.
در خط دوم: یک آرایه خالی از usersها ساخته که در جلوتر کاربرهای خود را درون آن متغیر قرار می دهیم.
در خط سوم: یک دستور SQL ساده نوشته ایم که تمامی کاربرها را از پایگاه داده می خواند و آن ها را بر اساس شناسه id مرتب می کند.
- در خط چهارم: دستور SQL را اجرا کرده ایم.
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 را آورده ایم از اهمیت بالایی بر خوردار است چون مشخص می کند محتوای ما از چه نوعی است. و در نهایت نیز خروجی را چاپ می کنیم و نتیجه زیر را می بینیم.
جمع بندی
شاید تا الان نمی دانستیم ولی متوجه شدیم که تلفن های همراه مان، وب سایت ها، نرم افزارهای دسکتاپ و ... به یکدیگر متصل هستند و با یکدیگر صحبت می کنند پس امکانات بسیار زیادی را به ما می دهند، ساختار آن ها درست مثل نمونه ی ساده ای که نوشته ایم است، پس اگر با هر زبان برنامه نویسی و یا فریم ورکی کار می کنید فرا گرفتن این بخش می تواند بسیار شما را در کارتان حرفه ای کند لازم به ذکر است که شما اگر به دنیای تکنولوژی علاقه مند هستید باید همیشه خودتان را بروز نگه دارید.
عالی بود??
ممنون از اینکه برای مطالعه این مقاله وقت گذاشتید
آقا بسیار عالی و کاربردی بود
لذت بردم واقعا
خیلی خوشحالم از اینکه این مقاله برای شما کاربردی بوده
واقعا عالی و کابردی بود
کلی لذت بردم از خوندن این پست
سلام خسته نباشید عاااالی بود خدا خیرتون بده
سلام
شما هم خسته نباشی دوست عزیز
مرسی از اینکه وقت با ارزشتونو برای این مقاله گذاشتید
خیلی عالی بود ... فقط یه سوال : کاربرد header چی هست ؟ من شخصا بیشتر از تابع header برای رجوع به یه صفحه دیگه می کنم.
تشکر بابت وقتی که گذاشتید
بله درسته شما از header و پارامتر location استفاده میکنید تا به یک صفحه ی دیگه روجوع کنید ولی تابع header محدود به این کار نیست، همون طور که تو مقاله هم خوندید از header برای مشخص کردن نوع محتوای صفحه مورد نظرمون استفاده کردیم و گفتیم که قراره تو این صفحه JSON بشینه.
امیدوارم باعث رفع ابهام شده باشه.
درود به شما.
تشکر بابت آموزشتون.
اما! یه چیزی رو متوجه نشدم! این همه توضیح راجب HTTP و REST و API تهش چیزی از استفاده از پروتکلهای HTTP نبود!
نه از پروتکلها خبری بود نه از status codeها! به هر حال ممنون.
راستی «کدهای وضعیت یا status codes» درسته نه «وضعیت کد (code status)». :)
سلام دوست عزیز
بله همون طور تو ویدیو هم گفتیم قرار شد که Rest API ساده بزنیم و اگر Code status را جستجو کنید به نتیجه ای که بالا اشاره شد خواهید رسید.
و در آخر ممنون از وقتی که برای مطالعه این مقاله گذاشتید .
سلام ممنون از آموزشتون
من در هنگام دریافت اطلاعات رو بصورت زیر دریافت میکنم
{
"id": "36",
"name": "\u0627\u0646\u0648\u0627\u0639 \u062f\u0645\u0646\u0648\u0634"
},
بخش name متن فارسی هستش . چجوری میتونم این مشکل رو حل کنم؟
سلام
ممنون از شما برای وقتی که گذاشتید
برای دیتابیستون collation مناسب تعریف کردید؟
سلام - از Collation زیر استفاده کردم
utf8mb4_general_ci
لطفا پروژه کنونی رو توی گیت هاب آپلود کنید تا من بررسی کنم
سلام
عالیییی بود...واقعا ممنون
سلام
سپاس از شما
ممنون عالی بود واقعا ،خدا خیرت بده امیر جان
سلام حسین جان، خیلی خوشحالم که به کارت اومده
سلام ، من میخواستم اطلاعات یک سایت رو بگیرم و در سایت خودم نشان بدم، از API استفاده کنم بهتر هست یا استفاده از web service ؟ ، با فریم ورک لاراول کار میکنم.
سلام
اگه وب سایت مقصد شما به شما خدمات api را می دهد می توانید از api استفاده کنید
با سلام و وقت بخیر
آیا میتوان دستورات و کدهای مربوط به API را با زبان جاوااسکریپت و در نرم افزار visual studio زد؟
سلام و احترام
بله قطعا میتونید با جاوااسکریپت های api نویسی کرد. در بارهی نرم افزار visual studio باید بهتون بگم که این نرم افزار فقط یک IDE هستش و دخالتی توی نوشتن api نداره، صرفا بهمون کمک میکنه توی محیط مناسب کد نویسی کنیم.