دانشیار ای تی آموزش کامل 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 در سال ۲۰۰۰، ۶ قانون اصلی را برای REST API تعیین کرد. در ادامه این ۶ اصل را بررسی می‌کنیم:

Stateless

درخواست‌هایی که کلاینت به سرور می‌فرستد، حاوی تمام اطلاعات لازم است تا سرور بتواند آن درخواست را پردازش کند. این اطلاعات می‌توانند بخشی از URL، پارامترهای پرس‌وجو، Body یا حتی Headerها باشند. از URL برای شناسایی منبع استفاده می‌شود و Body حاوی State منبع درخواستی است. وقتی سرور پردازش درخواست را به پایان رساند، پاسخ از طریق Body، Status یا Headerها برای کلاینت ارسال می‌شوند.

Client-Server

معماری کلاینت-سرور یک واسط یکسان می‌سازد که کلاینت‌ها را از سرورها جدا می‌کند. این مسئله قابلیت حمل را در پلتفرم‌های مختلف بالا می‌برد و قابلیت مقیاس‌پذیری کامپوننت‌های سرور را افزایش می‌دهد.

Uniform Interface

REST برای رسیدن به ساختاری یکنواخت در اپلیکیشن، ۴ محدودیت را برای واسط ارائه می‌کند:

  • شناسایی منبع
  • تغییر منبع با استفاده از المنت‌های نمایش
  • پیغام‌های دارای توضیح
  • ابررسانه به عنوان موتور State اپلیکیشن

Cacheable

اپلیکیشن‌ها اغلب برای ارائه‌ی کارایی بهتر دارای قابلیت کَش هستند. می‌توان به صورت صریح یا غیرصریح به پاسخ سرور لیبل “درای قابلیت کش” یا “بدون قابلیت کش” زد. اگر پاسخ به صورت Cacheable باشد، آن وقت کلاینت می‌توانند برای درخواست‌های مشابه در آینده از همان پاسخ مجدداً استفاده کند.

دوره‌های مرتبط در دانشیار آی تی

Layered System

معماری لایه‌ای با محدود کردن رفتار کامپوننت‌ها به پایداری بیشتر اپلیکیشن کمک می‌کند. این معماری امنیت اپلیکیشن را افزایش می‌دهد، چون هر لایه تنها می‌تواند با لایه‌ی بعدی خود ارتباط داشته باشد. هم‌چنین می‌توان از تعادل بار و کش‌های مشترک برای افزایش مقیاس‌پذیری استفاده کرد.

Code on Demand

این یکی از محدودیت‌های اخیتاری است و کمتر از بقیه‌ی موارد استفاده می‌شود. در این حالت می‌توان کد کلاینت یا Applet را دانلود و در برنامه از آن استفاده کرد. این مسئله با ایجاد یک اپلیکیشن هوشمند که به ساختار کد خود وابسته نیست، کلاینت‌ها را ساده‌تر می‌کند.

حالا که اصول REST API را یاد گرفتیم، بهتر است به سراغ متدهایشان برویم.

آموزش Web API بک اند با C#

پیشنهاد دانشیار آی تی به شما

آموزش Web API بک‌اند با C#: گام‌ به گام پروژه محور

خواندن مطلب

متدهای REST API

همه‌ی کسانی که با فناوری وب کار می‌کنند، عملیات‌های CRUD را انجام می‌دهند. منظورمان از عملیات‌های CRUD، ساخت یک منبع، خواندن از یک منبع، آپدیت یک منبع و حذف یک منبع است. برای انجام این کارها می‌توانیم از متدهای HTML استفاده کنیم که در واقع متدهای REST API هستند. تصویر زیر را ببینید:

متدهای REST API
متدهای REST API

خُب، حالا که می‌دانید REST API چیست و تمام اطلاعات لازم را برای ساخت یک اپلیکیشن خوب یاد گرفتید، می‌توانیم به سراغ فرایند ساخت یک REST API برویم.

آموزش REST API

در این مثال عملی، با هم با استفاده از Node.js یک اپلیکیشن REST ساده با قابلیت‌های CRUD می‌سازیم. برای ساخت این اپلیکیشن باید موارد زیر را نصب کنید:

  1. Node.js
  2. Express.js
  3. Joi
  4. (Nodemon (Node Monitor

برای نوشتن کدها از WebStorm IDE استفاده می‌کنیم. می‌توانید از IDE یا ویرایشگر متن دلخواهتان استفاده کنیم. خُب، بیایید شروع کنیم.

در این دوره نوحه نوشتن یک API استاندارد را در NodeJS آموزش می‌بینید:

چگونه یک API استاندارد با NodeJS بسازیم؟

گام ۱

یک پوشه‌ی پروژه بسازید که تمام فایل‌های پروژه‌ی جاری در آن قرار می‌گیرند. بعد Commands Prompt را باز کنید و به پوشه‌ی مورد نظر بروید. به شکل زیر دقت کنید:

وارد پوشه موردنظر از طریق Commands Prompt شوید
وارد پوشه موردنظر از طریق Commands Prompt شوید

گام ۲

حالا nmp را با دستور زیر فراخوانی کنید. این دستور ماژول‌های nmp را در سیستم‌تان راه‌اندازی می‌کند.

npm init

Enter بزنید. حالا Node.js جزئیات پروژه را از شما می‌پرسد. این جزئیات در واقع متادیتا (Metadata) پروژه هستند. به شکل زیر دقت کنید.

پرسیدن جزییات پروژه
پرسیدن جزییات پروژه

در اینجا می‌توانید نقطه‌ی شروع برنامه (Entry Point) و اطلاعات دیگری را تعیین کنید. در این آموزش از script.js به عنوان نقطه‌ی شروع اجرای برنامه استفاده می‌کنیم.

سپس باید داده‌هایتان را تأیید کنید. برای تأیید Y را تایپ کنید. به شکل زیر دقت کنید.

برای تأیید Y را تایپ کنید
برای تأیید Y را تایپ کنید

دوره‌های مرتبط در دانشیار آی تی

گام ۳

با استفاده از دستور زیر، Epress.js را نصب کنید:

npm i express

 

Express یک فریمورک تحت وب است که می‌توان از آن در کنار Node.js استفاده کرد. با استفاده از این فریمورک می‌توانید Restful API بسازید و با استفاده از متدهای helper و لایه‌های میانی اپلیکیشن خود را کانفیگر کنید.

گام ۳٫۱: به همین شکل Joi را رسم کنید.

npm i joi

با استفاده از این پکیج می‌توانید برای اشیاء جاوااسکریپت طرح تعیین کنید. این اشیاء اطلاعاتی را برای تأیید صحت اطلاعات کلید، ذخیره می‌کنند.

گام ۳٫۲: در نهایت پکیج مدیریتی 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('

Ooops... Cant find what you are looking for!

'); 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('

Not Found!!

'); 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('

Not Found!!

'); 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}..`));

گام ۴

حالا باید بررسی کنیم که آیا Handlerها به درستی کار می‌کنند یا خیر. برای اینکار از یک اکستنشن گوگل کروم (Google Chrome Extension) به نام Postman استفاده می‌کنیم. برای نصب Postman اینجا کلیک کنید.

نصب Postman
نصب Postman

گام ۵

بعد از نصب Postman، برای تست اپلیکیشن آن را باز کنید.

آموزش node.js

پیشنهاد دانشیار آی تی به شما

آموزش Node.js رایگان – راهنمای جامع مبتدیان پروژه محور

خواندن مطلب

گام ۶

اما پیش از آن باید سرور را راه‌اندازی کنید. برای راه‌اندازی سرور، از دستور زیر استفاده کنید:

node script.js

خروجی زیر را خواهید دید:

بیایید با تست متد GET شروع کنیم.

گام ۷

برای این کار باید از لیست، GET را انتخاب کنید. URL تعریف‌شده‌ را وارد کنید و گزینه‌ی send را بزنید.

اگر کدتان به درستی کار کند، لیست تمام مشتری‌هایی (Customer) را که به صورت دستی در کد اضافه کرده‌ایم، خواهید دید. در شکل زیر می‌بینید که نتیجه به چه شکل خواهد بود. URL در اینجا localhost:8080/api/customers تعریف شده است.

متد GET را انتخاب، URL را وارد و SEND را بزنید
متد GET را انتخاب، URL را وارد و SEND را بزنید

گام ۸

حالا بیایید یک مشتری جدید به لیست‌مان اضافه کنیم. برای انجام این کار، POST را از لیست انتخاب کنید و URL موردنظر را برای متد POST تعریف کنید. سپس روی Body کلید کنید. raw را انتخاب کنید. سپس JSON را از لیستی که در شکل زیر مشخص است، انتخاب کنید. حالا در Text Area، نام مشتری جدید را مطابق شکل وارد و send کنید.

انجام عملیات post
انجام عملیات post

اگر متد POST به درستی کار کند، نام مشتری جدید را به همراه Customer ID در بدنه‌ی پاسخ خواهید دید. اگر دقت کنید می‌بینید که در اینجا فقط نام را تعریف کرده‌ایم و به آن ID نداده‌ایم. در این حالت Customer ID به صورت خودکار تولید می‌شود.

گام ۹

حالا بیایید نام یکی از مشتری‌ها را آپدیت کنیم. برای اینکار مشتری با Customer ID = 3 را انتخاب می‌کنیم. برای اینکار باید PUT را از جدول انتخاب کنید و سپس URL درخواست PUT را به همراه ID مورد نظر وارد کنید. سپس در Body نام جدید مشتری را وارد کرده و Enter را بزنید.

پاسخی حاویِ customer ID و نام جدید مشتری دریافت خواهید کرد.

چگونگی عملیات PUT
چگونگی عملیات PUT

گام ۱۰

در نهایت بیایید یک درخواست DELETE ارسال و رکوردی را حذف کنیم. برای اینکار، DELETE را از لیست انتخاب کنید، URL را برای درخواست DELETE و اطلاعات مشتری موردنظر را وارد کنید و Enter را بزنید. فرض کنیم می‌خواهیم اطلاعات مشتری با شماره ID = 3 را حذف کنیم. اگر تراکنش به خوبی انجام شود، اطلاعات رکورد حذف شده را به صورت کامل در بدنه‌ی پاسخ خواهید دید.

چگونه توسط DELETE، یک رکورد را حذف کنیم
چگونه توسط DELETE، یک رکورد را حذف کنیم

حالا بیایید یک درخواست GET را برای لیست پایانی مشتری‌ها ارسال کنیم.

چگونگی ارسال درخواست GET
چگونگی ارسال درخواست GET

 

همانطور که در شکل بالا می‌بینید، بدنه‌ی پاسخ شامل ۵ مشتری است که مشتری با Id 3 در بین آنها نیست، چون آن را حذف کرده‌ایم.

به پایان این آموزش REST APIها رسیدیم. امیدواریم در پایان این مقاله، شما با ساختار RESTful به صورت کامل آشنا شده باشید. هرگونه پیشنهاد یا انتقادی را در بخش دیدگاه انتهای مقاله ثبت کنید.

دوره‌های مرتبط در دانشیار آی تی

به این پست امتیاز دهید.
بازدید : 440 views بار دسته بندی : برنامه‌نویسی تاريخ : 12 نوامبر 2022 به اشتراک بگذارید :
دیدگاه کاربران
    • دیدگاه ارسال شده توسط شما ، پس از تایید توسط مدیران سایت منتشر خواهد شد.
    • دیدگاهی که به غیر از زبان فارسی یا غیر مرتبط با مطلب باشد منتشر نخواهد شد.