Http Headers (قسمت اول)
هر گاه اطلاعاتی را از سرور نیاز داشته باشیم باید یک درخواست به آن بزنیم و پاسخ را از سمت سرور دریافت کنیم. بر این درخواست و پاسخ قوانینی حکم فرماست که به آن پروتکل (Http Protocol) گفته می شود.
یک لینک یا URL یا WebAddress می تواند از چندین بخش تشکیل شده باشد که شامل نوع پروتکل (Protocol Type) , نام هاست (Host Name) , پورت (Port) , مسیر (Path) می باشد :
نکته : ما پروتکل https را هم داریم که رمز نگاری شده و با امنیت بیشتری نسبت به پروتکل http می باشد.
پروتکل Http مجموعه قوانین حکم فرما برای نرم افزارهایی است که از آن استفاده می کنند. یعنی ممکن است برخی سرور ها از پروتکل نسخه HTTP 1.0 پیروی کنند و برخی نیز از نسخه HTTP 1.1 که در حال حاضر اکثر سرور ها از این نسخه پیروی می کنند.
همچنین هدر ها هم می توانند بسته به هر نسخه تفاوت هایی را داشته باشند. البته که عموم آن یکسان است و تنها در موارد خاص متفاوت می باشند.
مفاهیمی که در این قسمت بررسی می شود :
- Request Http Header
- Respons Http Header
هر درخواستی که از سمت کلاینت به سمت سرور ارسال می شود یا پاسخی که از سمت سرور به سمت کلاینت ارسال می شود مثل یک بسته اطلاعاتی است که شامل بدنه اصلی یه Entity Body و همچنین یک سری اطلاعات دیگر نظیر Http Header می باشد.
نحوه ارسال درخواست از سمت کلاینت (Browser) به سمت سرور بدین گونه است که ابتدا یک درخواست کلی به URL زده می شود و پاسخ کلی شامل content بر می گردد پس از آن هم به ازای هر resource (image , css , js) یک درخواست دیگر ارسال می شود که در آنها نوع اتصال keep-alive می باشد.
Http Request Structure
هر درخواست که از سمت Client به سمت Sevrver ارسال می شود در قالب یک Http Request می باشد که حاوی یک بدنه فیلد های مربوطه با نام Request Body و همچنین یک سری اطلاعات از نوع درخواست در قالب Request Header می باشد که قالب اطلاعات آن در رابطه با تمامی درخواست ها یکسان می باشد و این همان Http Protocol و یا قوانین حاکم بر درخواست های Http می باشد.
فرمت پیامی که در پروتکل HTTP از سمت کلاینت به سمت سرور ارسال می شود یا همان Http Requet Message Format به شکل زیر می باشد :
در ابتدا ما Method را داریم که به آن Http Verb هم می گوییم همان متد ارسالی که در فرم ها و یا CURL می باشد. که بنا به نسخه Http به روال زیر می باشد :
- HTTP 1.0
- POST
- GET
- HEAD
- HTTP 1.1
- POST , GET , HEAD
- PUT
- DELETE
پس از آن URL یا همان لینک درخواست است. مثلا gnutec.net/download را که در مرورگر یا هر کلاینت دیگری که باز می کنید یک درخواست به سروری ما می زنید.
پس از آن Http Headers می آیند که ساختار آن به شکل Key:value
می باشد یک به یک زیر هم قرار می گیرند. این هدر ها اطلاعاتی را با خود به همراه دارند که توسط ما که در خواست دهنده می باشیم بوسیله دستگاهمان که می تواند یک مرورگر یا اپلیکیشن باشد قابل تعیین و تغییر است.
در انتها هم ما Entity Body را خواهیم داشت که بسته به نوع درخواست می تواند متفاوت باشد ولی به صورت کلی می توان گفت که فیلد های فرم یا فایل های آپلودی می باشد.
به طور مثال به ازای یک فرم Post شده از سمت کلاینت مرورگر ما شامل یک سری Query String می باشد که در خود همان مقادیر متغیر $_POST
است . به طور مثال :
username=ali&password=secret$submit=submit+Query
نکته : Entity Body به ازای درخواست های GET خالی می باشد. زیرا که Query String ها در درخواست هایی از نوع GET واقع در URL است.
Http Response Structure
در مقابل هم هر پاسخ از سمت Server به سمت Client با پیروی از یک قالب کلی (Http Protocol) شامل یک بدنه که همان خروجی می باشد (حال در هر فرمتی نظیر text/html
, application/json
, text/xml
) که به آن Entity Body هم می گوییم و همچنین یک سری اطلاعات در رابطه با پاسخ نظیر فرمت (content-type) یا طول پاسخ و زمان آن در قالب Response Header ارسال می گردد.
فرمت کلی پیامی که در قالب پاسخ از سمت سرور به سمت کلاینت ارسال می گردد یا Http Response structure به شکل زیر است :
یک HTTP Response row از پاسخ یک درخواست به یک سرور به شکل زیر می باشد :
HTTP/1.1 200 OK Date: Sat, 23 Feb 2019 07:53:42 GMT Server: Apache X-Robots-Tag: noindex Link: ; rel="https://api.w.org/" X-Content-Type-Options: nosniff Access-Control-Expose-Headers: X-WP-Total, X-WP-TotalPages Allow: GET Cache-Control: no-cache, must-revalidate Access-Control-Allow-Origin: * Access-Control-Allow-Methods: POST, GET, OPTIONS, PUT, DELETE Access-Control-Allow-Headers: Content-Type, X-Auth-Token, Origin, Authorization Set-Cookie: mailchimp_landing_site=http%3A%2F%2Fwikiferghe.ir%2Fwp-json%2Fwli%2Fv1%2Fposts%3Fper_page%3D5%26page%3D3; expires=Sat, 23-Mar-2019 07:53:44 GMT; Max-Age=2419200; path=/ Connection: close Transfer-Encoding: chunked Content-Type: application/json; charset=UTF-8 [{ID:1}]
در status line ما status code را داریم که نتیجه درخواست ارسالی از سمت سرور برای کلاینت می باشد. کد های ارسالی بر اساس نوع درخواست به شرح زیر می باشند :
کد وضعیت | عبارت | توضیحات |
200 | OK | Http Request به درستی دریافت اعتبارسنجی شد و پاسخ نیز به درستی به سمت کلاینت ارسال گردید. |
301 | Moved Permanently | پاسخ ارسال می شود اما منبع درخواستی به طور دائم منتقل شده (مورد استفاده در موتور های جستجو) |
302 | Found | صحت پاسخ و منبع درخواستی به صورت موقت منتقل شده (مورد استفاده در موتور جستجو) |
400 | Bad Request | استاندار درخواست به درستی رعایت نشده و درخواست نامعتبر می باشد. |
401 | Unauthorize | عدم اجرای درخواست به علت غیر مجاز تشخیص داده شدن authorization . |
403 | Forbidden | به دلایل مختلف سرور درخواست شما را غیر مجاز می داند و پاسخی ارسال نمی کند. (مثلا وب سایت هایی که آی پی های ایران را غیر مجاز می دانند مثل ORACLE) |
404 | Not Found | منبع درخواستی براساس درخواست شما یافت نشد. |
500 | Internal Sever Error | بروز خطا بر روی سرویس دهنده. |
پس از آن هدر های مربوط به پاسخ (Http Response Headers) ارسال می گردد که هر کدام در یک خط به صورت Key:value
ارسال می گردند.
Entity Body که همان content مربوطه با فرمت خاص (Content-Type) می باشد که می تواند با فرمت text/html , text/xml , application/json باشد.
ممنون از مطلبتون. واضح و خوب.
عالی