
آموزش کامل RESTful API (رست فول) به زبان ساده
در این مقاله به صورت رایگان و جامع با آموزش Restful API همراه با شما هستیم.
شما میتوانید سرفصل مدنظر خود برای یادگیری را از فهرست محتوای این مقاله انتخاب کنید تا به قسمت مربوطه هدایت شوید.
چرا به RESTful APIها نیاز داریم؟
فرض کنید میخواهید از اپلیکیشن Book My Show استفاده کنید. واضح است که این اپلیکیشن به دادههای ورودی بسیاری نیاز دارد، چون دادههای موجود در آن استاتیک (Static) نیستند. اطلاعاتی مثل زمان اکران فیلمهای مختلف یا شهرهای مختلفی که فیلمهایی با زبانهای مختلف را در سانسهای مختلف نمایش میدهند. این دادهها هرگز استاتیک نیستند، که نشان میدهد دادههای این نوع اپلیکیشنها مدام تغییر میکنند.
حالا فکر میکنید ما این دادهها را از کجا میآوریم؟
این دادهها را اغلب از سرورها میگیریم که بیشتر با عنوان وبسرورها (Web Server) شناخته میشوند. کلاینت (Client) از طریق یک API اطلاعات موردنیازش را از سرور درخواست میکند (Request) و سرور به درخواست کلاینت پاسخ (Response) میدهد.
در اینجا، پاسخی که کلاینت دریافت میکند، یک صفحهی وب HTML است. اما فکر میکنید که آیا این پاسخی مناسب به درخواست شماست؟
خُب، فرض میکنیم که پاسخ شما “نه” باشد. چون ترجیح میدهید که دادههایتان را به صورت فرمتی ساختاریافته دریافت کنید، نه یک صفحهی وب کامل.
به همین دلیل، دادهای که سرور در پاسخ به درخواستتان برمیگرداند اغلب به فرمت JSON یا XML است. هر دو فرمت JSON و XML ساختاری سلسله مراتبی به داده میدهند.
ساده به نظر میرسد، مگر نه؟
مشکل اصلی این فریمورک تا به امروز این است که باید برای بهدست آوردن دادههایتان از متدهای (Method) بسیاری استفاده کنید. درنتیجه وقتی به دادههای پیچیده نیاز دارید، استفاده از این متدها مشکل میشود.
اینجاست که REST APIها به کمکمان میآیند. REST API یک شئ (Object) میسازد و مقادیر آن شئ را به عنوان پاسخ به کلاینت میفرستد.
خُب، حالا که فهمیدیم چرا به REST نیاز داریم، میتوانیم به سراغ تعریف آن برویم.
REST API چیست؟
REST API میگوید که از دادهی درخواستی کلاینت یک شئ بسازیم و مقادیر آن را به عنوان پاسخ ارسال کنیم. مثلاً، اگر کاربر اطلاعات یک فیلم را در شهر بنگلور در زمان و مکان خاصی میخواهد، میتوانید در سمت سرور یک شئ بسازید.
پس اینجا، یک شئ دارید و میخواهید State آن را ارسال کنید. به همین دلیل REST مخفف عبارت Representational State Transfer است.
پس میتوانیم Representational State Transfer یا همان REST را اینگونه تعریف کنیم: یک مدل معماری و رویکرد، که به منظور برقراری ارتباط در توسعهی وبسرویسهای مختلف کاربرد دارد.
معماری REST به استفادهی کمتر از پهنای باند اینترنت کمک میکند و درنتیجه اپلیکیشن از این منظور مناسبتر میشود. معمولاً به آن “زبان اینترنت”میگویند و کاملاً براساس منابع است.
برای اینکه بهتر REST APIها را بفهمیم، بیایید کمی بیشتر دربارهی شیوهی عملکرد آنها یاد بگیریم. اساساً REST API برای ساخت ماژول (Module)، یک تراکنش را به قسمتهای مختلف تقسیم میکند. هر کدام از این ماژولها به یکی از قسمتهای تراکنش پاسخ میدهند. این رویکرد انعطاف بالایی دارد، اما ساخت آن از پایه مشکل است.
حالا که فهمیدیم REST APIها چه هستند، میتوانیم به سراغ اصول و محدودیتهایی برویم که یک برنامه را تبدیل به یک REST API میکند.
معرفی کامل API و روش استفاده از آن به همراه مثال های کاربردی و ویدیو آموزشی را می توانید در لینک زیر مشاهده کنید:
آموزش API یا Applacation Programming Interface
اصول REST API
دکتر فیلدینگ (Dr. Fielding)، طراح اصلی REST API در سال 2000، 6 قانون اصلی را برای REST API تعیین کرد. در ادامه این 6 اصل را بررسی میکنیم:
Stateless
درخواستهایی که کلاینت به سرور میفرستد، حاوی تمام اطلاعات لازم است تا سرور بتواند آن درخواست را پردازش کند. این اطلاعات میتوانند بخشی از URL، پارامترهای پرسوجو، Body یا حتی Headerها باشند. از URL برای شناسایی منبع استفاده میشود و Body حاوی State منبع درخواستی است. وقتی سرور پردازش درخواست را به پایان رساند، پاسخ از طریق Body، Status یا Headerها برای کلاینت ارسال میشوند.
Client-Server
معماری کلاینت-سرور یک واسط یکسان میسازد که کلاینتها را از سرورها جدا میکند. این مسئله قابلیت حمل را در پلتفرمهای مختلف بالا میبرد و قابلیت مقیاسپذیری کامپوننتهای سرور را افزایش میدهد.
Uniform Interface
REST برای رسیدن به ساختاری یکنواخت در اپلیکیشن، 4 محدودیت را برای واسط ارائه میکند:
- شناسایی منبع
- تغییر منبع با استفاده از المنتهای نمایش
- پیغامهای دارای توضیح
- ابررسانه به عنوان موتور State اپلیکیشن
Cacheable
اپلیکیشنها اغلب برای ارائهی کارایی بهتر دارای قابلیت کَش هستند. میتوان به صورت صریح یا غیرصریح به پاسخ سرور لیبل “درای قابلیت کش” یا “بدون قابلیت کش” زد. اگر پاسخ به صورت Cacheable باشد، آن وقت کلاینت میتوانند برای درخواستهای مشابه در آینده از همان پاسخ مجدداً استفاده کند.
دورههای مرتبط در فرانش
Layered System
معماری لایهای با محدود کردن رفتار کامپوننتها به پایداری بیشتر اپلیکیشن کمک میکند. این معماری امنیت اپلیکیشن را افزایش میدهد، چون هر لایه تنها میتواند با لایهی بعدی خود ارتباط داشته باشد. همچنین میتوان از تعادل بار و کشهای مشترک برای افزایش مقیاسپذیری استفاده کرد.
Code on Demand
این یکی از محدودیتهای اخیتاری است و کمتر از بقیهی موارد استفاده میشود. در این حالت میتوان کد کلاینت یا Applet را دانلود و در برنامه از آن استفاده کرد. این مسئله با ایجاد یک اپلیکیشن هوشمند که به ساختار کد خود وابسته نیست، کلاینتها را سادهتر میکند.
حالا که اصول REST API را یاد گرفتیم، بهتر است به سراغ متدهایشان برویم.
متدهای REST API
همهی کسانی که با فناوری وب کار میکنند، عملیاتهای CRUD را انجام میدهند. منظورمان از عملیاتهای CRUD، ساخت یک منبع، خواندن از یک منبع، آپدیت یک منبع و حذف یک منبع است. برای انجام این کارها میتوانیم از متدهای HTML استفاده کنیم که در واقع متدهای REST API هستند. تصویر زیر را ببینید:
خُب، حالا که میدانید REST API چیست و تمام اطلاعات لازم را برای ساخت یک اپلیکیشن خوب یاد گرفتید، میتوانیم به سراغ فرایند ساخت یک REST API برویم.
آموزش REST API
در این مثال عملی، با هم با استفاده از Node.js یک اپلیکیشن REST ساده با قابلیتهای CRUD میسازیم. برای ساخت این اپلیکیشن باید موارد زیر را نصب کنید:
- Node.js
- Express.js
- Joi
- (Nodemon (Node Monitor
برای نوشتن کدها از WebStorm IDE استفاده میکنیم. میتوانید از IDE یا ویرایشگر متن دلخواهتان استفاده کنیم. خُب، بیایید شروع کنیم.
در این دوره نوحه نوشتن یک API استاندارد را در NodeJS آموزش میبینید:
چگونه یک API استاندارد با NodeJS بسازیم؟
گام 1
یک پوشهی پروژه بسازید که تمام فایلهای پروژهی جاری در آن قرار میگیرند. بعد Commands Prompt را باز کنید و به پوشهی مورد نظر بروید. به شکل زیر دقت کنید:
گام 2
حالا nmp را با دستور زیر فراخوانی کنید. این دستور ماژولهای nmp را در سیستمتان راهاندازی میکند.
npm init
Enter بزنید. حالا Node.js جزئیات پروژه را از شما میپرسد. این جزئیات در واقع متادیتا (Metadata) پروژه هستند. به شکل زیر دقت کنید.
در اینجا میتوانید نقطهی شروع برنامه (Entry Point) و اطلاعات دیگری را تعیین کنید. در این آموزش از script.js به عنوان نقطهی شروع اجرای برنامه استفاده میکنیم.
سپس باید دادههایتان را تأیید کنید. برای تأیید Y را تایپ کنید. به شکل زیر دقت کنید.
دورههای مرتبط در فرانش
گام 3
با استفاده از دستور زیر، Epress.js را نصب کنید:
npm i express
Express یک فریمورک تحت وب است که میتوان از آن در کنار Node.js استفاده کرد. با استفاده از این فریمورک میتوانید Restful API بسازید و با استفاده از متدهای helper و لایههای میانی اپلیکیشن خود را کانفیگر کنید.
گام 3.1: به همین شکل Joi را رسم کنید.
npm i joi
با استفاده از این پکیج میتوانید برای اشیاء جاوااسکریپت طرح تعیین کنید. این اشیاء اطلاعاتی را برای تأیید صحت اطلاعات کلید، ذخیره میکنند.
گام 3.2: در نهایت پکیج مدیریتی nodemon را با دستور زیر نصب کنید.
npm i -g nodemon
nodemon بر تمام فایلهای پوشه با هر نوع پسوندی نظارت میکند. با نصب این پکیج لازم نیست با اعمال هر نوع تغییراتی، سرور Node.js را ریاستارت کنید. nodemon تغییرات را پیدا کرده و سرور را برایتان ریاستارت میکند.
package.json
{ "name": "restapidemo", "version": "1.0.0", "description": "Creation of REST API", "main": "script.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "sahiti_kappagantula", "license": "ISC", "dependencies": { "express": "^4.17.1", "joi": "^14.3.1" } }
Script.js
const express = require('express'); //Import Express const Joi = require('joi'); //Import Joi const app = express(); //Create Express Application on the app variable app.use(express.json()); //used the json file //Give data to the server const customers = [ {title: 'George', id: 1}, {title: 'Josh', id: 2}, {title: 'Tyler', id: 3}, {title: 'Alice', id: 4}, {title: 'Candice', id: 5} ] //Read Request Handlers // Display the Message when the URL consist of '/' app.get('/', (req, res) => { res.send('Welcome to Edurekas REST API!'); }); // Display the List Of Customers when URL consists of api customers app.get('/api/customers', (req,res)=> { res.send(customers); }); // Display the Information Of Specific Customer when you mention the id. app.get('/api/customers/:id', (req, res) => { const customer = customers.find(c => c.id === parseInt(req.params.id)); //If there is no valid customer ID, then display an error with the following message if (!customer) res.status(404).send('<h2 style="font-family: Malgun Gothic; color: darkred;">Ooops... Cant find what you are looking for!</h2>'); res.send(customer); }); //CREATE Request Handler //CREATE New Customer Information app.post('/api/customers', (req, res)=> { const { error } = validateCustomer(req.body); if (error){ res.status(400).send(error.details[0].message) return; } //Increment the customer id const customer = { id: customers.length + 1, title: req.body.title }; customers.push(customer); res.send(customer); }); //Update Request Handler // Update Existing Customer Information app.put('/api/customers/:id', (req, res) => { const customer = customers.find(c=> c.id === parseInt(req.params.id)); if (!customer) res.status(404).send('<h2 style="font-family: Malgun Gothic; color: darkred;">Not Found!! </h2>'); const { error } = validateCustomer(req.body); if (error){ res.status(400).send(error.details[0].message); return; } customer.title = req.body.title; res.send(customer); }); //Delete Request Handler // Delete Customer Details app.delete('/api/customers/:id', (req, res) => { const customer = customers.find( c=> c.id === parseInt(req.params.id)); if(!customer) res.status(404).send('<h2 style="font-family: Malgun Gothic; color: darkred;"> Not Found!! </h2>'); const index = customers.indexOf(customer); customers.splice(index,1); res.send(customer); }); //Validate Information function validateCustomer(customer) { const schema = { title: Joi.string().min(3).required() }; return Joi.validate(customer, schema); } //PORT ENVIRONMENT VARIABLE const port = process.env.PORT || 8080; app.listen(port, () => console.log(`Listening on port ${port}..`));
گام 4
حالا باید بررسی کنیم که آیا Handlerها به درستی کار میکنند یا خیر. برای اینکار از یک اکستنشن گوگل کروم (Google Chrome Extension) به نام Postman استفاده میکنیم. برای نصب Postman اینجا کلیک کنید.
گام 5
بعد از نصب Postman، برای تست اپلیکیشن آن را باز کنید.
گام 6
اما پیش از آن باید سرور را راهاندازی کنید. برای راهاندازی سرور، از دستور زیر استفاده کنید:
node script.js
خروجی زیر را خواهید دید:
بیایید با تست متد GET شروع کنیم.
گام 7
برای این کار باید از لیست، GET را انتخاب کنید. URL تعریفشده را وارد کنید و گزینهی send را بزنید.
اگر کدتان به درستی کار کند، لیست تمام مشتریهایی (Customer) را که به صورت دستی در کد اضافه کردهایم، خواهید دید. در شکل زیر میبینید که نتیجه به چه شکل خواهد بود. URL در اینجا localhost:8080/api/customers تعریف شده است.
گام 8
حالا بیایید یک مشتری جدید به لیستمان اضافه کنیم. برای انجام این کار، POST را از لیست انتخاب کنید و URL موردنظر را برای متد POST تعریف کنید. سپس روی Body کلید کنید. raw را انتخاب کنید. سپس JSON را از لیستی که در شکل زیر مشخص است، انتخاب کنید. حالا در Text Area، نام مشتری جدید را مطابق شکل وارد و send کنید.
اگر متد POST به درستی کار کند، نام مشتری جدید را به همراه Customer ID در بدنهی پاسخ خواهید دید. اگر دقت کنید میبینید که در اینجا فقط نام را تعریف کردهایم و به آن ID ندادهایم. در این حالت Customer ID به صورت خودکار تولید میشود.
گام 9
حالا بیایید نام یکی از مشتریها را آپدیت کنیم. برای اینکار مشتری با Customer ID = 3 را انتخاب میکنیم. برای اینکار باید PUT را از جدول انتخاب کنید و سپس URL درخواست PUT را به همراه ID مورد نظر وارد کنید. سپس در Body نام جدید مشتری را وارد کرده و Enter را بزنید.
پاسخی حاویِ customer ID و نام جدید مشتری دریافت خواهید کرد.
گام 10
در نهایت بیایید یک درخواست DELETE ارسال و رکوردی را حذف کنیم. برای اینکار، DELETE را از لیست انتخاب کنید، URL را برای درخواست DELETE و اطلاعات مشتری موردنظر را وارد کنید و Enter را بزنید. فرض کنیم میخواهیم اطلاعات مشتری با شماره ID = 3 را حذف کنیم. اگر تراکنش به خوبی انجام شود، اطلاعات رکورد حذف شده را به صورت کامل در بدنهی پاسخ خواهید دید.
حالا بیایید یک درخواست GET را برای لیست پایانی مشتریها ارسال کنیم.
همانطور که در شکل بالا میبینید، بدنهی پاسخ شامل 5 مشتری است که مشتری با Id 3 در بین آنها نیست، چون آن را حذف کردهایم.
به پایان این آموزش REST APIها رسیدیم. امیدواریم در پایان این مقاله، شما با ساختار RESTful به صورت کامل آشنا شده باشید. هرگونه پیشنهاد یا انتقادی را در بخش دیدگاه انتهای مقاله ثبت کنید.
دورههای مرتبط در فرانش
سلام
دم همتون گرم لذت بردم ، واقعا دست خوش ، خیلی خیلی خیلی خوب بود مقالتون امیدوارم همیشه سلامت باشید و تندرست
سلام امیرعباس عزیز
خواهش میکنم
انصافا دمه تیم برنامهنویسیتون گرم.
صفحات سایت شبیه به اپلیکیشن از پیش بارگزاری شده باز میشه و من شخصا لذت می برم از مطالعه مقاله ها با این کیفیت و تمیزی سایت
سلام فریدجان
ممنونم از لطفتون و این ک خداروشکر رضایت کامل دارید.