💻 آخرین فرصت یادگیری برنامه‌نویسی با آفر ویژه قبل از افزایش قیمت در ۵ آذر ماه (🎁 به همراه یک هدیه ارزشمند )
۰ ثانیه
۰ دقیقه
۰ ساعت
۰ Amin Ataei
خلاصه ای از نکات پروتکل HTTP (برگرفته از Tutorialspoint)
جامعه پی اچ پی ایجاد شده در ۰۲ اردیبهشت ۱۳۹۹

پروتکل 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 بدون محدودیت طولی هستند

 

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

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