آشنایی کامل با HTTP Request/Response

زمان مطالعه: 4 دقیقه

با سلام و درود، خب از عنوان مطلب مشخص هست که در مورد چی میخوام صحبت کنم، مقدمه چینی نمی کنم و سریع میرسم سراغ اصل مطلب، احتمالا خیلیامون از Http Requestها ساتفاده کردیم ولی به طور کامل و دقیق با Http Request آشنا نیستیم. در این مطلب سعی کردم حداقل اطلاعاتی که به نظرم یه برنامه نویس وب باید در مورد HTTP Request بدونه رو گردآوری کنم.

آشنایی با HTTP Request

HTTP یک پروتکل request-response می باشد، پس هر چیزی با یک request آغاز می شود، هر HTTP Requestشامل یه تعداد خط متن به تریتب زیر می باشد:

  1. request line
  2. صفر یا تعدادی request Headers
  3. یک خط خالی
  4. Message Body

یک پیام HTTPمعمولی به شکل زیر می باشد:

GET /Protocols/rfc2616/rfc2616.html HTTP/1.1
Host: www.w3.org
User-Agent: Mozilla/5.0
(empty line)

در request خط اول request-line می باشد:

GET /Protocols/rfc2616/rfc2616.html HTTP/1.1

این خط ابتدا request methodرا دارد و سپس Uniform Resource Identifier یا همون (URI) و سپس ورژن HTTP را دارا می باشد.

دقت داشته باشید، خط آخر باید یک خط خالی باشد حتی اگر message body نداشته باشیم.

متد های Request

متد request اولین کلمه از request-line می باشد و عملی که روی سورس باید انجام شود را مشخص می کند.

  • HTTP 0.9 فقط دارای یک متد GET بود.
  • HTTP 1.0 متد های POSTو HEAD vh hqhti ;vn.
  • HTTP 1.1 متد PUT ،‌DELETE ، OPTIONS ، TRACE و CONNECTرا اضافه کرد و همچنین امکان اضافه کردن متدهای دیگر را فراهم نمود.

HTTP 1.1 در نظر گرفتن متدهای GETو HEAD را اجباری کرد در صورتی که دیگر متدها را به صورت آپشنال در نظر گرفت.

  • GET – به سرور می گوید که منبع مورد نظرش را برایش برگرداند.

  • HEAD – مشابه با GETبا این تفاوت که server مجبور به بازگرداندن message body نمی باشد. این متد معمولا برای گرفتن header های پاسخ (response) بدون حمل کردن وزن message bodyروی network می باشد.

  • POST – به سرور می گوید که message bodyباید به منبعی که توسط URI شناسایی شده، داده شود. این که سرور با message bodyچه کند به خود سرور مربوط است.

  • PUT – به سرور می گوید که داده داخل message body باید منبع موجود در URIداده شده باشد.اگر داده درون منبع شناسایی شده توسط URI وجود داشت، داده جدید جایگزین می شود. در غیر این صورت، یکی منبع جدید در مکان URI ساخته می شود.

  • DELETE – به سرور می گوید تا منبع شناسایی شده توسط URIرا حذف کند.

  • OPTIONS- به سرور می گوید که لیستی از متد های HTTP که سرور پشتیبانی می کند را باز گرداند.

  • PATCH- به سرور میگوید که داده درون message body منبع شناسایی شده در URI را ویرایش می کند.

ریکوئست متد های امن – Safe request methods

یک متد، امن در نظر گرفته می شود اگر stateسرور را تغییر ندهد. به این معنی که سرور فقط اطلاعات فراهم کند، نه چیز دیگری. GET، HEAD، OPTIONS و TRACE متد های امن هستند زیرا آنها هیچ چیزی را درون سرور تغییر نمی دهند. در مقایسه، POST، PUT و DELETE متد هایی هستاند که وضعیت/state سرور را تغییر می دهند، برای مثال، پس از یک request از نوع POST ، داده درون سرور تغییر می کند.

ریکوئست متد های idempotent

یک ریکوئست متد در صورتی idempotent در نظر گرفته می شود که state سرور را برای بار دوم که متد با داده مشابه فراخوانی شد، تغییر ندهد.متدهای امن با توجه به تعریفی که داشتند، همگی idempotentهستند. متد های PUT و DELETE هم idempotentهستند ولی safe نیستند.

Request Headers

علاوه بر متد که روکوئست آن را مشخص می کند، اطلاعات دیگری نیز درون HTTP request headers قرار دارد. request headers ها با صورت جفت هان نام:مقدار هستند که توسط دو نقطه از هم جدا و به صورت متن می باشند.

HTTP request headers اغلب آپشنال هستند. تنها header که درون HTTP 1.1 اجباری است، فیلد Host headerمی باشد.اما اگر پیام شامل message bodyباشد، شما نیاز دارید که Content-Length یا فیلد Transfer-Encoding را داشته باشید.

در جدول زیر، HTTP request header های رایج را مشاهده می کنید:

فیلد هدرتوضیحات
AcceptContent type هایی که توسط کلاینت به عنوان قسمتی ازHTTP response قابل پذیرش هستند.برای مثال ،Accept: text/html به سرور این سیگنال را می‌دهد که کلاینت نیاز به response body دارد که content type آن از نوع HTML باشد.
Accept-Charsetمجموعه charset هایی که مورد نیاز سرور است. برای مثال، Accept-Charset: utf-8 به سرور می گوید که کلاینت نیاز به response body به صورت utf-8 دارد.
Authorizationبرای ارسال Basic Authentication credential به سمت سرور استفاده می شود
Cookieکلاینت باید cookieهایی که توسط سرور فراخوانی شده تنظیم شده است را برگرداند. اگر سرور سه cokkie را قبلا روی مرورگر تنظیم کرده باشد، فیلد هدر Cookie شامل تمامی سه کوکی به صورت جدا شده توسط semicolon و جفت های از نوع stringو به صورت name-value خواهد بود.
Cookie: my_first_cookie=hello; my_second_cookie=world
Content-Lengthطول request body یه صورت octet
Content-Typeنوع محتوای بدنه درخواست (request-body) را مشخص می کند .زمانی که POSTیا PUT فرستاده می شود، نوع محتوی (content-type) به صورت پیش فرض x-www-form-urlen-coded می باشد. اما اگر یک فایل آپلود شود، نوع محتوی باید به صورت multipart/form-data باشد.
HOSTنام سرور را مشخص می کند، همراه با شماره پورت. اگر شماره پورت فرستاده شنده باشد، پورت ۸۰ در نظر گرفته می شود.
Referrerآدرس صفحه قبل که به صفحه درخواست داده شده لینک شده است.
User-Agentکلاینتی که فراخوانی کرده است را توصیف می کند.

HTTP Response

به ازای هر درخواست-request یک HTTP Response فرستاده می شود. همانند HTTP Request، پاسخ یا همان responseنیز شامل چند خط متنی می شود:

  • یک خط وضعیت
  • صفر یا چند response headers
  • یک خط خالی
  • بدنه پیام – message body که دلخواه می باشد.

یک HTTP Responseبه شکل زیر خواهد بود:

200 OK
Date: Sat, 22 Nov 2014 12:58:58 GMT
Server: Apache/2
	Last-Modified: Thu, 28 Aug 2014 21:01:33 GMT
Content-Length: 33115
Content-Type: text/html; charset=iso-8859-1
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/
	TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns='http://www.w3.org/1999/
	xhtml'> <head><title>Hypertext Transfer Protocol -- HTTP/1.1</title></
	head><body>…</body></html>

خط اول یا همان خط وضعیت، نشان دهنده یک status code و یک عبارت توضیح دهنده ی آن وضعیت می باشد.

Response Status CODE

۵ کلاس برای Http Response code ها وجود دارد که مبتنی بر رقم اول کد هستند:

status codeتوضیحات
1XXاطلاعاتی. به کلاینت می گوید که سرور ریکوئست را گرفته و در حال پردازش آن است.
2XXموفقیت. این چیزیست که کلاینت به دنبال آن است. سرور درخواست را گرفته و آن را با موفقیت پردازش کرده است. پاسخ استاندارد در این کلاس 200 OKمی باشد.
3XXتغییر مسیر. به کلاینت می گوید که درخوسات دریافت شده و پردازش شده است، منتهی کلاینت نیاز است تا عما بیشتری برای تکمیل انجام دهد.
4XXکلاینت ارور. به کلاینت می گوید که چیزی در requestاشتباه است. وضعیتی که در این کلاس بیشتر از همه شناخته شده است، وضعیت 404 Not Found می باشد
5XXسرور ارور. به کلاینت می گوید که مشکلی با درخوسات مورد نظر وجود دارد ولی از سمت سرور است. کد وضعیت معمول در این کلاس 500 Internal Server Errorمی باشد.

Response Headers

مشابه به request Headers هستند. همگی به صورت جفت متن های name-value و جدا شده با semicolonهستند.

فیلد هدرتوضیحات
Allowبه کلاینت می گوید که چه متدهای ریکوئستی توسط سرور پشتیبانی می شوند.
Content-Lengthطول پاسخ – به صورت بایت های ۸ بیتی
Content-Typeنوع محتوی بدنه پاسخ
Dateزمان فعلی را به صورت GMTمی گوید
Locationاین هدر با redirectionاستفاده می شود تا به کلاینت بگوید درخوسات بعدی را به کدام URLبزند.
Serverنام دامنه سروری که پاسخ را بر می گرداند.
Set-cookieکوکی ها را روی کلاینت ثبت می کند
WWW-Authenticate