پروتکل HTTP چیست؟
HTTP یک پروتکل لایهی ۷ شبکه، یعنی لایهی application است که برای برقراری ارتباط بین web client و وبسرور استفاده میشود. این پروتکل، با هر دو پروتکل اصلی لایهی transport، یعنی TCP و UDP سازگار است و میتواند بر پایهی آنها connection خود را ایجاد کند. در نسخههای اولیهی HTTP، برای ارسال هر منبع یا پاسخگویی به هر درخواست، connection جداگانهای ایجاد میشد و پس از ارسال response یا منبع موردنظر کاربر، connection بسته میشد. در نسخههای جدیدتر HTTP، این امکان وجود دارد که چندین منبع، تنها در یک connection برای یک کاربر خاص ارسال شوند که این اصلاح باعث شده تا کاربران، متوجه تاخیر کمتری در دریافت resource شوند.
عملکرد پروتکل HTTP
شیوهی کار پروتکل HTTP به این شکل است که کاربر، برای نمونه ۰یک مرورگر، درخواستی را برای سرور (برنامهای در حال اجرا) در قالب این پروتکل ارسال میکند. این درخواست میتواند یک request برای یک فایل HTML، تصویر یا حتا یک کد باشد.
پس از دریافت request، سرور آن را بررسی میکند و براساس پارامترهایی مانند در دسترس بودن resource (منبع) مورد نظر کاربر و درست بودن درخواست ارسال شده، کدی را برای client ارسال میکند. اگر این کد، نشاندهندهي آن باشد که هیچ مشکلی در درخواست ارسال شده، وجود منبع و دسترسی به آن وجود ندارد، سرور منبع مورد نظر client را نیز ارسال میکند.
هر server response به چه معناست؟
کدهای HTTP ارسال شده از سمت سرور را میتوان به ۵ دستهی کلی تقسیم کرد. تمامی این کدها، بهشکل یک عدد سه رقمی ارسال میشوند که رقم اول، نشاندهندهی آن است که این خطا به کدام یک از پنج دستهی زیر تعلق دارد.
۱- Informational Responses: این کدها نشاندهندهی آن هستند که درخواست دریافت شده است و سرور میتواند آن را تشخیص دهد. اما هیچ اطلاعاتی دربارهی نتیجهی request ارسال شده با خود ندارند. عدد مشخص کنندهی این پاسخها، عدد ۱ است و کدهای ارسال شده به صورت 1xx هستند.
۲- Successful Responses: ارسال این کد از سمت سرور به این معنی است که درخواست کاربر با موفقیت انجام شده است. برای نمونه، این درخواست میتواند برای دریافت یا ایجاد یک resource باشد. کدهای مشخص کنندهی این پیام بهشکل 2xx هستند. معروفترین این کدها، کد 200 است که نشان میدهد درخواست کاربر کاملن با موفقیت انجام شده است و اگر درخواست برای دسترسی به منبعی باشد، منبع مورد نظر هم برای کاربر ارسال میشود.
۳- Redirects: گاهی اتفاق میافتد که درخواست ارسال شده از سمت client درست است و منبع خواسته شده هم وجود دارد، ولی نام، مسیر یا مشخصاتی از آن تغییر کرده است. در این هنگام سرور با ارسال این کد و در ادامه با ارسال شکل تصحیح شدهی نام یا مسیر، به client میگوید که چگونه این درخواست را بازنویسی کند تا به منبع مورد نظر دست پیدا کند. کد این پیام بهشکل 3xx است.
۴- Client Error Responses: هر خطایی در ارسال درخواست از سمت client وجود داشته باشد، با این کد مشخص میشود. نمونهای از این خطاها، زمانی است که کاربر درخواست اشتباهی ارسال میکند (برای نمونه در request، خطای syntax وجود دارد) یا کاربر منبعی را درخواست میکند که وجود ندارد. یا برای نمونه، زمانی که کاربر فایل یا منبعی را درخواست میکند که اجازهی دسترسی به آن را ندارد )به اصطلاح، unauthorized است(. کدهای این خطا بهشکل 4xx هستند و پرکاربردترین آنها، کدهای ۴۰۰، ۴۰۳ و ۴۰۴ هستند. کد ۴۰۰ بیانگر پیام Bad Request، کد ۴۰۳ پیام Forbidden و کد 404 پیام Not Found است.
۵- Server Error Responses: هر زمان سرور در بررسی درخواست ارسال شده یا پاسخ دادن به آن دچار مشکل میشود، این خطا را ارسال میکند. مثلن فرض کنید client برای ارسال request، از روشی استفاده میکند که سرور آن را پشتیبانی نمیکند. سرور بعد از دریافت request، با درخواستی ناشناخته مواجه شده است (دقت کنید که این نمونه با نمونههای بیان شده در مورد ۴ تفاوت دارد. در مورد ۴، کاربر درخواست اشتباهی ارسال کرده است اما در این مورد، درخواست کاربر درست اما سرور قادر به فهمیدن آن درخواست نیست). از دیگر زمانهایی که سرور این کد را ارسال میکند، زمانی است که web application پاسخگو به این درخواست، برای ایجاد تغییرات down است یا زمانی که درخواستهای همزمان زیادی برای سرور ارسال شده است و سرور برای مدتی نمیتواند به درخواست جدیدی پاسخ بدهد. این خطاها با کدهایی به شکل 5xx ارسال میشوند.
انواع HTTP Request
برای برقراری ارتباط بین کاربر و سرور لازم است تا client درخواستهای خود را در قالب پیامهای مشخصی برای سرور ارسال کند و در header پیام ارسال شده، نوع درخواست را مشخص کند. تعدادی از رایجترین و پرکاربردترین انواع درخواستها عبارتند از:
۱- GET Method: این متد زمانی استفاده میشود که client برای دریافت یا دسترسی به یک resource، درخواست را ارسال میکند. استفاده از این نوع درخواست، فقط برای گرفتن منابع است و نباید تاثیر دیگری داشته باشد (برای نمونه نباید باعث ایجاد تغییر در فایلی در سمت سرور شود).
۲- HEAD Method: این نوع درخواست دقیقن مانند متد قبل است با این تفاوت که منبع مورد نظر برای کاربر استفاده نمیشود اما کاربر میتواند پاسخ سرور به یک درخواست GET را ببیند. برای نمونه شرایطی را فرض کنید که کاربر قرار است براساس اینکه آیا به یک resource خاص دسترسی دارد یا نه، تصمیمی بگیرد. در این حالت بهجای استفاده از متد GET و دریافت حجمی از دادهها که الزامن نیازی به آنها ندارد، از این متد استفاده میکند و پاسخ مورد نظر خود را دریافت میکند.
۳- POST Method: از این متد برای ارسال یک داده به وب سرور استفاده میشود. مانند زمانی که کاربر تصویری را برای پروفایل خود آپلود میکند. همچنین هنگامی که کاربر قصد دارد دادهای را در یک زیرشاخه از URLای خاص قرار دهد نیز از این متد استفاده میشود. مثلن فرض کنید که قرار است یک وبلاگ نویس، متنی را در دستهبندی موضوعات شخصی پست کند. در این حالت، با ارسال متن خود و همچنین URLای که به این بخش اشاره میکند، از سرور میخواهد تا این متن را در این شاخه قرار بدهد.
۴- PUT Method: از این متد برای بهروز کردن یا قرار دادن یک جایگزین برای یک منبع استفاده میشود. زمانی که کاربر URL مورد نظر خود را همراه یک منبع برای سرور ارسال میکند، با فرض valid بودن درخواست کاربر، اگر منبعی در URL داده شده وجود داشته باشد، منبع ارسالی کاربر جایگزین آن میشود. در غیر این صورت، سرور این منبع را به عنوان منبعی جدید ایجاد میکند و فایل ارسالی کاربر را در آن قرار میدهد.
۵- DELETE Method: همانطور که از نام این متد مشخص است، اگر درخواست ارسالی با این متد معتبر باشد، منبع مورد نظر کاربر حذف میشود.
تمام web serverها باید دست کم از دو متد اول پشتیبانی کنند. نکتهی مهم آن است که نام متدها، نسبت به بزرگ یا کوچک بودن حروف حساس هستند و برای نمونه نمیتوان از کلمهی post به جای POST استفاده کرد.