خلاصه ای از نکات پروتکل HTTP (برگرفته از Tutorialspoint)

پرسیده شده
فعالیت 1466 روز پیش
دیده شده 1220 بار
13

پروتکل HTTP یا پروتکل انتقال ابر متن  در لایه برنامه یا Application قرار داره! در واقع کاربرد این پروتکل برای سیستم های توزیع شده ، سیستم های همکار و اطلاعات فرارسانه ای هستش .

در واقع پایه و اساس ارتباط داده ها در شبکه جهانی وب یا بهتر بگیم اینترنت از سال ۱۹۹۰ با این پروتکل آغاز شده. پروتکل HTTP یک پروتکل عمومی و مستقل از وضعیت در سرور یا Stateless هست که می تونه به منظور استفاده از هدرها ، ارور کدها و ... استفاده بشه.

 

به طور کلی میتونیم بگیم که پروتکل HTTP یک پروتکل ارتباطی مبتنی بر TCP/IP هستش که برای تحویل یک سری داده از قبیل فایل های HTML ، تصاویر ، ویدئوها ، نتایج queryها و غیره کاربرد داره.درگاه پیش فرض این پروتکل ۸۰ هست ولی از پورت های دیگه هم میتونه استفاده کنه.در واقع این پروتکل یک راه و روش استاندارد رو برای ارتباط بین کامپیوتر ها ایجاد میکنه . این پروتکل چگونگی ساخت یک درخواست از سمت کلاینت به سرور و نحوه ایجاد اون و همچنین نحوه پاسخ دهی سرور رو مشخص می کنه!

 

میتونیم به ۳ ویژگی پروتکل HTTP اشاره کنیم که در عین ساده بودن ، این پروتکل رو قدرتمند کرده :

 

·         Connectionless بودن :  یک کاربر یا یک کلاینت HTTP ، مانند یک مرورگر وب یک درخواست HTTP ایجاد میکنه و منتظر پاسخی از طرف سرور میشه . سرور پس از اینکه درخواست رو پردازش میکنه ، بعد از قطع ارتباط کاربر پاسخ رو ارسال میکنه .بنابراین نتیجه ای که می گیریم اینه که کلاینت ها و سرور ها فقط در زمان ارسال درخواست و پاسخ درخواست ها از وضعیت همدیگه اطلاع دارن یا به نوعی میشه گفت برای ارسال داده هاشون بهم متصل هستند.

 

·         مستقل از متن بودن : به این معنیه که تا زمانی که کلاینت ها و سرورها بتونن داده های خودشون رو مدیریت کنند ، هرنوع داده ای رو می تونن توسط پروتکل HTTP ارسال کنن! البته باید گفت که تعیین نوع  MIME-type از طرف کلاینت ها و سرور ها نیز لازمه !

 

·         Stateless بودن :همونطور که گفتیم سرور و کلاینت در زمان ارسال و دریافت از یکدیگه مطلع هستند و اطلاعات لازم رو برای همدیگه ارسال می کنند ، پس باید بگیم سرور و کلاینت به طور کل  همدیگه رو فراموش میکنند و به هم کاری ندارن!به دلیل ماهیتی که این پروتکل داره ، هیچ کلاینتی اطلاعات درخواست های متعدد رو نمیتونه نزد خودش نگه داره!

 

کلاینت :

کلاینت درخواست خودش را از طریق متد درخواست ارسال میکنه ،این درخواست شامل URI( مخففuniform resource identifier -  یک URI میتواند یک نام، آدرس اینترنتی یا هر دوی این موارد باشد. درحالی که یک URL فقط آدرس اینترنتی است. URL ها زیر مجموعه URI ها هستند. به این معنا که تمامی URL ها URI هستند اما هر URI یک URL نیست) ، نسخه پروتکل یا ورژن  آن، یک پیغام MIME که حاوی اطلاعات کاربر و احتمالا یک محتوا در  Body هست می تونه باشه.

 

سرور:

سرور از طریق کد وضعیت پاسخ کلاینت رو میده . این پیغام میتونه موفقیت آمیز بودن پاسخ یا ارور رو نمایش بده . پس از این ، اطلاعاتی ازقبیل متاها ، اطلاعات سرور و ... رو ارسال می کنه.

 

خب بهتره یک نگاهی به پارامترهای پروتکل HTTP بندازیم :

در اولین خط ، نسخه یا ورژن HTTP نشون داده میشه . مثلا :  HTTP/۱.۰

یک URI که بالا هم بهش اشاره کردیم ، برای شناسایی یک منبع مثل وب سرورها ، وب سایت ها و ... مورد استفاده قرار می گیره و فرمت زیر رو داره :

URI = "http:" "//" host [ ":" port ] [ abs_path [ "?" query ]]

 

حالا اگر پورت خالی باشه ، به شکل پیش  فرض مقدار ۸۰ رو میگیره و اگر abs_path مقدار خالی داشته باشه ، مقدار / میگیره. کاراکترهایی غیر از مقادیر ذخیره شده با مقادیر هگزادسیمال انکود خواهند شد.(مانند URL های فارسی در سایت های ایرانی)

تاریخ و ساعت بدون هیچ استثنایی باید بر اساس زمان گرینویچ یا GMT باشه. . موارد قابل نمایش :

Sun, ۰۶ Nov ۱۹۹۴ ۰۸:۴۹:۳۷ GMT  ; RFC ۸۲۲, updated by RFC ۱۱۲۳
Sunday, ۰۶-Nov-۹۴ ۰۸:۴۹:۳۷ GMT ; RFC ۸۵۰, obsoleted by RFC ۱۰۳۶
Sun Nov  ۶ ۰۸:۴۹:۳۷ ۱۹۹۴       ; ANSI C's asctime() format

 

همچنین این پروتکل در فیلد های Content-Type و  Acceptاز انواع رسانه دیجیتال برای فراهم سازی داده های قابل توسعه استفاده می کنه.همه این مقادیر یا Media-typeها در IANA ثبت می شن.شکل عمومی تعیین نوع رسانه به شرح زیره:

media-type     = type "/" subtype *( ";" parameter )

مثال :

Accept: image/gif

 

پروتکل HTTP از تگ های مربوط به زبان در فیلدهای Accept-Language و  Content-Language fieldsاستفاده می کنه .

شکل نحوی :

language-tag  = primary-tag *( "-" subtag )

مثال :

en, en-US, en-cockney, i-cherokee, x-pig-latin

 

همانطور که در این جلسه از طرف استاد آوند اشاره شد ، فرمت درخواست ها و پاسخ های HTTP به شکل زیره :

  • A Start-line
  • Zero or more header fields followed by CRLF
  • An empty line (i.e., a line with nothing preceding the CRLF)
  • indicating the end of the header fields
  • Optionally a message-body

 

خط شروع یا Start-line به شکل نحوی زیر نمایش داده میشه :

start-line = Request-Line | Status-Line

مثال :

GET /hello.htm HTTP/۱.۱     (This is Request-Line sent by the client)

-----------------------------------------------------------------------------------------------------------------------------

HTTP/۱.۱ ۲۰۰ OK             (This is Status-Line sent by the server)

در خط اول(خط درخواست) که در خواست از طرف کاربر یا کلاینت به سرور ارسال شده ابتدا متد ارسالی ، نوع فایل درخواستی و سپس نسخه پروتکل مشخص شده ولی در پاسخ سرور نسخه پروتکل همراه با شماره وضعیت پاسخ مبنی بر موفقیت آمیز بودن یا نبودن یا موارد دیگر اومده!

در زیر یک سری کد وضعیت رو براتون لیست کردم – ببینید :

·        کدهای سری ۱۰۰، مربوط به اطلاعات (Informational)

·         کد ۱۰۰، ادامه ارسال (Continue)

·         کد ۱۰۱، تعویض پروتکل ها (Switching Protocols)

·         کد ۱۰۲، در حال پردازش (Processing)

·        کدهای سری ۲۰۰، درخواست موفق (Success)

·         کد ۲۰۰، پاسخ موفق (OK)

·         کد ۲۰۱، ساخته شده (Created)

·         کد ۲۰۲، موافقت شده (Accepted)

·         کد ۲۰۳، اطلاعات غیر معتبر (Non-Authoritative Information)

·         کد ۲۰۴، پاسخ بدون محتوا (No Content)

·         کد ۲۰۵، بازنشانی محتوا (Reset Content)

·         کد ۲۰۶، محتوای جزئی (Partial Content)

·        کدهای سری ۳۰۰، انتقال (Redirection)

·         کد ۳۰۰، انتخاب چندگانه (Multiple Choices)

·         کد ۳۰۱، انتقال همیشگی (Moved Permanently)

·         کد ۳۰۲، پیدا شد (Found)

·         کد ۳۰۳، دیدن منبعی دیگر (See Other)

·         کد ۳۰۴، بدون تغییر (Not Modified)

·         کد  ۳۰۵، استفاده از پروکسی (Use Proxy)

·         کد ۳۰۶، تعویض پروکسی (Switch Proxy)

·         کد ۳۰۷، انتقال موقت (Temporary Redirect)

·        کدهای سری ۴۰۰، خطای سمت کاربر (Client Error)

·         کد ۴۰۰، درخواست بد (Bad Request)

·         کد ۴۰۱، دسترسی نا معتبر (Unauthorized)

·         کد ۴۰۲، نیاز به پرداخت (Payment Required)

·         کد ۴۰۳، دسترسی غیر مجاز (Forbidden)

·         کد ۴۰۴، منبع درخواستی پیدا نشد (Not Found)

·         کد ۴۰۵، متد غیر مجاز (Method Not Allowed)

·         کد ۴۰۶، غیر قابل قبول (Not Acceptable)

·         کد ۴۰۷، نیاز به مجوز پروکسی (Proxy Authentication Required)

·         کد ۴۰۸، پایان حداکثر زمان درخواست (Request Timeout)

·         کد ۴۰۹، تعارض (Conflict)

·         کد ۴۱۰، محذوف (Gone)

·         کد ۴۱۱، عدم ارسال طول درخواست (Length Required)

·         کد ۴۱۲، پیش شرط رد شده(Precondition Failed)

·         کد ۴۱۳، درخواست خیلی طولانی (Request Entity Too Large)

·         کد ۴۱۴، آدرس وب خیلی طولانی (Request-URI Too Long)

·         کد ۴۱۵، فرمت پشتیبانی نشده (Unsupported Media Type

·         کد ۴۱۶،  حد درخواستی غیر اقناع کننده (Requested Range Not Satisfiable)

·         کد ۴۱۷، انتظارات رد شده(Expectation Failed)

·        کدهای سری ۵۰۰، خطای سمت سرور (Server Error)

·         کد ۵۰۰، خطای داخلی سرور (Internal Server Error)

·         کد ۵۰۱، غیر مجهز یا تکمیل نشده (Not Implemented)

·         کد ۵۰۲، خطای دروازه میانجی (Bad Gateway)

·         کد ۵۰۳، سرویس خارج از دسترس (Service Unavailable)

 

خب میخوایم از فیلدهای هدر کمی بگیم :

قسمت هدر اطلاعات مورد نیاز درباره درخواست ها یا پاسخ ها به ما میده.چهار نوع هدر در این بخش داریم :

General-header : این فیلد به طور کلی برای پیام های درخواست ها و پاسخ ها کاربرد داره.

Request-header : این فیلد برای پیام های مربوط  به درخواست کلاینت کاربرد داره .

Response-header : این فیلد نیز همونطور که از اسمش پیداست ، برای پیغام های مربوط به پاسخ های سرور ها کاربرد داره.

Entity-header : این فیلد هم اطلاعاتی درباره متن داخل Body یا عدم موجود بودن متن رو نمایش میده.

 

قسمت Body که در بالا گفتیم یک بخش اختیاریه اما اگه در دسترس کاربر باشه ، اطلاعات مرتبط با محتوا  را نمایش خواهد داد.

 

فرمت خط درخواست به شکل زیره :

Request-Line = Method SP Request-URI SP HTTP-Version CRLF

 

خب اولین مورد متد ها هستن :

·         GET : از این روش برای بازیابی اطلاعات از سرور با URI استفاده میشه .درخواست ها با این متد باید داده ها را بازیابی کنند و هیچ اثر دیگری بر روی داده ها نخواهند داشت.

·         HEAD : همانند get ولی خط وضعیت و هدرها را منتقل می کند.

·         POST : از این درخواست برای ارسال اطلاعات به سرور استفاده میشه مانند اطلاعات مشتری ، فایل های آپلودی ، فرم ها و ...

·         PUT : جایگزینی تمامی منابع نمایش داده شده با محتوای بارگذاری شده

·         DELETE : حذف تمام منابع نمایشی فعلی دریافت شده از منبع ، از طریق URI

·         CONNECT : ایجاد یک تونل به سرور شناخته شده از طریق URI داده شده

·         OPTIONS : شرح گزینه های ارتباطی برای منبع مورد نظر.

 

خب میرسیم به Request-URI. در واقع Request-URIها منابعی رو که درخواست ها رو می پذیرند ، شناسایی میکنه . فرمت کلیش هم به شکل زیره :

Request-URI = "*" | absoluteURI | abs_path | authority

ستاره برای زمانی استفاده میشه که درخواست HTTP برای منبعی خاص ارسال نشه ، بلکه برای خود منبع یا سرور ارسال بشه  و فقط در زمانی میشه از این روش استفاده کرد که در سمت سرور نیازی به تایید نباشه . یه مثال :

OPTIONS * HTTP/۱.۱

absoluteURI هم در زمانی مورد استفاده قرار می گیره که درخواست HTTP برای یک پروکسی ارسال بشه.در واقع از پروکسی درخواست می کنه که سرویس مد نظر یا درخواست لازم رو به یک حافظه موقت یا کش معتبر ارسال کنه و پاسخ رو برگردونه. هم یه مثال دیگه بزنیم :

GET http://www.w۳.org/pub/WWW/TheProject.html HTTP/۱.۱

متداول ترین روش استفاده از Request-URI شناسایی یک منبع یا یک سرور واقعی  است . به عنوان مثال یک کلاینت که میخواهد منابع خودش رو از یک سرور بازیابی کنه باید یک ارتباط  TCP با پورت ۸۰ ایجاد کنه و خطوط زیر رو ارسال کنه : (هاست: www.w۳.org)

GET /pub/WWW/TheProject.html HTTP/۱.۱

Host: www.w۳.org

 

انواع متد :

متد Get :  از این متد برای خواندن اطلاعات یک سرور یا یک منبع میشه استفاده کرد.البته امکان تغییر اطلاعات از این متد وجود نداره. گاهی اوغات هم از این متد برای برگردوندن اطلاعات به فرمت XML یا JSON هم استفاده می کنن.

درخواست :

GET /hello.htm HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
Host: www.tutorialspoint.com
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: Keep-Alive

پاسخ سرور :

HTTP/1.1 200 OK
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache/2.2.14 (Win32)
Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT
ETag: "34aa387-d-1568eb00"
Vary: Authorization,Accept
Accept-Ranges: bytes
Content-Length: 88
Content-Type: text/html
Connection: Closed

 

بدنه :

<html>
<body>
<h1>Hello, World!</h1>
</body>
</html>

متد Head :

عملکرد این متد چیزی شبیه به متد Getهستش.به جز اینکه فقط هدرها رو برمی گردونه نه بدنه رو. مثال :

HEAD /hello.htm HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
Host: www.tutorialspoint.com
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: Keep-Alive

پاسخ سرور :

HTTP/1.1 200 OK
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache/2.2.14 (Win32)
Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT
ETag: "34aa387-d-1568eb00"
Vary: Authorization,Accept
Accept-Ranges: bytes
Content-Length: 88
Content-Type: text/html
Connection: Closed

 

 

متد Post :

از این متد برای ارسال تعدادی داده به یک منبع یا سرور مشخص برای پردازش استفاده میشه. در مثال زیر از این متد برای ارسال یک فرم به سرور که توسط پردازشگر .cgi پردازش شده است ، استفاده شده :

 

POST /cgi-bin/process.cgi HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
Host: www.tutorialspoint.com
Content-Type: text/xml; charset=utf-8
Content-Length: 88
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
<?xml version="1.0" encoding="utf-8"?>
<string xmlns="http://clearforest.com/">string</string>

 

پاسخ سرور :

HTTP/1.1 200 OK
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache/2.2.14 (Win32)
Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT
ETag: "34aa387-d-1568eb00"
Vary: Authorization,Accept
Accept-Ranges: bytes
Content-Length: 88
Content-Type: text/html
Connection: Closed

 

<html>
<body>
<h1>Request Processed Successfully</h1>
</body>
</html>

 

متد put :

از این متد برای درخواست به سرور به جهت ذخیره سازی بدنه یا Body موجود از طریق URL مشخص استفاده میشه . در مثال زیر از سرور درخواست شده تا بدنه hello.htm را ریشه سرور ذخیره کنه :

PUT /hello.htm HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
Host: www.tutorialspoint.com
Accept-Language: en-us
Connection: Keep-Alive
Content-type: text/html
Content-Length: 182

 

<html>
<body>
<h1>Hello, World!</h1>
</body>
</html>

 

پاسخ سرور :

HTTP/1.1 201 Created
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache/2.2.14 (Win32)
Content-type: text/html
Content-length: 30
Connection: Closed

 

<html>
<body>
<h1>The file was created.</h1>
</body>
</html>

 

متد Delete :

از این متذ برای حذف یک فایل خاص در سرور از طریق URL مشخص استفاده می شه. مثال :

DELETE /hello.htm HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
Host: www.tutorialspoint.com
Accept-Language: en-us
Connection: Keep-Alive

سرور فایل مورد نظر رو پاک می کنه و پاسخ زیر رو ارسال می کنه :

HTTP/1.1 200 OK
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache/2.2.14 (Win32)
Content-type: text/html
Content-length: 30
Connection: Closed

 

<html>
<body>
<h1>URL deleted.</h1>
</body>
</html>

 

متد Connect :

از این متد برای اتصال یک شبکه به یک وب سرور از طریق HTTP استفاده می شه.مثال زیر درخواست اتصال به یک وب سرور در حال اجرا در هاست tutorialspoint.com را نشون می ده :

CONNECT www.tutorialspoint.com HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)

 

ارتباط برقرار میشه و سرور پاسخ زیر رو ارسال می کنه :

HTTP/1.1 200 Connection established
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache/2.2.14 (Win32)

 

متد Option :

از این متد برای پیدا کردن متدها HTTP که سرور از آن ها پشتیبانی می کند استفاده میشه.کلاینت می تونه یک ستاره یا URL برای این متد در هنگام ارسال درخواست مشخص کنه . مثال :

OPTIONS * HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)

پاسخ سرور :

HTTP/1.1 200 OK
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache/2.2.14 (Win32)
Allow: GET,HEAD,POST,OPTIONS,TRACE
Content-Type: httpd/unix-directory

 

چند نکته :

درخواست از نوع متد Get :

·         میتواند کش شوند

·         میتواند در History  مرورگر بماند.

·         میتواند BookMark  شود.

·         هرگز نباید در برخورد با دادهای حساس استفاده شود.

·         دارای محدودیت طولی (منظور تعداد کاراکتر) میباشد

درخواست از نوع متد Post :

·         درخواست های متد POST هیچوقت کش (cache) نمیشود.

·         درخواست های متد POST در History مرورگر بجا نمی ماند.

·         درخواست های متد POST نمیتواند BookMark شود

·         درخواست های متد POST بدون محدودیت طولی هستند

 

امیدوارم که این مقاله به کار دوستان بیاد. اگر جایی اشتباهی بوده مطمئن باشید که سهوی بوده و حتما اون رو با پاسخ هاتون اصلاح کنید.

ممنون از آکادمی ۷لرن

 

 

فایل پیوست

Amin Ataei
Amin Ataei

2 اردیبهشت 99