متدهای HTTP در روت فلاسک، روتها (Routes) به عنوان آدرسهای URL عمل میکنند که به توابع خاصی در برنامه ما متصل میشوند. این توابع که هندلر نامیده میشوند، زمانی اجرا میشوند که یک درخواست با آن آدرس خاص به سرور ارسال شود. هر درخواست HTTP دارای یک متد (Method) است که نوع عملیاتی را که میخواهیم روی منبع انجام دهیم مشخص میکند. متداولترین متدهای HTTP عبارتند از:
متداولترین متدهای HTTP
متدهای HTTP روشهایی هستند که برای درخواست منابع از یک سرور وب استفاده میشوند. هر متد یک عمل خاص را روی یک منبع مشخص میکند. در ادامه به بررسی متداولترین متدهای HTTP میپردازیم:
GET
متد GET یکی از متداولترین متدهای HTTP است که برای دریافت اطلاعات از یک سرور استفاده میشود. زمانی که یک درخواست GET ارسال میشود، سرور منبع مورد نظر را بدون ایجاد تغییری در آن برمیگرداند.
نحوه استفاده
-
-
- ساختار درخواست:
GET /resource HTTP/1.1 Host: example.com
در این مثال،
GET
متد درخواست،/resource
آدرس منبع مورد نظر، وHTTP/1.1
نسخه پروتکل HTTP را مشخص میکنند. - پاسخ سرور: اگر درخواست موفقیتآمیز باشد، سرور یک کد وضعیت ۲۰۰ (OK) و محتوای منبع را برمیگرداند.
- ساختار درخواست:
-
مثالها
-
-
- دریافت یک صفحه وب: وقتی آدرس یک صفحه وب را در مرورگر خود تایپ میکنید، در واقع یک درخواست GET ارسال میکنید.
- دریافت دادهها از یک API: بسیاری از APIها از متد GET برای ارائه دادهها به برنامههای مشتری استفاده میکنند.
- دریافت تصویر یا فایل: برای دانلود یک تصویر یا فایل، معمولاً یک درخواست GET ارسال میشود.
-
نکات مهم
-
-
- ایمنی: اطلاعات ارسال شده در یک درخواست GET در آدرس URL قرار میگیرند و بنابراین برای همه قابل مشاهده هستند. برای ارسال اطلاعات حساس، از متد POST استفاده کنید.
- کَش شدن: نتایج درخواستهای GET معمولاً توسط مرورگرها و سرورهای واسط کَش میشوند تا بار روی سرور کاهش یابد. این ممکن است در برخی موارد باعث شود که دادههای قدیمی نمایش داده شوند.
- محدودیت طول URL: برخی از سرورها محدودیت طول URL دارند، بنابراین ممکن است نتوانید آدرسهای بسیار طولانی را با GET ارسال کنید.
-
مثالهای عملی از متد GET در HTTP
درخواست GET برای دریافت اطلاعات از یک سرور بسیار پرکاربرد است. در اینجا چند مثال عملی از نحوه استفاده از متد GET آورده شده است:
۱. دریافت یک صفحه وب
-
-
- آدرس:
https://www.example.com
- عملکرد: وقتی این آدرس را در مرورگر خود تایپ میکنید، در واقع یک درخواست GET برای دریافت صفحه اصلی وبسایت example.com ارسال میکنید.
- آدرس:
-
۲. دریافت داده از یک API
-
-
- آدرس:
https://api.example.com/users
- عملکرد: این درخواست، لیستی از تمام کاربران را از یک API دریافت میکند.
- آدرس:
-
۳. جستجو در یک موتور جستجو
-
-
- آدرس:
https://www.google.com/search?q=python
- عملکرد: این درخواست، نتایج جستجو برای عبارت “python” را از گوگل دریافت میکند. همانطور که میبینید، پارامتر جستجو (
q=python
) به عنوان بخشی از آدرس URL ارسال میشود.
- آدرس:
-
۴. دریافت اطلاعات آب و هوا
-
-
- آدرس:
https://api.openweathermap.org/data/2.5/weather?q=Tehran&appid=your_api_key
- عملکرد: این درخواست، اطلاعات آب و هوای شهر تهران را از API OpenWeatherMap دریافت میکند. پارامترهای
q
وappid
به ترتیب برای مشخص کردن شهر و کلید API استفاده میشوند.
- آدرس:
-
مثال در برنامهنویسی (پایتون با استفاده از کتابخانه requests)
import requests
response = requests.get('https://api.github.com/users/defunkt')
json_response = response.json()
print(json_response['name'])
در این مثال، ما یک درخواست GET به API GitHub برای دریافت اطلاعات کاربری با نام کاربری “defunkt” ارسال میکنیم. سپس، پاسخ دریافتی را به یک شیء JSON تبدیل کرده و نام کاربر را چاپ میکنیم.
نکات مهم هنگام استفاده از GET:
-
-
- امنیت: از ارسال اطلاعات حساس مانند رمز عبور یا اطلاعات کارت اعتباری در درخواستهای GET خودداری کنید، زیرا این اطلاعات در آدرس URL قابل مشاهده هستند.
- کَش شدن: نتایج درخواستهای GET معمولاً کَش میشوند تا بار روی سرور کاهش یابد. اگر به دادههای بهروز نیاز دارید، میتوانید از پارامترهای اضافی برای جلوگیری از کَش شدن استفاده کنید.
- محدودیت طول URL: برخی از سرورها محدودیت طول URL دارند، بنابراین برای ارسال دادههای زیاد از POST استفاده کنید.
- ایدئمپوتنت بودن: یک درخواست GET ایدئمپوتنت است، به این معنی که ارسال چندین درخواست GET با همان پارامترها نتیجه یکسانی خواهد داشت.
-
به طور خلاصه، متد GET یک روش ساده و کارآمد برای دریافت اطلاعات از یک سرور است. با در نظر گرفتن نکات امنیتی و محدودیتهای آن، میتوانید از این متد به طور مؤثر در برنامههای خود استفاده کنید.
POST
متد POST یکی از متداولترین متدهای HTTP است که برای ارسال داده به یک سرور استفاده میشود. دادههای ارسال شده در بدنه درخواست قرار میگیرند و معمولاً برای ایجاد یک منبع جدید، انجام یک عملیات خاص روی سرور یا ارسال فرمها استفاده میشود.
نحوه استفاده
-
- ساختار درخواست:
POST /resource HTTP/1.1 Host: example.com Content-Type: application/x-www-form-urlencoded Content-Length: 28 username=john&password=doe
در این مثال،
POST
متد درخواست،/resource
آدرس منبع مورد نظر،Content-Type
نوع داده ارسال شده،Content-Length
طول دادههای ارسال شده وusername=john&password=doe
دادههای ارسال شده در بدنه درخواست را مشخص میکنند. - پاسخ سرور: اگر درخواست موفقیتآمیز باشد، سرور یک کد وضعیت ۲۰۰ (OK) یا ۲۰۱ (Created) و ممکن است یک پاسخ حاوی اطلاعات مربوط به منبع جدید ایجاد شده را برمیگرداند.
- ساختار درخواست:
مثالها
-
- ارسال یک فرم: وقتی یک فرم در یک وبسایت را پر میکنید و دکمه ارسال را کلیک میکنید، در واقع یک درخواست POST ارسال میکنید.
- ایجاد یک حساب کاربری: برای ایجاد یک حساب کاربری جدید، معمولاً یک درخواست POST ارسال میکنید.
- آپلود یک فایل: برای آپلود یک فایل به سرور، از متد POST استفاده میکنید.
- ارسال دادهها به یک API: بسیاری از APIها از متد POST برای دریافت دادههای ورودی از برنامههای مشتری استفاده میکنند.
نکات مهم
-
- امنیت: دادههای ارسال شده در یک درخواست POST در بدنه درخواست قرار میگیرند و معمولاً از دید عموم پنهان هستند. این باعث میشود که POST برای ارسال اطلاعات حساس مناسبتر از GET باشد.
- کَش شدن: نتایج درخواستهای POST معمولاً کَش نمیشوند، زیرا ممکن است باعث تغییرات در دادههای سرور شوند.
- ایدئمپوتنت نبودن: یک درخواست POST ایدئمپوتنت نیست، به این معنی که ارسال چندین درخواست POST با همان پارامترها ممکن است نتایج متفاوتی ایجاد کند.
خلاصه
متد POST برای ارسال داده به یک سرور استفاده میشود. این متد برای ارسال اطلاعات حساس و ایجاد منابع جدید مناسب است. با رعایت نکات امنیتی و در نظر گرفتن ویژگیهای POST، میتوانید از این متد به طور مؤثر در برنامههای خود استفاده کنید.
مثالهای کاربردی متد POST در دنیای واقعی
متد POST در بسیاری از عملیاتهای وب استفاده میشود. در اینجا چند مثال کاربردی از این متد آورده شده است:
۱. ارسال فرمها
-
- ثبتنام در سایتها: هنگام ثبتنام در یک سایت، اطلاعاتی مانند نام کاربری، رمز عبور و ایمیل به سرور ارسال میشود تا یک حساب کاربری جدید ایجاد شود.
- تماس با ما: هنگام پر کردن فرم تماس با ما، اطلاعات شما مانند نام، ایمیل و پیام به سرور ارسال میشود.
- پرداخت آنلاین: اطلاعات کارت اعتباری و سایر اطلاعات پرداخت هنگام انجام یک تراکنش آنلاین از طریق یک فرم POST ارسال میشود.
۲. API ها
-
- ایجاد منابع جدید: برای ایجاد یک منبع جدید در یک API (مانند ایجاد یک کاربر جدید، ایجاد یک پست جدید در یک بلاگ)، معمولاً از متد POST استفاده میشود.
- آپلود فایل: برای آپلود یک فایل به یک سرور، معمولاً از متد POST استفاده میشود.
۳. وبسرویسها
-
- ارسال درخواستها: در بسیاری از وبسرویسها، برای ارسال درخواستها و دریافت پاسخ، از متد POST استفاده میشود.
مثال عملی در پایتون با استفاده از کتابخانه requests
import requests
url = 'https://api.example.com/users'
data = {'name': 'Ali', 'email': 'ali@example.com'}
response = requests.post(url, json=data)
if response.status_code == ۲۰۱:
print('کاربر با موفقیت ایجاد شد')
else:
print('خطا در ایجاد کاربر')
در این مثال، ما یک درخواست POST به یک API فرستادهایم تا یک کاربر جدید با نام و ایمیل مشخص ایجاد کنیم.
چرا از POST به جای GET استفاده میکنیم؟
انتخاب بین متدهای GET و POST در درخواستهای HTTP بستگی به نوع دادهای دارد که میخواهیم ارسال کنیم و عملیاتی که میخواهیم انجام دهیم. هر کدام از این متدها مزایا و معایب خاص خود را دارند.
دلایل اصلی استفاده از POST به جای GET:
-
-
امنیت:
- پنهانکاری دادهها: اطلاعاتی که از طریق POST ارسال میشوند در بدنه درخواست قرار میگیرند و در آدرس URL نمایش داده نمیشوند. این امر باعث میشود که دادههای حساس مانند رمز عبور، اطلاعات کارت اعتباری و سایر اطلاعات شخصی از دید عموم پنهان بمانند.
- جلوگیری از تزریق SQL: با استفاده از POST، احتمال تزریق SQL کاهش مییابد، زیرا دادهها به طور مستقیم در URL قرار نمیگیرند.
-
اندازه داده:
- بدون محدودیت: برخلاف GET که طول URL محدودیت دارد، POST محدودیت کمتری برای حجم دادههای ارسال شده دارد. بنابراین برای ارسال فایلها یا دادههای حجیم، POST مناسبتر است.
-
ایجاد تغییرات:
- تغییرات در سرور: POST معمولاً برای ایجاد تغییرات در سرور استفاده میشود، مانند ایجاد یک رکورد جدید، ویرایش یک رکورد موجود یا حذف یک رکورد.
-
ایدئمپوتنت نبودن:
- نتایج متفاوت: ارسال چندین درخواست POST با همان دادهها ممکن است نتایج متفاوتی ایجاد کند (مثلاً ایجاد چندین رکورد جدید). این در حالی است که ارسال چندین درخواست GET با همان پارامترها همیشه نتیجه یکسانی خواهد داشت.
-
خلاصه جدول مقایسه:
ویژگی | GET | POST |
---|---|---|
امنیت | پایین (دادهها در URL قابل مشاهده هستند) | بالا (دادهها در بدنه درخواست قرار میگیرند) |
اندازه داده | محدود | بدون محدودیت |
ایجاد تغییرات | معمولاً برای دریافت دادهها استفاده میشود | برای ایجاد تغییرات در سرور استفاده میشود |
ایدئمپوتنت | بله | خیر |
در چه مواردی از POST استفاده کنیم؟
-
- ارسال فرمها: هنگام ارسال اطلاعات از طریق فرمهای وب (مانند فرم ثبتنام، فرم تماس با ما، فرم پرداخت)
- آپلود فایل: برای ارسال فایلها به سرور
- ایجاد منابع جدید: برای ایجاد یک رکورد جدید در پایگاه داده
- بروزرسانی منابع موجود: برای ویرایش یا حذف یک رکورد موجود
- ارسال دادههای حساس: برای ارسال هرگونه اطلاعات محرمانه مانند رمز عبور یا اطلاعات کارت اعتباری
در نتیجه: اگر میخواهید دادههای حساس را ارسال کنید، تغییراتی در سرور ایجاد کنید یا حجم زیادی از داده را انتقال دهید، بهتر است از متد POST استفاده کنید. در غیر این صورت، برای دریافت ساده اطلاعات میتوانید از متد GET استفاده کنید.
خلاصه
متد POST یک ابزار قدرتمند برای ارسال داده به سرور است. این متد برای ایجاد منابع جدید، ارسال فرمها و انجام بسیاری از عملیاتهای دیگر در وب استفاده میشود. با استفاده صحیح از POST، میتوانید برنامههای وب پویا و تعاملی ایجاد کنید.
PUT
-
-
متد PUT در HTTP
متد PUT یکی از متدهای HTTP است که برای بهروزرسانی کامل یک منبع استفاده میشود. زمانی که یک درخواست PUT ارسال میشود، سرور منبع مورد نظر را با دادههای جدید جایگزین میکند.
نحوه استفاده
- ساختار درخواست:
PUT /resource HTTP/1.1 Host: example.com Content-Type: application/json { "name": "John Doe", "email": "johndoe@example.com" }
در این مثال،
PUT
متد درخواست،/resource
آدرس منبع مورد نظر،Content-Type
نوع داده ارسال شده و دادههای جدید در قالب JSON در بدنه درخواست قرار گرفتهاند. - پاسخ سرور: اگر درخواست موفقیتآمیز باشد، سرور یک کد وضعیت ۲۰۰ (OK) یا ۲۰۴ (No Content) را برمیگرداند.
مثالها
- ویرایش پروفایل کاربری: برای بهروزرسانی کامل اطلاعات یک کاربر، میتوان از متد PUT استفاده کرد.
- ویرایش یک پست: برای تغییر کامل محتوای یک پست در یک وبلاگ، میتوان از متد PUT استفاده کرد.
- بهروزرسانی دادهها در یک API: برای بهروزرسانی کامل یک منبع در یک API، میتوان از متد PUT استفاده کرد.
نکات مهم
- جایگزینی کامل: متد PUT برای جایگزینی کامل یک منبع استفاده میشود. اگر فقط میخواهید بخشی از منبع را بهروزرسانی کنید، از متد PATCH استفاده کنید.
- ایدهمپوتنت بودن: متد PUT ایدئمپوتنت است، به این معنی که ارسال چندین درخواست PUT با همان دادهها نتیجه یکسانی خواهد داشت.
خلاصه
متد PUT برای بهروزرسانی کامل یک منبع استفاده میشود. این متد برای ویرایش پروفایلها، بهروزرسانی دادهها در APIها و سایر عملیات مشابه مناسب است. با رعایت نکات مهم، میتوانید از متد PUT به طور مؤثر استفاده کنید.
مثال جامع استفاده از متد PUTفرض کنید یک وبسرویس برای مدیریت کاربران داریم. هر کاربر با یک شناسه منحصر به فرد (ID) شناسایی میشود. میخواهیم اطلاعات یک کاربر خاص را بهروزرسانی کنیم.
درخواست PUT
PUT /users/123 HTTP/1.1 Host: api.example.com Content-Type: application/json { "name": "علی احمدی", "email": "ali.ahmadi@example.com", "address": "تهران، ایران" }
- URL:
https://api.example.com/users/123
نشان میدهد که میخواهیم اطلاعات کاربر با شناسه ۱۲۳ را بهروزرسانی کنیم. - بدنه درخواست: دادههای جدید کاربر به صورت JSON در بدنه درخواست ارسال میشود. در این مثال، نام، ایمیل و آدرس کاربر بهروزرسانی میشوند.
پاسخ سرور
اگر درخواست بهدرستی اجرا شود، سرور ممکن است یک پاسخ با کد وضعیت ۲۰۰ (OK) یا ۲۰۴ (No Content) برگرداند.
HTTP/1.1 200 OK
این پاسخ نشان میدهد که درخواست با موفقیت انجام شده و اطلاعات کاربر بهروزرسانی شده است.
مثال در پایتون با استفاده از کتابخانه requestsPythonimport requests url = 'https://api.example.com/users/123' data = { "name": "علی احمدی", "email": "ali.ahmadi@example.com", "address": "تهران، ایران" } headers = {'Content-Type': 'application/json'} response = requests.put(url, json=data, headers=headers) if response.status_code == ۲۰۰: print("اطلاعات کاربر با موفقیت بهروزرسانی شد") else: print("خطا در بهروزرسانی اطلاعات کاربر")
در این مثال:
url
: آدرس وبسرویس برای بهروزرسانی اطلاعات کاربرdata
: دادههای جدید کاربر به صورت یک دیکشنریheaders
: هدرهای درخواست، شامل نوع محتوای JSONrequests.put
: متد PUT کتابخانه requests برای ارسال درخواست
نکات مهم
- کلید منحصر به فرد: در URL درخواست، معمولاً از یک کلید منحصر به فرد (مانند شناسه کاربر) برای شناسایی منبعی که قرار است بهروزرسانی شود، استفاده میشود.
- دادههای کامل: متد PUT برای جایگزینی کامل دادههای یک منبع استفاده میشود. اگر فقط میخواهید بخشی از دادهها را بهروزرسانی کنید، از متد PATCH استفاده کنید.
- ایدهمپوتنت بودن: ارسال چندین درخواست PUT با همان دادهها نتیجه یکسانی خواهد داشت.
مقایسه با متد POST:
- POST: برای ایجاد یک منبع جدید استفاده میشود.
- PUT: برای بهروزرسانی کامل یک منبع موجود استفاده میشود.
جمعبندی: متد PUT یک ابزار قدرتمند برای بهروزرسانی منابع در وبسرویسها است. با استفاده از این متد، میتوان اطلاعات موجود را بهطور کامل جایگزین کرد.
- ساختار درخواست:
-
DELETE
-
-
متد DELETE در HTTP
متد DELETE یکی از متدهای HTTP است که برای حذف یک منبع استفاده میشود. زمانی که یک درخواست DELETE ارسال میشود، سرور منبع مورد نظر را حذف میکند.
نحوه استفاده
- ساختار درخواست:
DELETE /resource HTTP/1.1 Host: example.com
در این مثال،
DELETE
متد درخواست،/resource
آدرس منبع مورد نظر را مشخص میکند. - پاسخ سرور: اگر درخواست موفقیتآمیز باشد، سرور یک کد وضعیت ۲۰۰ (OK) یا ۲۰۴ (No Content) را برمیگرداند.
مثالها
- حذف یک کاربر: برای حذف یک کاربر از سیستم، میتوان از متد DELETE استفاده کرد.
- حذف یک پست: برای حذف یک پست در یک وبلاگ، میتوان از متد DELETE استفاده کرد.
- حذف یک فایل: برای حذف یک فایل از سرور، میتوان از متد DELETE استفاده کرد.
نکات مهم
- کلید منحصر به فرد: در URL درخواست، معمولاً از یک کلید منحصر به فرد (مانند شناسه کاربر یا شناسه پست) برای مشخص کردن منبعی که قرار است حذف شود، استفاده میشود.
- ایدهمپوتنت بودن: متد DELETE ایدئمپوتنت است، به این معنی که ارسال چندین درخواست DELETE با همان پارامترها نتیجه یکسانی خواهد داشت (یعنی منبع فقط یک بار حذف میشود).
خلاصه
متد DELETE برای حذف منابع در وبسرویسها استفاده میشود. با استفاده از این متد، میتوان منابعی را که دیگر مورد نیاز نیستند، از سیستم حذف کرد.
مثال عملی استفاده از متد DELETEفرض کنید یک وبسرویس برای مدیریت کاربران داریم. هر کاربر با یک شناسه منحصر به فرد (ID) شناسایی میشود. میخواهیم یک کاربر خاص را از سیستم حذف کنیم.
درخواست DELETE
DELETE /users/123 HTTP/1.1 Host: api.example.com
- URL:
https://api.example.com/users/123
نشان میدهد که میخواهیم کاربر با شناسه ۱۲۳ را حذف کنیم.
پاسخ سرور
اگر درخواست بهدرستی اجرا شود، سرور ممکن است یک پاسخ با کد وضعیت ۲۰۴ (No Content) برگرداند. این نشان میدهد که درخواست با موفقیت انجام شده و منبع (کاربر) حذف شده است.
HTTP/1.1 204 No Content
مثال در پایتون با استفاده از کتابخانه requests
Pythonimport requests url = 'https://api.example.com/users/123' response = requests.delete(url) if response.status_code == ۲۰۴: print("کاربر با موفقیت حذف شد") else: print("خطا در حذف کاربر")
در این مثال:
url
: آدرس وبسرویس برای حذف کاربرrequests.delete
: متد DELETE کتابخانه requests برای ارسال درخواست
نکات مهم
- کلید منحصر به فرد: در URL درخواست، معمولاً از یک کلید منحصر به فرد (مانند شناسه کاربر) برای شناسایی منبعی که قرار است حذف شود، استفاده میشود.
- ایدهمپوتنت بودن: ارسال چندین درخواست DELETE با همان پارامترها نتیجه یکسانی خواهد داشت (یعنی منبع فقط یک بار حذف میشود).
- توجه: حذف یک منبع معمولاً یک عملیات برگشتناپذیر است، بنابراین قبل از ارسال درخواست DELETE اطمینان حاصل کنید که میخواهید منبع را حذف کنید.
مثال دیگری برای درک بهتر
حذف یک پست در یک وبلاگ:
DELETE /posts/123 HTTP/1.1 Host: blog.example.com
در این مثال، پست با شناسه ۱۲۳ از وبلاگ حذف خواهد شد.
کاربردهای دیگر متد DELETE
- حذف فایلها از یک سرور
- حذف کامنتها از یک پست
- حذف آیتمها از یک سبد خرید
جمعبندی: متد DELETE یک ابزار قدرتمند برای حذف منابع در وبسرویسها است. با استفاده از این متد، میتوان منابعی را که دیگر مورد نیاز نیستند، از سیستم حذف کرد.
- ساختار درخواست:
-
سایر متدهای HTTP
علاوه بر متدهای اصلی فوق، متدهای دیگری نیز وجود دارند که کمتر استفاده میشوند:
-
- متد HEAD در HTTP
متد HEAD یک متد HTTP است که شبیه به GET عمل میکند، اما فقط هدرهای پاسخ را برمیگرداند و بدنه پاسخ را ارسال نمیکند. این ویژگی باعث میشود که HEAD برای بررسی متا دادهها و اطلاعات مربوط به یک منبع بدون دریافت محتوای کامل آن مفید باشد.
نحوه استفاده
- ساختار درخواست:
HEAD /resource HTTP/1.1 Host: example.com
- پاسخ سرور:
سرور یک پاسخ با کد وضعیت ۲۰۰ (OK) یا سایر کدهای وضعیت مناسب و هدرهای پاسخ را برمیگرداند.
کاربردهای HEAD
- بررسی وجود یک منبع: میتوان از HEAD برای بررسی اینکه آیا یک منبع خاص روی سرور وجود دارد یا خیر، بدون نیاز به دانلود محتوای آن استفاده کرد.
- دریافت اطلاعات متا: میتوان از HEAD برای دریافت اطلاعات متا مانند تاریخ آخرین اصلاح، اندازه فایل، نوع محتوا و سایر اطلاعات مرتبط با یک منبع استفاده کرد.
- بررسی کَش: میتوان از HEAD برای بررسی اینکه آیا یک منبع در کَش مرورگر وجود دارد یا خیر و آیا نیاز به درخواست مجدد از سرور است، استفاده کرد.
مثال
Pythonimport requests url = 'https://www.example.com' response = requests.head(url) if response.status_code == ۲۰۰: print("منبع موجود است") print("تاریخ آخرین اصلاح:", response.headers['Last-Modified']) else: print("منبع یافت نشد")
در این مثال، ما یک درخواست HEAD به آدرس
https://www.example.com
ارسال میکنیم تا بررسی کنیم آیا منبع وجود دارد و در صورت وجود، تاریخ آخرین اصلاح آن را دریافت میکنیم.نکات مهم
- کَش: نتایج درخواستهای HEAD معمولاً کَش میشوند، بنابراین ممکن است پاسخهای قدیمی دریافت کنید. برای دریافت اطلاعات بهروز، میتوانید از پارامترهای خاصی برای جلوگیری از کَش شدن استفاده کنید.
- محدودیتها: برخی از سرورها ممکن است محدودیتهای خاصی برای استفاده از متد HEAD داشته باشند.
جمعبندی
متد HEAD یک ابزار مفید برای بررسی اطلاعات متا درباره یک منبع بدون دریافت محتوای کامل آن است. این متد میتواند در بهبود عملکرد و کاهش بار روی سرور کمک کند.
-
متد OPTIONS در HTTP
متد OPTIONS یک متد HTTP است که برای دریافت اطلاعات در مورد روشهای HTTP مجاز برای یک منبع استفاده میشود. این متد برای بررسی قابلیتهای یک سرور یا یک منبع خاص مفید است.
نحوه استفاده
- ساختار درخواست:
OPTIONS /resource HTTP/1.1 Host: example.com
- پاسخ سرور:
سرور یک پاسخ با کد وضعیت ۲۰۰ (OK) و هدر
Allow
را برمیگرداند. این هدر لیستی از متدهای HTTP مجاز برای منبع را مشخص میکند.مثال
Pythonimport requests url = 'https://api.example.com/users' response = requests.options(url) if response.status_code == ۲۰۰: allowed_methods = response.headers['Allow'].split(',') print("متدهای مجاز:", allowed_methods) else: print("خطا در دریافت متدهای مجاز")
در این مثال، ما یک درخواست OPTIONS به آدرس
https://api.example.com/users
ارسال میکنیم تا لیستی از متدهای HTTP مجاز برای منبع/users
را دریافت کنیم.کاربردهای OPTIONS
- بررسی قابلیتهای یک سرور: میتوان از OPTIONS برای بررسی اینکه چه متدهای HTTP برای یک سرور یا یک منبع خاص پشتیبانی میشوند، استفاده کرد.
- بررسی محدودیتها: میتوان از OPTIONS برای بررسی محدودیتهایی مانند اندازه فایلهای قابل آپلود یا تعداد درخواستهای مجاز در یک بازه زمانی مشخص استفاده کرد.
- توسعه APIها: میتوان از OPTIONS برای مستندسازی قابلیتهای یک API و کمک به توسعهدهندگان در استفاده صحیح از آن استفاده کرد.
نکات مهم
- پاسخ کَش شده: نتایج درخواستهای OPTIONS ممکن است کَش شوند، بنابراین ممکن است پاسخهای قدیمی دریافت کنید. برای دریافت اطلاعات بهروز، میتوانید از پارامترهای خاصی برای جلوگیری از کَش شدن استفاده کنید.
- محدودیتها: برخی از سرورها ممکن است محدودیتهایی برای استفاده از متد OPTIONS داشته باشند.
جمعبندی
متد OPTIONS یک ابزار مفید برای بررسی قابلیتهای یک سرور یا یک منبع است. این متد میتواند به توسعهدهندگان در درک محدودیتها و استفاده صحیح از APIها کمک کند.
- متد PATCH در HTTP
متد PATCH یک متد HTTP است که برای بهروزرسانی جزئی یک منبع استفاده میشود. این متد به سرور اجازه میدهد تا فقط بخشهای خاصی از یک منبع را تغییر دهد، بدون نیاز به جایگزینی کل منبع.
نحوه استفاده
- ساختار درخواست:
PATCH /resource HTTP/1.1 Host: example.com Content-Type: application/json [ { "op": "replace", "path": "/name", "value": "John Doe" }, { "op": "add", "path": "/address", "value": "New York" } ]
در این مثال،
PATCH
متد درخواست،/resource
آدرس منبع مورد نظر،Content-Type
نوع داده ارسال شده و دادههای جدید به صورت یک آرایه JSON با عملیاتهای مختلف مشخص شدهاند.- عملیاتها:
- replace: جایگزینی یک مقدار موجود.
- add: اضافه کردن یک مقدار جدید.
- remove: حذف یک مقدار موجود.
- move: جابجایی یک مقدار.
- copy: کپی کردن یک مقدار.
- test: بررسی وجود یک مقدار.
مثال
Pythonimport requests url = 'https://api.example.com/users/123' data = [ { "op": "replace", "path": "/name", "value": "John Doe" }, { "op": "add", "path": "/address", "value": "New York" } ] headers = {'Content-Type': 'application/json'} response = requests.patch(url, json=data, headers=headers) if response.status_code == ۲۰۰: print("اطلاعات کاربر با موفقیت بهروزرسانی شد") else: print("خطا در بهروزرسانی اطلاعات کاربر")
در این مثال، ما یک درخواست PATCH به آدرس
/users/123
ارسال میکنیم تا نام کاربر را جایگزین کرده و آدرس جدیدی به آن اضافه کنیم.کاربردهای PATCH
- بهروزرسانی جزئی دادهها: زمانی که فقط میخواهیم بخشی از یک منبع را تغییر دهیم، متد PATCH مناسب است.
- ویرایش فرمها: برای ویرایش جزئی یک فرم، میتوان از متد PATCH استفاده کرد.
- APIهای RESTful: متد PATCH در APIهای RESTful برای بهروزرسانی جزئی منابع استفاده میشود.
نکات مهم
- فرمت دادهها: دادههای ارسال شده در درخواست PATCH معمولاً به صورت JSON یا XML ارسال میشوند.
- عملیاتهای پشتیبانی شده: سرور ممکن است فقط برخی از عملیاتها را پشتیبانی کند.
- ایدهمپوتنت بودن: متد PATCH ایدئمپوتنت است، به این معنی که ارسال چندین درخواست PATCH با همان دادهها نتیجه یکسانی خواهد داشت.
جمعبندی
متد PATCH یک ابزار قدرتمند برای بهروزرسانی جزئی منابع در وبسرویسها است. این متد به شما امکان میدهد تا تغییراتی را در یک منبع ایجاد کنید بدون اینکه کل منبع را جایگزین کنید.
-
جدول مقایسه متدهای HTTP:
متد | توضیح |
---|---|
GET | دریافت اطلاعات |
POST | ارسال داده |
PUT | بهروزرسانی کامل |
DELETE | حذف |
HEAD | دریافت هدرها |
OPTIONS | دریافت روشهای مجاز |
PATCH | بهروزرسانی جزئی |
تعریف روتها با متدهای مختلف در فلاسک
برای تعریف یک روت و مشخص کردن متدهای HTTP مجاز برای آن، از دکوراتور @app.route()
استفاده میکنیم. پارامتر methods
لیستی از متدهای HTTP مجاز را میگیرد.
from flask import Flask, request
app = Flask(__name__)
@app.route('/users', methods=['GET', 'POST'])
def users():
if request.method == 'GET':
# کد برای دریافت لیست کاربران
return 'List of users'
elif request.method == 'POST':
# کد برای اضافه کردن کاربر جدید
data = request.get_json()
return 'User added successfully'
در مثال بالا:
- روت
/users
برای هر دو متد GET و POST تعریف شده است. - اگر درخواست با متد GET ارسال شود، تابع
users()
لیست کاربران را برمیگرداند. - اگر درخواست با متد POST ارسال شود، تابع
users()
دادههای ارسال شده در بدنه درخواست را دریافت کرده و یک کاربر جدید اضافه میکند.
مثالهای بیشتر
- بهروزرسانی یک کاربر (PUT): Python
@app.route('/users/<int:user_id>', methods=['PUT']) def update_user(user_id): # کد برای به روزرسانی کاربر با شناسه user_id return 'User updated successfully'
- حذف یک کاربر (DELETE): Python
@app.route('/users/<int:user_id>', methods=['DELETE']) def delete_user(user_id): # کد برای حذف کاربر با شناسه user_id return 'User deleted successfully'
نکات مهم
- انتخاب متد مناسب: انتخاب متد HTTP مناسب برای هر عملیات بسیار مهم است.
- ایمنی: هنگام استفاده از متدهای POST و PUT، حتماً دادههای دریافتی را اعتبارسنجی کنید تا از تزریق کدهای مخرب جلوگیری شود.
- پاسخهای HTTP: به طور معمول، هندلرها یک پاسخ HTTP را برمیگردانند که شامل کد وضعیت (مثلاً ۲۰۰ برای موفقیت، ۴۰۴ برای یافت نشدن) و بدنه پاسخ است.
- استفاده از Flask-RESTful: برای ساخت APIهای RESTful در فلاسک، میتوانید از افزونه Flask-RESTful استفاده کنید که کار با روتها و هندلرها را سادهتر میکند.
تفاوت بین متدهای HTTP: GET و POST
در پروتکل HTTP، متدهای مختلفی برای برقراری ارتباط بین کلاینت و سرور وجود دارد. دو مورد از پرکاربردترین این متدها، GET و POST هستند. هر کدام از این متدها برای اهداف خاصی طراحی شدهاند و در شرایط مختلفی استفاده میشوند.
متد GET
- هدف: برای دریافت داده از سرور استفاده میشود.
- نحوه ارسال دادهها: دادهها به عنوان پارامتر در URL قرار میگیرند.
- ویژگیها:
- ایدمپوتنت است: ارسال چندین درخواست GET با پارامترهای یکسان نتیجه یکسانی خواهد داشت.
- قابل کَش شدن است: نتایج درخواستهای GET معمولاً کَش میشوند تا سرعت بارگذاری صفحات افزایش یابد.
- امنیت پایین: دادههای ارسالی در URL قابل مشاهده هستند و ممکن است برای هکرها قابل دسترسی باشد.
- محدودیت اندازه داده: به دلیل محدودیتهای اندازه URL، نمیتوان دادههای حجیم را با استفاده از GET ارسال کرد.
- کاربردها:
- درخواست صفحات وب
- جستجو در وبسایتها
- دریافت اطلاعات از یک API
متد POST
- هدف: برای ارسال داده به سرور استفاده میشود.
- نحوه ارسال دادهها: دادهها در بدنه درخواست ارسال میشوند.
- ویژگیها:
- ایدمپوتنت نیست: ارسال چندین درخواست POST با پارامترهای یکسان ممکن است نتایج متفاوتی داشته باشد (مثلاً ایجاد چندین رکورد جدید).
- قابل کَش شدن نیست: نتایج درخواستهای POST معمولاً کَش نمیشوند.
- امنیت بالاتر: دادههای ارسالی در بدنه درخواست پنهان هستند و برای هکرها قابل مشاهده نیستند.
- عدم محدودیت اندازه داده: میتوان دادههای حجیم را با استفاده از POST ارسال کرد.
- کاربردها:
- ارسال فرمها (ثبتنام، ورود، ارسال پیام)
- آپلود فایل
- ایجاد منابع جدید
خلاصه تفاوتها
ویژگی | GET | POST |
---|---|---|
هدف | دریافت داده | ارسال داده |
محل قرارگیری دادهها | URL | بدنه درخواست |
ایدمپوتنت | بله | خیر |
قابل کَش شدن | بله | خیر |
امنیت | پایین | بالا |
محدودیت اندازه داده | بله | خیر |
چه زمانی از GET و چه زمانی از POST استفاده کنیم؟
- GET: برای دریافت دادههایی که تغییر نمیکنند و امنیتی ندارند، مانند جستجو در یک وبسایت یا دریافت اطلاعات یک محصول.
- POST: برای ارسال دادههایی که تغییر ایجاد میکنند، امنیتی هستند و یا حجم زیادی دارند، مانند ثبتنام در یک سایت، ارسال یک فرم تماس یا آپلود یک فایل.
نکته مهم: هرگز اطلاعات حساس مانند رمز عبور را با استفاده از متد GET ارسال نکنید.
جمعبندی:
انتخاب بین متدهای GET و POST به هدف درخواست و نوع دادههایی که ارسال یا دریافت میکنید بستگی دارد. درک تفاوتهای بین این دو متد به شما کمک میکند تا درخواستهای HTTP خود را بهینه و ایمن کنید.
امنیت در ارسال داده ها با متد POST
متد POST در HTTP برای ارسال داده به سرور استفاده میشود و به طور کلی امنتر از متد GET است، زیرا دادههای ارسالی در بدنه درخواست قرار میگیرند و در URL قابل مشاهده نیستند. با این حال، برای اطمینان از امنیت کامل دادهها، باید اقدامات امنیتی دیگری نیز انجام شود.
چرا POST امنتر از GET است؟
- پنهانکاری دادهها: دادههایی که با POST ارسال میشوند، در URL قابل مشاهده نیستند و به صورت رمزنگاری شده ارسال میشوند. این باعث میشود که هکرها به راحتی به این دادهها دسترسی نداشته باشند.
- حجم داده: POST محدودیتی در حجم دادههای ارسالی ندارد، بنابراین میتوان دادههای بزرگ و پیچیده را به صورت ایمن ارسال کرد.
تهدیدات امنیتی و راهکارها
با وجود مزایای امنیتی POST، همچنان ممکن است دادهها در حین انتقال یا در سرور در معرض خطر قرار بگیرند. برخی از تهدیدات امنیتی رایج و راهکارهای مقابله با آنها عبارتند از:
- سرقت اطلاعات: هکرها ممکن است با استفاده از روشهای مختلف مانند تزریق SQL، XSS و CSRF به دنبال سرقت اطلاعات حساس باشند.
- راهکار: استفاده از تکنیکهای امنیتی مانند ورودی امن، رمزنگاری، و استفاده از فریمورکهای امن.
- دسترسی غیرمجاز: افراد غیرمجاز ممکن است به سرور شما دسترسی پیدا کنند و دادههای ارسالی را مشاهده کنند.
- راهکار: استفاده از پروتکلهای امن مانند HTTPS، احراز هویت دو مرحلهای و محدود کردن دسترسی به سرور.
- آسیبپذیریهای برنامه: نقصهای امنیتی در برنامه شما ممکن است به هکرها اجازه دهد تا به دادههای شما دسترسی پیدا کنند.
- راهکار: انجام تستهای نفوذ، بهروزرسانی مداوم نرمافزارها و استفاده از کتابخانههای امن.
اقدامات امنیتی برای ارسال داده با POST
- استفاده از HTTPS: همیشه از پروتکل HTTPS برای رمزنگاری ارتباط بین کلاینت و سرور استفاده کنید.
- رمزنگاری دادهها: دادههای حساس مانند رمزهای عبور را قبل از ارسال رمزنگاری کنید.
- ورودی امن: دادههایی که از کاربر دریافت میکنید را قبل از پردازش اعتبارسنجی و پاکسازی کنید تا از تزریق کدهای مخرب جلوگیری شود.
- حفاظت از سرور: سرور خود را با استفاده از فایروال، سیستم تشخیص نفوذ و بهروزرسانیهای امنیتی محافظت کنید.
- استفاده از فریمورکهای امن: از فریمورکهای وب توسعهای استفاده کنید که به طور پیشفرض دارای ویژگیهای امنیتی هستند.
- محدود کردن دسترسی: دسترسی به دادهها را به حداقل افراد مورد نیاز محدود کنید.
- مدیریت خطاهای امنیتی: در صورت وقوع هرگونه رخداد امنیتی، به سرعت آن را بررسی و رفع کنید.
مثال عملی با زبان برنامهنویسی پایتون:
import requests
url = 'https://api.example.com/data'
data = {'username': 'user123', 'password': 'mypassword'}
# رمزنگاری رمز عبور قبل از ارسال
import hashlib
data['password'] = hashlib.sha256(data['password'].encode('utf-8')).hexdigest()
# ارسال درخواست POST با استفاده از HTTPS
response = requests.post(url, data=data, verify=True)
if response.status_code == ۲۰۰:
print('دادهها با موفقیت ارسال شدند')
else:
print('خطا در ارسال دادهها')
در این مثال:
- از کتابخانه
requests
برای ارسال درخواست POST استفاده شده است. - رمز عبور قبل از ارسال با الگوریتم SHA-256 رمزنگاری شده است.
- از
verify=True
برای تأیید اعتبار گواهینامه SSL استفاده شده است.
نتیجهگیری:
اگرچه متد POST نسبت به GET امنیت بیشتری دارد، اما برای اطمینان از امنیت کامل دادهها، باید اقدامات امنیتی مختلفی را در نظر بگیرید. با پیروی از این راهکارها، میتوانید از دادههای خود در برابر تهدیدات امنیتی محافظت کنید.
کدهای وضعیت HTTP: راهنمایی سرور به سمت کاربر
کدهای وضعیت HTTP، پیامهایی هستند که سرور به مرورگر ارسال میکند تا نتیجه درخواست HTTP را اعلام کند. این کدها، که معمولاً سه رقمی هستند، به مرورگر کمک میکنند تا بفهمد که آیا درخواست با موفقیت انجام شده است یا خیر و اگر خیر، چه مشکلی پیش آمده است.
دسته بندی کلی کدهای وضعیت HTTP
کدهای وضعیت HTTP به چند دسته اصلی تقسیم میشوند:
- 1xx (اطلاعاتی): این کدها نشان میدهند که درخواست دریافت شده و سرور در حال پردازش آن است.
- 2xx (موفقیت): درخواست با موفقیت انجام شده است.
- 3xx (تغییر مسیر): برای هدایت کاربر به یک URL دیگر استفاده میشود.
- 4xx (خطای کلاینت): خطایی از سمت کاربر رخ داده است (مثلاً آدرس اشتباه یا عدم مجوز).
- 5xx (خطای سرور): خطایی در سمت سرور رخ داده است (مثلاً سرور در دسترس نیست).
برخی از کدهای وضعیت مهم
- ۲۰۰ OK: درخواست با موفقیت انجام شده است.
- ۳۰۱ Moved Permanently: منبع به طور دائمی به آدرس جدید منتقل شده است.
- ۳۰۲ Found: منبع موقتاً به آدرس جدید منتقل شده است.
- ۴۰۴ Not Found: منبع مورد نظر یافت نشد.
- ۵۰۰ Internal Server Error: خطای داخلی در سرور رخ داده است.
جدول خلاصه کدهای وضعیت HTTP
دسته | کد | توضیحات |
---|---|---|
اطلاعاتی | ۱۰۰ | Continue |
موفقیت | ۲۰۰ | OK |
تغییر مسیر | ۳۰۱ | Moved Permanently |
تغییر مسیر | ۳۰۲ | Found |
خطای کلاینت | ۴۰۰ | Bad Request |
خطای کلاینت | ۴۰۱ | Unauthorized |
خطای کلاینت | ۴۰۳ | Forbidden |
خطای کلاینت | ۴۰۴ | Not Found |
خطای سرور | ۵۰۰ | Internal Server Error |
خطای سرور | ۵۰۲ | Bad Gateway |
خطای سرور | ۵۰۳ | Service Unavailable |
اهمیت کدهای وضعیت HTTP
- بهبود تجربه کاربری: با نمایش پیامهای مناسب بر اساس کدهای وضعیت، میتوان تجربه کاربری را بهبود بخشید.
- سئو: موتورهای جستجو از کدهای وضعیت برای درک بهتر ساختار سایت استفاده میکنند.
- دیباگ کردن: کدهای وضعیت به توسعهدهندگان کمک میکنند تا مشکلات در برنامههای وب را شناسایی و رفع کنند.
مثال عملی
فرض کنید شما آدرس یک صفحه وب را در مرورگر خود وارد میکنید. اگر همه چیز درست باشد، سرور یک پاسخ با کد وضعیت ۲۰۰ به همراه محتوای صفحه به شما ارسال میکند. اما اگر صفحه مورد نظر حذف شده باشد، سرور یک پاسخ با کد وضعیت ۴۰۴ به شما ارسال میکند.
نتیجهگیری
کدهای وضعیت HTTP نقش بسیار مهمی در ارتباط بین مرورگر و سرور ایفا میکنند. با درک این کدها، میتوانید مشکلات رایجی که در وبسایتها رخ میدهند را بهتر تشخیص داده و رفع کنید.
آیا میخواهید درباره یک کد وضعیت خاص اطلاعات بیشتری کسب کنید؟
موضوعات مرتبط:
- HTTP
- توسعه وب
- سئو
- شبکه
توجه: این تنها بخشی از کدهای وضعیت HTTP است و کدهای دیگری نیز وجود دارند که در شرایط خاص استفاده میشوند. برای اطلاعات بیشتر میتوانید به مستندات رسمی HTTP مراجعه کنید.
تفاوت بین متدهای HTTP (GET، POST، PUT، DELETE)
متدهای HTTP روشهایی هستند که برای درخواست منابع از یک سرور وب استفاده میشوند. هر متد یک عمل خاص را روی یک منبع مشخص میکند. در ادامه به بررسی تفاوتهای بین چهار متد اصلی HTTP میپردازیم:
GET
- هدف: برای دریافت اطلاعات از سرور استفاده میشود.
- نحوه ارسال دادهها: دادهها به عنوان پارامتر در URL قرار میگیرند.
- ویژگیها:
- ایدمپوتنت است: ارسال چندین درخواست GET با پارامترهای یکسان نتیجه یکسانی خواهد داشت.
- قابل کَش شدن است: نتایج درخواستهای GET معمولاً کَش میشوند تا سرعت بارگذاری صفحات افزایش یابد.
- امنیت پایین: دادههای ارسالی در URL قابل مشاهده هستند و ممکن است برای هکرها قابل دسترسی باشد.
- محدودیت اندازه داده: به دلیل محدودیتهای اندازه URL، نمیتوان دادههای حجیم را با استفاده از GET ارسال کرد.
- کاربردها:
- درخواست صفحات وب
- جستجو در وبسایتها
- دریافت اطلاعات از یک API
POST
- هدف: برای ارسال داده به سرور استفاده میشود.
- نحوه ارسال دادهها: دادهها در بدنه درخواست ارسال میشوند.
- ویژگیها:
- ایدمپوتنت نیست: ارسال چندین درخواست POST با پارامترهای یکسان ممکن است نتایج متفاوتی داشته باشد (مثلاً ایجاد چندین رکورد جدید).
- قابل کَش شدن نیست: نتایج درخواستهای POST معمولاً کَش نمیشوند.
- امنیت بالاتر: دادههای ارسالی در بدنه درخواست پنهان هستند و برای هکرها قابل مشاهده نیستند.
- عدم محدودیت اندازه داده: میتوان دادههای حجیم را با استفاده از POST ارسال کرد.
- کاربردها:
- ارسال فرمها (ثبتنام، ورود، ارسال پیام)
- آپلود فایل
- ایجاد منابع جدید
PUT
- هدف: برای بهروزرسانی کامل یک منبع استفاده میشود.
- نحوه ارسال دادهها: دادههای جدید در بدنه درخواست ارسال میشوند.
- ویژگیها:
- ایدمپوتنت است: ارسال چندین درخواست PUT با پارامترهای یکسان نتیجه یکسانی خواهد داشت (یعنی منبع فقط یک بار بهروزرسانی میشود).
- قابل کَش شدن نیست: نتایج درخواستهای PUT معمولاً کَش نمیشوند.
- امنیت بالاتر: دادههای ارسالی در بدنه درخواست پنهان هستند.
- عدم محدودیت اندازه داده: میتوان دادههای حجیم را با استفاده از PUT ارسال کرد.
- کاربردها:
- بهروزرسانی کامل اطلاعات یک کاربر
- ویرایش یک پست در یک وبلاگ
- آپلود فایل جدید جایگزین یک فایل قدیمی
DELETE
- هدف: برای حذف یک منبع استفاده میشود.
- نحوه ارسال دادهها: معمولاً نیازی به ارسال دادهها نیست.
- ویژگیها:
- ایدمپوتنت است: ارسال چندین درخواست DELETE با پارامترهای یکسان نتیجه یکسانی خواهد داشت (یعنی منبع فقط یک بار حذف میشود).
- قابل کَش شدن نیست: نتایج درخواستهای DELETE معمولاً کَش نمیشوند.
- امنیت متوسط: دادههای ارسالی در URL قابل مشاهده نیستند، اما ممکن است در برخی موارد قابل حدس باشند.
- کاربردها:
- حذف یک کاربر از سیستم
- حذف یک پست در یک وبلاگ
- حذف یک فایل از سرور
جدول خلاصه تفاوتها
ویژگی | GET | POST | PUT | DELETE |
---|---|---|---|---|
هدف | دریافت داده | ارسال داده | بهروزرسانی کامل | حذف |
محل قرارگیری دادهها | URL | بدنه درخواست | بدنه درخواست | URL |
ایدمپوتنت | بله | خیر | بله | بله |
قابل کَش شدن | بله | خیر | خیر | خیر |
امنیت | پایین | بالا | بالا | متوسط |
محدودیت اندازه داده | بله | خیر | خیر | خیر |
انتخاب متد مناسب
- GET: برای دریافت دادههایی که تغییر نمیکنند و امنیتی ندارند، مانند جستجو در یک وبسایت یا دریافت اطلاعات یک محصول.
- POST: برای ارسال دادههایی که تغییر ایجاد میکنند، امنیتی هستند و یا حجم زیادی دارند، مانند ثبتنام در یک سایت، ارسال یک فرم تماس یا آپلود یک فایل.
- PUT: برای بهروزرسانی کامل یک منبع.
- DELETE: برای حذف یک منبع.
با درک تفاوتهای بین این متدها، میتوانید درخواستهای HTTP خود را بهینه و ایمن کنید.
ایِدمپوتنت بودن در HTTP: تکرار بدون تغییر نتیجه
ایِدمپوتنت (Idempotent) به معنی این است که یک عملیات را چندین بار انجام دهیم، اما نتیجه تنها یک بار انجام شدن آن عملیات باشد. در HTTP، این مفهوم به این معنی است که فرستادن چندین درخواست یکسان به یک منبع، نتیجه یکسانی داشته باشد، صرف نظر از اینکه چند بار درخواست ارسال شده است.
چرا ایِدمپوتنت بودن مهم است؟
- قابلیت اطمینان: اگر به دلیل خطا یا هر دلیل دیگری، یک درخواست چندین بار ارسال شود، ایِدمپوتنت بودن تضمین میکند که سیستم به درستی کار کند و دادهها تکراری نشوند.
- سهولت در طراحی سیستم: وقتی عملیاتها ایِدمپوتنت هستند، طراحی و پیادهسازی سیستمهای توزیعشده و مقاوم در برابر خطا آسانتر میشود.
- کلاینتهای هوشمند: کلاینتها میتوانند بدون نگرانی از عواقب تکرار درخواست، درخواستها را مجدداً ارسال کنند.
کدام متدهای HTTP ایِدمپوتنت هستند؟
- GET: درخواست GET برای دریافت داده استفاده میشود و به طور طبیعی ایِدمپوتنت است. فرستادن چندین درخواست GET با پارامترهای یکسان، همیشه همان نتیجه را خواهد داشت.
- PUT: درخواست PUT برای ایجاد یا بهروزرسانی کامل یک منبع استفاده میشود. این متد نیز ایِدمپوتنت است، زیرا فرستادن چندین درخواست PUT با دادههای یکسان، تنها یک بار منبع را بهروزرسانی میکند.
- DELETE: درخواست DELETE برای حذف یک منبع استفاده میشود. این متد نیز ایِدمپوتنت است، زیرا فرستادن چندین درخواست DELETE برای یک منبع، تنها یک بار آن را حذف میکند.
کدام متد HTTP ایِدمپوتنت نیست؟
- POST: درخواست POST برای ایجاد یک منبع جدید استفاده میشود. فرستادن چندین درخواست POST با دادههای یکسان، ممکن است چندین منبع جدید ایجاد کند و بنابراین ایِدمپوتنت نیست.
مثال عملی
فرض کنید شما یک درخواست POST برای ایجاد یک کاربر ارسال میکنید. اگر به دلیل مشکل شبکه، این درخواست چندین بار ارسال شود، ممکن است چندین کاربر با اطلاعات یکسان ایجاد شود. اما اگر از متد PUT برای بهروزرسانی اطلاعات کاربر استفاده کنید، فرقی نمیکند که درخواست چند بار ارسال شود، اطلاعات کاربر تنها یک بار بهروزرسانی خواهد شد.
چگونه ایِدمپوتنت بودن را تضمین کنیم؟
- استفاده از شناسههای منحصر به فرد: برای هر درخواست، یک شناسه منحصر به فرد ایجاد کنید و این شناسه را در بدنه درخواست ارسال کنید. سرور میتواند از این شناسه برای بررسی اینکه آیا درخواست قبلاً پردازش شده است یا خیر استفاده کند.
- استفاده از متدهای ایِدمپوتنت: برای عملیاتهایی که نیازی به ایجاد منابع جدید ندارند، از متدهای GET، PUT یا DELETE استفاده کنید.
- پیادهسازی منطق کسبوکار مناسب: در سرور، منطق کسبوکار را طوری پیادهسازی کنید که از ایجاد دادههای تکراری جلوگیری شود.
در نتیجه:
ایِدمپوتنت بودن یک ویژگی مهم در طراحی APIها و سیستمهای توزیعشده است. با درک این مفهوم و استفاده صحیح از متدهای HTTP، میتوان سیستمهایی قابل اعتمادتر و مقیاسپذیرتر ایجاد کرد.
پاسخهای HTTP: پاسخ سرور به درخواستهای شما
هنگامی که شما در مرورگر خود آدرسی را تایپ میکنید، در واقع یک درخواست HTTP به سرور ارسال میکنید. سرور نیز پس از پردازش درخواست، یک پاسخ HTTP به شما برمیگرداند. این پاسخ حاوی اطلاعاتی مانند کد وضعیت، هدرها و بدنه است.
اجزای یک پاسخ HTTP
- کد وضعیت (Status Code): این کد عددی سه رقمی، اطلاعاتی در مورد نتیجه درخواست به شما میدهد. مثلاً کد ۲۰۰ نشان میدهد که درخواست با موفقیت انجام شده است، و کد ۴۰۴ نشان میدهد که صفحه مورد نظر یافت نشده است.
- هدرها (Headers): هدرها اطلاعات اضافی در مورد پاسخ را ارائه میدهند. مثلاً نوع محتوای پاسخ (Content-Type)، طول محتوا (Content-Length) و … .
- بدنه (Body): این بخش حاوی دادههای اصلی پاسخ است. مثلاً متن یک صفحه وب، یک تصویر یا یک فایل JSON.
مثال یک پاسخ HTTP
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 115
<!DOCTYPE html>
<html>
<head>
<title>Hello, World!</title>
</head>
<body>
<p>Hello, World!</p>
</body>
</html>
در این مثال:
- HTTP/1.1 200 OK: نسخه پروتکل HTTP و کد وضعیت موفقیتآمیز
- Content-Type: text/html: نوع محتوای پاسخ متن HTML است
- Content-Length: 115: طول محتوا به بایت
- بدنه: کد HTML صفحه وب
کدهای وضعیت رایج HTTP
- 2xx (موفقیت): درخواست با موفقیت انجام شده است.
- ۲۰۰ OK: درخواست با موفقیت انجام شده است.
- 3xx (تغییر مسیر): برای هدایت کاربر به یک URL دیگر استفاده میشود.
- ۳۰۱ Moved Permanently: منبع به طور دائمی به آدرس جدید منتقل شده است.
- 4xx (خطای کلاینت): خطایی از سمت کاربر رخ داده است.
- ۴۰۴ Not Found: منبع مورد نظر یافت نشد.
- ۴۰۱ Unauthorized: دسترسی غیرمجاز
- 5xx (خطای سرور): خطایی در سمت سرور رخ داده است.
- ۵۰۰ Internal Server Error: خطای داخلی در سرور رخ داده است.
اهمیت پاسخهای HTTP
- درک نحوه کار وب: با شناخت پاسخهای HTTP، میتوانید بهتر درک کنید که وب چگونه کار میکند.
- دیباگ کردن: در صورت بروز مشکل در یک وبسایت، بررسی پاسخهای HTTP میتواند به شما در یافتن علت مشکل کمک کند.
- توسعه وب: هنگام توسعه وبسایتها و APIها، شما باید پاسخهای HTTP مناسب را به درخواستهای کاربران ارسال کنید.