لیست متدهای http
در این نوشته از سری نوشتههای آموزشی رایگان ما به بررسی لیست متدهای http میپردازیم.
لیست متدهای http
به طور کلی متدهای http به 9 نوع تقسیم میشود:
- Get
- Put
- Patch
- Delete
- Post
- Head
- Options
- Connect
- Trace
متد | CRUD | مثال |
Post | Create | عمدتا یک رکورد در لیستی که درمنبعی مشخص است ایجاد میکند. |
Get | Read | معمولا برای دریافت و خواندن اطلاعات استفاده میشود. |
Put | Update/Replace | این متد برای آپدیت کردن دیتا استفاده میشود. |
Patch | Update/Modify | این متد نیز برای آپدیت استفاده میشود که تفاوتش با متد قبلی توضیح داده شده است. |
Delete | Delete | سادهترین متد برای حذف رکوردی خاص یا همه رکوردها است. |
حالا این CRUD که اون بالا نوشتیم چی هست؟!
به مجموعه عملیات ساختن یا ایجاد (Create)، خواندن (Read)، آپدیت یا بروزرسانی یک رکورد (Update) و حذف رکوردی یا رکوردهایی (Delete) میگوییم؛ البته این چهار عمل را CRUD نیز میگوییم.
نکته: متدهای Idempotent متدهایی هستند که اجرای درخواستهای از این نوع هر چند مرتبه که انجام شود و نتیجه یکسانی دارد. اما متدهای غیر Idempotent متدهایی هستند که اجرای آنها به دفعات باعث به وجود آمدن آنومالی و side effectهای متعددی خواهد شد.
متد POST
این متد برای ساخت یا ایجاد رکوردی جدید در منبع (میتواند DB شود) استفاده میشود. پارامترهای ارسالی این نوع متدها از طریق نوار url قابل خواندن نیست. این متد از نوع غیر Idempotent است و اجرای چندباره این نوع درخواست باعث به وجود آمدن رکوردهای متعددی از پارامترهای تکراری خواهد بود.
امنیت دادهی ارسالی در درخواست نسبتا بالاست (به قول بچههای تست نفوذ و امنیت no system is safe) و بازه انواع درخواستهای ارسالی شامل:
- رشتهها. (دادههای متنی)
- دادههای باینری. (آپلود فایل)
تمامی دیتاهای ارسالی در بدنه درخواست قرار میگیرد.
مزایا و معایب متد Post
- امنیت نسبتا بالاتری نسبت به متد Get دارد و اطلاعات ارسالی در Address bar مرورگر قابل مشاهده نیستند.
- سرعت درخواستهای post (به مقدار خیلی خیلی کمی) کمتر از درخواستهای متد Get هستند.
- محدودیت کمتری (هم به لحاظ نوع مقادیر ارسالی و هم به لحاظ طول url) نسبت به Get دارد. (در برخی منابع گفته شده است که طول محدودی برای url ندارد.)
- هرگز در history مرورگر ذخیره نمیشود.
- به هیچ وجه قابل cache شدن هم نیست.
متد GET
این متد از نوع Idempotent است. و اجرای چند باره این درخواست نتیجه یکسانی خواهد داشت. این متد عمدتا برای خواندن اطلاعات از یک سورس مشخص استفاده میشود و فرمت response به صورت json/xml است. درخواستهای از نوع متد get بدنه یا body ندارند چرا که عمدتا برای درخواست اطلاعات استفاده میشود. گاهی برای فرمت کردن دادهای که از قبل json یا xml نیست هم از این متد استفاده میشود. این متد پارامترهای ورودی را با فرمت زیر معمولا ارسال میکند؛ کد زیر query Params پیش فرض سرچ در cms وردپرس است.
camelcase.ir/?s=Search-Term
رشتههایی که space در میان واژگان دارند از طریق “کاراکتر –” از هم جدا میشوند. پارامترها با ? شروع میشوند و هر property میتواند value داشته و یا فاقد آن شوند. (بسته به برنامه نویسی سمت back-end)
مقادیر با & از هم جدا میشوند. به عنوان مثال:
camelcase.ir/?name=Amir&user-age=&user-id=1
در کد بالا name و user-id هرکدام دارای مقداری هستند ولی user-age مقداری ندارد.
مزایا و معایب
- برای ارسال اطلاعات مهم نظیر پسوردها یا اطلاعات کارتهای بانکی نمیتوان(نباید) از این متد استفاده کرد چون تمام مقادیر ارسالی در هر درخواست در address bar مرورگر قابل مشاهده هستند.
- دادهها میتوانند bookmark بشوند (امکان به اشتراک گذاری لینک حاوی این query params وجود دارد)
- متد get دارای محدودیت طول است، یعنی مقادیر بسیاری را نمیتوان در هر request ارسال کرد. (max length = 2048 chars in url).
- عموما درخواستهای از نوع Get قابل کش شدن هستند و توی لاگ سرور. (عمدتا یک سری اسکریپت وجود دارد که هزاران رکورد از تمام اتفاقاتی که میافتد (سمت کاربر یا سمت سرور) لاگ میگیرند) هم ذخیره میشوند.
- در درخواستهای این نوع تنها کاراکترهای ASCII قابل ارسال هستند.
متد PUT
این متد از نوع Idempotent است. و اجرای چند بارهی این درخواست نتیجه یکسانی خواهد داشت. ماهیت این متد در ظاهر برای آپدیت یک رکورد از اطلاعات استفاده میشود ولی در عمل به این صورت است که اول رکورد مورد نظر را پاک میکند و (در همان مکان) یک رکورد جدید با استفاده از پارامترهای ارسالی جدید ایجاد میکند که عملا دیتای ما Replace میشود. حالا اینجا سوال این هست که اگر فیلدهایی که در سرور موجود است جایگزینی در ارسال درخواست put ما نداشته چه اتفاقی برای آنها میافتد؟؟! چون رکورد جاری حذف میشود و بعد دادهی ما replace میشود فیلدهایی که جایگزین جدیدی برای آنها تعریف نشده مقدار null خواهند گرفت. و عملا در صورت عدم در نظر گرفتن همه فیلدها در درون درخواست مقداری از اطلاعات قبلی ما که نیازی به ویرایش یا آپدیت شدن نداشتند از بین میروند.
متد PATCH
این متد هم از نوع Idempotent است و و اجرای چند باره این درخواست نتیجه یکسانی خواهد داشت. این متد هم مکانیزمی مشابه به متد put دارد ولی مزیتش نسبت به put این است که فیلدهایی که مقادیر جایگزین در درخواست ارسالی برای آنها درنظر گرفته نمیشود از بین نمیروند. در اصل فقط مقادیری که باید نغییر کنند تغییر میکنند. مثلا اگر نیاز است، پسورد یک کاربر عوض شود اگر از متد put استفاده میکردیم همه اطلاعات کاربری اون شخص اعم از ایمیل و نام کاربری از بین میرفتند. ولی در متد Patch فقط پسورد عوض میشود و باقی فیلدها مقادیرشان دست نخورده باقی میماند.
متد DELETE
این متد برخلاف متد Post از نوع Idempotent است و اجرای چند بارهی این درخواست نتیجه یکسانی خواهد داشت. ساده ترین روش حذف فایل یا رکوردی خاص از یک منبع مشخص است. ممکن است این requestها شامل body شوند. Responseهای موفقیت آمیز هم ممکن است body داشته. این نوع درخواستها در مرورگر cache نمیشوند. عموما وقتی درخواستی موفقیت آمیز ارسال میشود Responseها با http messageهای متفاوتی ممکن است دریافت شوند. برای مثال درخواست زیر فایلی به نام badfile.html رو از سرور حذف میکند.
DELETE /badFile.htm HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
Host: www.camelCase.ir
Accept-Language: en-us
Connection: Keep-Alive
و در پاسخ چنین چیزی دریافت میشود:
HTTP/1.1 200 OK
Date: Mon, 27 Jul 2019 12:28:53 GMT
Server: Apache/2.2.14 (Win32)
Content-type: text/html
Content-length: 30
Connection: Closed
که با توجه به message code 200 که به منزله ok است میگوید که این کار انجام شده است. اگر این درخواست، حاوی body هم شود، به شکل زیر میشود:
<html> <body> <h1>url deleted.</h1> </body> </html>
متد HEAD
این متد هم همانند متد get عمل میکند با این تفاوت که فقط head درخواست return میشود که این head شامل یک سری اطلاعات از پارامترهای ارسالی و … است. Body درخواست return نمیشود؛ در عمل بیشتر برای چک کردن مقدار برگشتی هر Get Request استفاده میشود.
متد OPTIONS
این متد عمدتا زمانی استفاده میشود که میخواهیم بدانیم چه متدهایی در وب سرور مد نظر ما پشتیبانی میشود که میتوانیم url خاصی را به آنها بدهیم یا اینکه از کاراکتر Astrisk (*) جلوی OPTIONS استفاده کنیم تا ببینیم در کل سرور چه متدهایی ساپورت میشود.
برای مثال اینجا داریم که:
OPTIONS * HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
و درصورت موفقیت آمیز بودن درخواست نتیجه به شکل زیر خواهد بود:
HTTP/1.1 200 OK
Date: Mon, 27 Jul 2019 12:28:53 GMT
Server: Apache/2.2.14 (Win32)
Allow: GET,HEAD,POST,OPTIONS,TRACE
Content-Type: httpd/unix-directory
اگر به سطر سوم دقت کنید تمام متدهای پشتیبانی شده رو برای ما مشخص کرده است.
متد TRACE
این متد معمولا برای دیباگ کردن و در پروسهی Development استفاده میشود.
حالا به چه صورت؟؟!
به این شکل که وقتی درخواستی از نوع TRACE برای سرور از سمت کلاینت ارسال میشود سرور برای کلاینت درخواستی که کلاینت فرستاده بود را مجدد میفرستد تا کلاینت بتواند Content درخواستی که ارسال کرده بوده را مشاهده کند.
مثال:
TRACE / HTTP/1.1
Host: www.camelcase.ir
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
و نتیجهی برگشتی درصورت موفقیت آمیز بودن درخواست به شکل زیر خواهد بود.
HTTP/1.1 200 OK
Date: Mon, 27 Jul 2019 12:28:53 GMT
Server: Apache/2.2.14 (Win32)
Connection: close
Content-Type: message/http
Content-Length: 39 TRACE / HTTP/1.1
Host: www.camelcase.ir
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
متد CONNECT
با استفاده از این متد میشود یک اتصال یا connection بین کلاینت و وب سرور که در مثال ما Apache است را برقرار میکنیم: برای مثال در درخواست زیر قرار است که به سرور فرضا camelcase درخواست کانکشن بدهیم:
CONNECT www.camelcase.ir HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
در صوررتی که این درخواست با موفقیت انجام بشه نتیجه Head به شکل زیر خواهد بود.
HTTP/1.1 200 Connection established
Date: Mon, 27 Jul 2019 12:28:53 GMT
Server: Apache/2.2.14 (Win32)
نظرات خود را در ارتباط با مقالهی لیست متدهای http برای ما بنویسید.
ممنون و تشکر بابت مطالب عالیتون
فوق العاده بود
موفق باشید