{"id":27974862,"url":"https://github.com/notesparvvaresh/rest-api","last_synced_at":"2026-01-24T10:06:06.087Z","repository":{"id":286764799,"uuid":"962463097","full_name":"notesparvvaresh/REST-API","owner":"notesparvvaresh","description":"توضیح با مثال از کارکرد rest api و پروژه با flask","archived":false,"fork":false,"pushed_at":"2025-04-08T12:16:17.000Z","size":6,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-05-08T00:31:54.912Z","etag":null,"topics":["flask","rest-api"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/notesparvvaresh.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2025-04-08T07:38:02.000Z","updated_at":"2025-04-17T08:38:18.000Z","dependencies_parsed_at":"2025-04-08T09:25:27.544Z","dependency_job_id":null,"html_url":"https://github.com/notesparvvaresh/REST-API","commit_stats":null,"previous_names":["notesparvvaresh/rest-api"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/notesparvvaresh/REST-API","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/notesparvvaresh%2FREST-API","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/notesparvvaresh%2FREST-API/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/notesparvvaresh%2FREST-API/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/notesparvvaresh%2FREST-API/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/notesparvvaresh","download_url":"https://codeload.github.com/notesparvvaresh/REST-API/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/notesparvvaresh%2FREST-API/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28724377,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-24T08:27:05.734Z","status":"ssl_error","status_checked_at":"2026-01-24T08:27:01.197Z","response_time":89,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["flask","rest-api"],"created_at":"2025-05-08T00:28:24.567Z","updated_at":"2026-01-24T10:06:06.073Z","avatar_url":"https://github.com/notesparvvaresh.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# مثال ساده \n\n### فرض کن یه رستوران داریم 🍔\n\nتو وارد رستوران می‌شی، می‌خوای غذا سفارش بدی. یه **منو** جلوت می‌ذارن، تو از توش غذا انتخاب می‌کنی، به **گارسون** می‌گی چی می‌خوای، اونم میره به **آشپزخونه** می‌گه، غذا رو میاره برات.\n\nحالا تو این مثال:\n\n- **تو** = اپلیکیشن یا کاربر\n- **گارسون** = REST API\n- **آشپزخونه** = سرور یا دیتابیس\n- **منو** = لیست خدماتی که API ارائه می‌ده (مثلاً: \"لیست کاربران\"، \"افزودن محصول\"، \"حذف پیام\")\n\n---\n\n### REST API یعنی چی تو این داستان؟\n\nREST API مثل اون گارسونه‌ست که درخواست تو رو (مثلاً می‌خوای لیست غذاها رو ببینی یا یه غذا سفارش بدی) به سرور می‌فرسته و نتیجه‌ش رو میاره.\n\nتو هیچ وقت مستقیم با آشپزخونه (سرور) حرف نمی‌زنی، بلکه از طریق گارسون (API) باهاش در ارتباطی.\n\n---\n\n### یه مثال واقعی بزنم:\n\nفرض کن یه سایت فروشگاه داری. می‌خوای ازش با موبایل هم استفاده کنی.\n\nموبایل درخواست می‌ده به REST API:\n```\nGET https://example.com/products\n```\n\nمعنیش اینه: «سلام، لطفاً لیست محصولات رو بده.»\n\nو REST API (گارسون) می‌ره از سرور می‌پرسه و لیست رو برمی‌گردونه.\n\nجوابش ممکنه این‌طوری باشه (فرمت JSON):\n```json\n[\n  { \"id\": 1, \"name\": \"کفش ورزشی\", \"price\": 200000 },\n  { \"id\": 2, \"name\": \"کتونی سفید\", \"price\": 250000 }\n]\n```\n\n---\n\n### خلاصه‌ش:\n\nREST API یه پل ارتباطی بین دو سیستم هست که معمولاً با استفاده از اینترنت و فرمت‌های ساده مثل JSON کار می‌کنه. خیلی شبیه گارسون بین تو و آشپزخونه‌ست 😄\n\n\nدر ارتباط بین سیستم‌ها با استفاده از REST API، متدهای HTTP (همون روش‌های درخواست) نقش‌های متفاوتی دارند. در ادامه هرکدام رو با توضیح دقیق‌تر و مثال‌های ملموس بررسی می‌کنیم:\n\n---\n\n## ۱. GET: دریافت اطلاعات (خواندن منبع)\n\n**کارکرد:**\n- **هدف:** دریافت داده‌ها از سرور بدون ایجاد هر گونه تغییری در آن.\n- **ویژگی:** بدون وضعیت (stateless) است، به این معنی که سرور نیازی به نگه‌داشتن اطلاعات جلسه کاربر ندارد.\n\n**مثال:**\nتصور کن تو یک اپلیکیشن فروشگاه آنلاین هستی. وقتی لیست محصولات را می‌خواهی، یک درخواست GET به سرور ارسال می‌کنی:\n```\nGET /products\n```\nسرور به صورت JSON لیستی از محصولات را برمی‌گرداند بدون اینکه تغییری در اطلاعات صورت گیرد.\n\n---\n\n## ۲. POST: ایجاد منبع جدید\n\n**کارکرد:**\n- **هدف:** ارسال داده به سرور برای ایجاد یک منبع (مانند یک رکورد در پایگاه داده).\n- **ویژگی:** داده‌های ارسالی در بدنه (body) درخواست به سرور ارسال می‌شود و به‌عنوان ورودی جهت ایجاد منبع جدید استفاده می‌شود.\n\n**مثال:**\nفرض کن می‌خوای یک کتاب جدید به لیست کتاب‌ها اضافه کنی. با ارسال یک درخواست POST به سرور، اطلاعات کتاب جدید (مثلاً عنوان و نویسنده) در بدنه درخواست آمده و به لیست اضافه می‌شود:\n```\nPOST /books\n```\nبدنه JSON مثال:\n```json\n{\n  \"title\": \"کیمیاگر\",\n  \"author\": \"پائولو کوئیلو\"\n}\n```\nسرور پس از اضافه کردن کتاب جدید، معمولاً اطلاعات کتاب ایجاد شده (مانند ID جدید) را به همراه کد وضعیت 201 (Created) برمی‌گرداند.\n\n---\n\n## ۳. PUT: به‌روزرسانی منبع موجود\n\n**کارکرد:**\n- **هدف:** ارسال داده به سرور جهت به‌روزرسانی یا تغییر دادن یک منبع موجود.\n- **ویژگی:** داده‌های ارسالی جایگزین تمام یا بخشی از اطلاعات موجود می‌شود. معمولاً در درخواست PUT، کل منبع (یا نمایندگی کاملی از آن) در بدنه ارسال می‌شود.\n\n**مثال:**\nفرض کن کتابی در لیست کتاب‌ها وجود دارد که می‌خواهی عنوان آن را تغییر دهی. با ارسال درخواست PUT به این صورت، اطلاعات جدید به‌روز می‌شود:\n```\nPUT /books/2\n```\nبدنه JSON مثال:\n```json\n{\n  \"title\": \"1984 - نسخه به‌روز شده\",\n  \"author\": \"جورج اورول\"\n}\n```\nپس از دریافت این درخواست، سرور کتاب با ID=2 را به روزرسانی می‌کند و معمولاً پاسخ موفقیت‌آمیز (مثلاً 200 OK) برگردانده می‌شود.\n\n**نکته:**  \nگاهی PUT برای به‌روزرسانی کل منبع استفاده می‌شود. اگر بخواهیم تنها بخشی از اطلاعات را تغییر دهیم، ممکن است از متد PATCH استفاده شود.\n\n\n---\n\n### ✅ منظور از \"کل منبع\" چیه؟\n\nوقتی می‌گیم `PUT` برای به‌روزرسانی *کل منبع* استفاده می‌شه، یعنی باید **تمام اطلاعات اون منبع** رو دوباره بفرستی، حتی اونایی که تغییر نکردن.\n\n#### مثال:\nفرض کن این منبع رو داریم:\n```json\n{\n  \"id\": 1,\n  \"title\": \"1984\",\n  \"author\": \"George Orwell\"\n}\n```\n\nاگر بخوای فقط `title` رو با `PUT` تغییر بدی، باید همچنان `author` رو هم همراهش بفرستی، چون `PUT` انتظار داره کل شیء بازنویسی بشه:\n\n```json\n{\n  \"title\": \"Animal Farm\",\n  \"author\": \"George Orwell\"\n}\n```\n\nاگر `author` رو نفرستی، در بعضی پیاده‌سازی‌ها ممکنه حذف بشه یا مقدارش تغییر نکنه، بستگی به سرور داره.\n\n---\n\n### ✅ اما `PATCH` چطور؟\n\n`PATCH` فقط اون قسمت‌هایی از منبع رو تغییر می‌ده که مشخص شدن. بقیه‌ی اطلاعات دست‌نخورده باقی می‌مونن.\n\n#### مثال:\n```json\n{\n  \"title\": \"Animal Farm\"\n}\n```\n\nاین درخواست فقط `title` رو تغییر می‌ده و `author` همون‌جوری که بوده باقی می‌مونه.\n\n---\n\n### 🧠 جمع‌بندی ساده:\n\n| متد  | توضیح ساده | نیاز به ارسال کل داده‌ها | مناسب برای |\n|------|------------|--------------------------|--------------|\n| PUT  | بازنویسی کامل | بله                     | وقتی کل شیء رو می‌خوای جایگزین کنی |\n| PATCH| تغییر جزئی   | نه                      | وقتی فقط بخشی از داده رو می‌خوای عوض کنی |\n\n\n---\n\n## ۴. DELETE: حذف منبع موجود\n\n**کارکرد:**\n- **هدف:** ارسال درخواست به سرور جهت حذف یک منبع موجود.\n- **ویژگی:** با دریافت درخواست DELETE، سرور منبع مورد نظر را حذف کرده و معمولاً پیام یا کد وضعیت مناسبی (معمولاً 200 OK یا 204 No Content) برگردانده می‌شود.\n\n**مثال:**\nفرض کن می‌خواهی کتابی (مثلاً کتاب با شناسه 1) را از لیست کتاب‌ها حذف کنی:\n```\nDELETE /books/1\n```\nسرور کتاب با ID=1 را حذف کرده و تایید حذف شدن آن را به کلاینت اعلام می‌کند.\n\n---\n\n## خلاصه\n\n- **GET:** داده‌ها را از سرور می‌خواند؛ فقط برای دریافت اطلاعات است، بدون ایجاد تغییر.\n- **POST:** داده‌ها را به سرور می‌فرستد تا یک منبع جدید ایجاد کند.\n- **PUT:** داده‌های ارسالی را به عنوان اطلاعات جدید یک منبع موجود جایگزین می‌کند؛ یعنی بروزرسانی کامل می‌کند.\n- **DELETE:** درخواست حذف یک منبع را به سرور می‌فرستد.\n\nاین متدها چارچوب اصلی CRUD را پیاده‌سازی می‌کنند:\n- **C**reate (ایجاد) → POST  \n- **R**ead (خواندن) → GET  \n- **U**pdate (به‌روزرسانی) → PUT  \n- **D**elete (حذف) → DELETE\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnotesparvvaresh%2Frest-api","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnotesparvvaresh%2Frest-api","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnotesparvvaresh%2Frest-api/lists"}