تبادل درخواست و پاسخ بین کلاینت و سرور و جایگاه هدر HTTP در کنار بدنه پیام
پیام رسان بلاگ برنامه نویسی HTTP Header چیست؟ مهم‌ترین هدرهای وب سرویس را بشناسید

HTTP Header چیست؟ مهم‌ترین هدرهای وب سرویس را بشناسید

نوشته ای از احمدرضا احمدپور
انتشار در تاریخ 19 آبان 1405
دسته بندی: برنامه نویسی

بدنه درخواست را درست نوشته‌اید و کلید دسترسی هم معتبر است، اما سرور همچنان خطا برمی‌گرداند؟ یکی از مواردی که باید بررسی کنید، هدرهای درخواست است.

تنظیم اشتباه نوع محتوا، ارسال نادرست اعتبارنامه یا وجود هدرهای تکراری می‌تواند مانع پردازش صحیح درخواست شود؛ البته همه خطاهای API به هدرها مربوط نیستند.

HTTP Header دقیقاً چیست؟

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

اگر بدنه پیام را محموله اصلی در نظر بگیریم، هدر شبیه برچسب‌های روی بسته است: توضیح می‌دهد محتوای بسته چیست و گیرنده باید چگونه با آن برخورد کند. برای مثال، متن پیامک و شماره گیرنده در بدنه درخواست قرار می‌گیرند، اما هدر Content-Type: application/json اعلام می‌کند که این بدنه با فرمت JSON ارسال شده است.

همه پیام‌های HTTP بدنه ندارند؛ برای نمونه، یک درخواست GET معمولی می‌تواند بدون بدنه ارسال شود و همچنان هدر داشته باشد. همچنین کد وضعیت پاسخ، مانند ۲۰۰ یا ۴۰۱، با هدرهای پاسخ متفاوت است؛ هرچند ابزارهای توسعه معمولاً آن‌ها را در یک صفحه نمایش می‌دهند.

ساختار هدرهای HTTP چگونه است؟

در نمایش متنی HTTP/1.1، هر هدر از نام، دونقطه و مقدار تشکیل می‌شود:

متن
Content-Type: application/json
Accept: application/json

نام هدر به بزرگی و کوچکی حروف حساس نیست؛ بنابراین Content-Type و content-type یک نام محسوب می‌شوند. این قاعده را به مقدار هدر تعمیم ندهید؛ برای مثال، مقدار توکن را باید دقیقاً مطابق مقدار صادرشده ارسال کنید. در HTTP/2 و HTTP/3 شکل انتقال هدرها متفاوت است، اما مفهوم نام و مقدار همچنان برقرار است.

ساختار نمونه درخواست و پاسخ HTTP/1.1 شامل خط شروع، هدرها، خط خالی و بدنه JSON

هدر در کدام قسمت درخواست و پاسخ قرار می‌گیرد؟

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

JSON
POST /api/example HTTP/1.1
Host: api.example.com
Content-Type: application/json
Accept: application/json

{"message":"Hello"}

پاسخ فرضی همین درخواست می‌تواند ساختار زیر را داشته باشد. خط اول وضعیت پاسخ است، دو خط بعدی هدر هستند و JSON انتهایی بدنه پاسخ است:

JSON
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store

{"success":true}

در استفاده معمول از کتابخانه‌های HTTP، لازم نیست این ساختار را دستی بسازید؛ ابزار، خط شروع و جداسازی هدر از بدنه را مدیریت می‌کند.

هدر درخواست و پاسخ چه تفاوتی دارند؟

تفاوت اصلی به فرستنده و کاربرد هدر مربوط است. بعضی هدرها مخصوص درخواست یا پاسخ هستند و بعضی، مانند Content-Type، در هر دو کاربرد دارند.

نوعجهت ارسالکاربرد و نمونه
هدر درخواستاز کلاینت به سروراعلام ترجیح پاسخ با Accept یا ارائه اعتبارنامه با Authorization
هدر پاسخاز سرور به کلاینتاعلام مقصد تغییر مسیر با Location یا تنظیم کوکی با Set-Cookie
هدر قابل استفاده در هر دوبسته به پیامContent-Type نوع محتوای بدنه همان درخواست یا پاسخ را مشخص می‌کند

هدرهای درخواست یا Request Headers

کلاینت با هدرهای درخواست، اطلاعات لازم برای رسیدگی به درخواست را به سرور می‌دهد. برای مثال، Accept نوع محتوای ترجیحی پاسخ را اعلام می‌کند و Authorization در APIهایی که از آن استفاده می‌کنند، اعتبارنامه را منتقل می‌کند.

هدرهای پاسخ یا Response Headers

سرور با هدرهای پاسخ توضیح می‌دهد که کلاینت چگونه پاسخ را پردازش کند. برای نمونه، Content-Type نوع محتوای برگشتی را نشان می‌دهد و Cache-Control درباره ذخیره‌سازی و استفاده مجدد از پاسخ دستور می‌دهد.

جدول مهم‌ترین هدرهای HTTP در کار با وب‌سرویس

جدول زیر هدرهایی را نشان می‌دهد که شناخت آن‌ها برای شروع کار با API مفید است. نیاز به ارسال هر هدر را مستندات سرویس و نوع درخواست تعیین می‌کند.

هدرمحل استفادهکاربردنمونه مقدار
Content-Typeدرخواست و پاسخنوع محتوای بدنه همان پیامapplication/json
Acceptدرخواستنوع محتوای قابل پذیرش برای پاسخapplication/json
Authorizationدرخواستاعتبارنامه مطابق روش احراز هویت سرویسBearer YOUR_ACCESS_TOKEN
Hostدرخواست HTTP/1.1نام میزبان مقصد و در صورت نیاز پورتapi.example.com
User-Agentدرخواستمعرفی نرم‌افزار کلاینتMyApp/1.0
Content-Lengthدرخواست و پاسخطول بدنه پیام بر حسب بایت348
Cache-Controlدرخواست و پاسخدستورالعمل‌های کشno-store
Locationپاسخمعرفی مقصد تغییر مسیر یا نشانی منبع ایجادشدهhttps://example.com/new-path
WWW-Authenticateپاسخاعلام شیوه احراز هویت مورد نیازBearer

تفاوت Content-Type و Accept چیست؟

مقایسه Content-Type برای تعیین نوع بدنه ارسالی و Accept برای اعلام نوع پاسخ قابل پذیرش

Content-Type می‌گوید «بدنه‌ای که همراه این پیام فرستاده‌ام چه نوعی دارد؟» اما Accept در درخواست می‌گوید «چه نوع پاسخی را می‌توانم دریافت کنم؟» بنابراین تنظیم Accept به‌تنهایی، نوع بدنه درخواست را مشخص نمی‌کند.

JSON
Content-Type: application/json
Accept: application/json

این ترکیب یعنی بدنه درخواست JSON است و کلاینت پاسخ JSON را می‌پذیرد. اگر سرور نتواند نوع محتوای درخواست را بپذیرد، ممکن است خطای 415 Unsupported Media Type برگرداند. اگر نتواند پاسخی سازگار با Accept ارائه کند، ممکن است پاسخ 406 Not Acceptable بدهد؛ رفتار دقیق به پیاده‌سازی سرویس بستگی دارد.

برای ارسال فایل با multipart/form-data، معمولاً اجازه دهید ابزار یا کتابخانه، Content-Type و مقدار boundary را تولید کند. تنظیم دستی و ناقص این هدر می‌تواند باعث شکست آپلود شود.

پیشنهاد خواندنی: اگر با ساختار داده‌های JSON آشنا نیستید، مقاله JSON چیست؟ را بخوانید.

هدر Authorization و محل صحیح اعتبارنامه

تفاوت ارسال Bearer Token در هدر Authorization با ارسال ApiKey در بدنه JSON در API نسخه ۴ پیام‌رسان

بسیاری از APIها اعتبارنامه را در هدر Authorization دریافت می‌کنند. در روش Bearer، ساختار آن به شکل زیر است؛ Bearer نام شیوه احراز هویت است، نه یک هدر جداگانه:

متن
Authorization: Bearer YOUR_ACCESS_TOKEN

اما این روش برای همه APIها یکسان نیست. بعضی سرویس‌ها کلید را در هدر اختصاصی یا بدنه درخواست دریافت می‌کنند. طبق مستندات ارسالی API نسخه ۴ پیام‌رسان، مقدار ApiKey باید داخل بدنه JSON قرار بگیرد و احراز هویت این متدها با هدر Bearer انجام نمی‌شود.

اعتبارنامه را مطابق مستندات سرویس ارسال کنید و آن را در URL قرار ندهید؛ آدرس‌ها ممکن است در لاگ‌ها و ابزارهای مختلف ثبت شوند. قرارگرفتن کلید در هدر یا بدنه نیز به‌تنهایی امنیت ایجاد نمی‌کند: از HTTPS استفاده کنید، مقادیر حساس را از لاگ‌ها حذف کنید و کلید وب‌سرویس پیامکی را فقط در سمت سرور نگه دارید.

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

Host، User-Agent و Content-Length را چه کسی تنظیم می‌کند؟

هدر Host در HTTP/1.1 میزبان مقصد را مشخص می‌کند و برای تشخیص مقصد در سرورهایی که چند دامنه دارند کاربرد دارد. در استفاده معمول از Postman، cURL یا کتابخانه‌های HTTP، این مقدار از URL ساخته می‌شود و نیازی به تنظیم دستی ندارد.

User-Agent نرم‌افزار درخواست‌دهنده را معرفی می‌کند و می‌تواند در بررسی لاگ‌ها مفید باشد. بااین‌حال، مقدار آن قابل جعل است و نباید مدرک احراز هویت محسوب شود. در مرورگر، مدیریت برخی هدرها در اختیار خود مرورگر است و آزادی تنظیم آن‌ها مانند یک برنامه سمت سرور نیست.

Content-Length نیز معمولاً توسط ابزار محاسبه می‌شود. آن را با تعداد کاراکترها اشتباه نگیرید؛ حروف فارسی در UTF-8 می‌توانند بیش از یک بایت داشته باشند. برای جلوگیری از ناسازگاری طول بدنه، این هدر را بدون نیاز مشخص، دستی وارد نکنید.

هدرهای کش، کوکی و فشرده‌سازی

کاربرد هدرها به ارسال JSON و اعتبارنامه محدود نیست. این چند نمونه به درک هدرهای پاسخ کمک می‌کنند:

  • Cache-Control: رفتار کش را کنترل می‌کند. برای مثال، no-store دستور می‌دهد پاسخ ذخیره نشود. no-cache معنای متفاوتی دارد: استفاده مجدد از نسخه ذخیره‌شده باید پس از اعتبارسنجی انجام شود.
  • ETag: مشخصه‌ای برای نسخه یک منبع است. کلاینت می‌تواند آن را در درخواست بعدی با If-None-Match بفرستد تا سرور درباره تغییرکردن منبع تصمیم بگیرد.
  • Cookie و Set-Cookie: سرور با Set-Cookie کوکی تنظیم می‌کند و مرورگر، در صورت مجازبودن طبق قواعد کوکی، آن را در درخواست‌های بعدی با Cookie می‌فرستد.
  • Accept-Encoding و Content-Encoding: اولی روش‌های فشرده‌سازی قابل پذیرش کلاینت را اعلام می‌کند و دومی کدگذاری اعمال‌شده بر محتوا، مانند gzip، را نشان می‌دهد. این موضوع با نوع محتوا در Content-Type متفاوت است.

هدرهای سفارشی برای محدودیت و ردیابی درخواست

بعضی سرویس‌ها هدرهای اختصاصی دارند. برای مثال، ممکن است X-RateLimit-Limit سقف درخواست مجاز را اعلام کند یا X-Request-ID شناسه‌ای برای پیگیری درخواست در لاگ‌ها باشد. وجود، جهت ارسال و معنای دقیق این هدرها به مستندات همان سرویس بستگی دارد.

پیشوند X- در سرویس‌های موجود دیده می‌شود، اما برای نام‌گذاری فیلدهای جدید توصیه نمی‌شود. همچنین پس از دریافت پاسخ محدودیت نرخ، هدر Retry-After، در صورت وجود، می‌تواند زمان انتظار پیشنهادی سرور را مشخص کند. این نمونه‌ها به معنای پشتیبانی قطعی API پیام‌رسان از این هدرها نیستند.

چطور هدرهای HTTP را در مرورگر ببینیم؟

برای مشاهده هدرهای درخواست‌های یک صفحه در مرورگرهای مبتنی بر Chrome، مراحل زیر را انجام دهید:

  1. ابزار توسعه‌دهنده یا DevTools را باز کنید و وارد تب Network شوید.
  2. صفحه را دوباره بارگذاری کنید یا عملی را انجام دهید که درخواست موردنظر را ایجاد می‌کند.
  3. درخواست را انتخاب کنید؛ برای یافتن درخواست‌های API می‌توانید از فیلتر Fetch/XHR کمک بگیرید.
  4. در بخش Headers، قسمت‌های Request Headers و Response Headers را بررسی کنید. بدنه ارسالی معمولاً در Payload و محتوای پاسخ در Response دیده می‌شود.

این ابزار فقط ارتباط مرورگر را نشان می‌دهد. اگر بک‌اند شما به وب‌سرویس پیامکی متصل شود، درخواست خروجی بک‌اند در Network مرورگر دیده نمی‌شود. همچنین پیش از ارسال اسکرین‌شات یا فایل گزارش برای پشتیبانی، توکن‌ها، کوکی‌ها و سایر اطلاعات حساس را حذف کنید.

چطور در Postman و cURL هدر تنظیم کنیم؟

برای تمرین، از متد GetAccountInfo در API نسخه ۴ پیام‌رسان استفاده می‌کنیم. طبق مستندات ارسالی، این متد اطلاعات اعتبار و خط‌های حساب را برمی‌گرداند و پیامک ارسال نمی‌کند. درخواست آن POST است و ApiKey را در بدنه JSON دریافت می‌کند.

تنظیم هدر و بدنه در Postman

  1. یک درخواست جدید بسازید، متد را POST انتخاب کنید و آدرس https://www.payam-resan.com/uapi/v4/GetAccountInfo را وارد کنید.
  2. در بخش Authorization، گزینه No Auth را انتخاب کنید تا توکن یا تنظیمات احراز هویت مجموعه به این درخواست اضافه نشود.
  3. در Body، گزینه raw و نوع JSON را انتخاب کنید و بدنه نمونه زیر را قرار دهید.
  4. در Headers بررسی کنید Content-Type: application/json وجود داشته باشد. با انتخاب JSON معمولاً Postman آن را تنظیم می‌کند؛ هدر متناقض یا تکراری اضافه نکنید.
  5. در صورت نیاز، Accept: application/json را برای اعلام ترجیح پاسخ اضافه کنید؛ این هدر جایگزین Content-Type نیست.
  6. کلید را در محیط امن محلی جایگزین و درخواست را ارسال کنید. سپس کد وضعیت، هدرهای پاسخ و بدنه را جداگانه بررسی کنید.
متن
{
  "ApiKey": "YOUR_API_KEY"
}

برای API دیگری که واقعاً از Bearer استفاده می‌کند، می‌توانید در Authorization گزینه Bearer Token را انتخاب و فقط مقدار توکن را وارد کنید؛ Postman هدر مربوط را می‌سازد. این تنظیم برای نمونه GetAccountInfo بالا لازم نیست.

تنظیم هدر در cURL

در cURL، گزینه -H هدر درخواست را اضافه می‌کند و -i هدرهای پاسخ را همراه بدنه نشان می‌دهد. نمونه زیر برای Bash و پوسته‌های سازگار نوشته شده است و همان درخواست Postman را اجرا می‌کند:

Shell
curl -i --request POST \
  'https://www.payam-resan.com/uapi/v4/GetAccountInfo' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  --data-raw '{"ApiKey":"YOUR_API_KEY"}'

در این نمونه، Content-Type مطابق قرارداد API تنظیم شده و Accept ترجیح کلاینت را اعلام می‌کند. نیازی به واردکردن دستی Host یا Content-Length نیست. کلید واقعی را در دستورهای اشتراکی، مخزن کد یا تاریخچه قابل دسترس دیگران نگه ندارید؛ در برنامه اصلی، آن را از تنظیمات امن سمت سرور بخوانید.

طبق مستندات پیام‌رسان، بررسی HTTP 200 به‌تنهایی کافی نیست؛ مقدار success در بدنه پاسخ را هم بخوانید. در موفقیت، داده در result قرار دارد و در شکست باید errorCode و error بررسی شوند. خطای HTTP و خطای اعلام‌شده در JSON را یکسان در نظر نگیرید.

نقش هدرها در CORS و امنیت چیست؟

CORS مشخص می‌کند مرورگر تحت چه شرایطی اجازه خواندن پاسخ یک مبدأ دیگر را به کد صفحه بدهد. سرور با هدرهایی مانند Access-Control-Allow-Origin و در پاسخ پیش‌درخواست با Access-Control-Allow-Headers و Access-Control-Allow-Methods این سیاست را اعلام می‌کند.

اگر در مرورگر خطای CORS می‌بینید، اضافه‌کردن Access-Control-Allow-Origin به هدر درخواست راه‌حل نیست؛ تنظیم باید در پاسخ سرور مربوط انجام شود. موفقیت همان درخواست در Postman یا cURL نیز سالم‌بودن پیکربندی CORS را ثابت نمی‌کند، چون این ابزارها محدودیت مرورگر را اجرا نمی‌کنند.

در اتصال به وب‌سرویس پیامکی، مرورگر باید با بک‌اند محافظت‌شده برنامه شما ارتباط بگیرد و بک‌اند درخواست دارای ApiKey را ارسال کند. کلید محرمانه را برای رفع CORS به جاوااسکریپت مرورگر منتقل نکنید.

هدرهای امنیتی پاسخ نیز کاربرد دیگری دارند؛ برای نمونه، Strict-Transport-Security به مرورگر سیاست استفاده از HTTPS را اعلام می‌کند، Content-Security-Policy منابع مجاز صفحه را محدود می‌کند و X-Content-Type-Options: nosniff جلوی برخی رفتارهای تشخیص نوع محتوا را می‌گیرد. این هدرها را سرور متناسب با نیاز برنامه تنظیم می‌کند؛ افزودن آن‌ها به درخواست API جای احراز هویت را نمی‌گیرد.

چک‌لیست بررسی خطاهای ۴۰۰، ۴۰۱، ۴۱۵ و CORS با توجه به بدنه، اعتبارنامه و هدرهای درخواست و پاسخ

خطاهای رایج هدرهای HTTP و روش بررسی آن‌ها

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

نشانهچه چیزی را بررسی کنید؟اقدام پیشنهادی
400 Bad Requestساختار درخواست، JSON، فیلدهای لازم و هدرهای نامعتبربدنه و هدرها را با نمونه مستندات مقایسه کنید؛ علت را فقط به هدر نسبت ندهید
401 Unauthorizedاعتبارنامه ناقص یا نامعتبر، روش ارسال و WWW-Authenticate در صورت وجوداعتبارنامه را در محل و قالب تعیین‌شده توسط سرویس ارسال کنید
403 Forbiddenمجوز حساب، دسترسی به منبع یا سیاست محدودکننده سرورمجوزها و متن پاسخ را بررسی کنید؛ تعویض توکن لزوماً مشکل را حل نمی‌کند
415 Unsupported Media TypeContent-Type و نوع واقعی بدنهبرای بدنه JSON، نوع محتوای مورد قبول API را تنظیم کنید
406 Not Acceptableمقدار Accept و فرمت‌های قابل ارائه سرورنوع پاسخ درخواستی را با قابلیت سرویس هماهنگ کنید
429 Too Many Requestsمحدودیت نرخ و Retry-After در صورت وجودنرخ درخواست را کاهش دهید و سیاست انتظار سرویس را رعایت کنید
خطای CORS در مرورگرپاسخ پیش‌درخواست و هدرهای CORS سمت سرورپیکربندی مبدأها، متدها و هدرهای مجاز را بررسی کنید
رفتار نامنظم با وجود تنظیم ظاهراً صحیحهدرهای تکراری، متناقض یا تنظیمات به‌ارث‌رسیده ابزارهدرهای خروجی واقعی را ببینید و مقادیر ناخواسته را حذف کنید

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

همچنین در درخواست ارسال پیامک، پس از timeout بدون بررسی وضعیت، ارسال را تکرار نکنید؛ ممکن است درخواست نخست پذیرفته شده باشد.

جمع‌بندی

هدرهای HTTP اطلاعات لازم برای پردازش درخواست و پاسخ را منتقل می‌کنند؛ از نوع محتوا و احراز هویت تا کش و سیاست‌های مرورگر. برای استفاده درست، تفاوت Content-Type و Accept را بدانید، اعتبارنامه را مطابق مستندات سرویس ارسال کنید و هنگام خطا، هدرها، کد وضعیت و بدنه پاسخ را جداگانه بررسی کنید.

اگر قصد اتصال سایت یا نرم‌افزار خود به وب سرویس پیامکی پیام‌رسان را دارید، نمونه درخواست همان متد را مبنا قرار دهید. در API نسخه ۴ معرفی‌شده در مستندات ارسالی، درخواست‌ها با POST و بدنه JSON ارسال می‌شوند و ApiKey در بدنه قرار می‌گیرد.

سوالات متداول

این مقاله مفید بود ؟

به این مقاله امتیاز دهید

میانگین رتبه 0 / 5. تعداد رای : 0

هنوز کسی به این مطلب رای نداده ؛ شما اولین نفر باشید !

تحریریه از احمدرضا احمدپور

احمدرضا احمدپور

احمدرضا، متخصص سئوی خلاقی که با بیش از ۴ سال تجربه، همیشه در حال بهینه‌سازی سایت‌ها و کمک به رشد کسب‌وکارهاست. عاشق یادگیری چیزهای جدیده و هر روز با ایده‌های تازه، کارش رو هیجان‌انگیزتر می‌کنه. پادکست‌های توسعه فردی و رشد کسب‌وکار رو هم خیلی دوست داره و همیشه در حال گوش دادن بهشونه. او همیشه حساب‌شده رفتار می‌کنه و با رویکرد دقیق و فکرشده، بهترین تصمیم‌ها رو می‌گیره. با احمدرضا می‌تونی ساعت‌ها در مورد استراتژی‌های دیجیتال حرف بزنی و مطمئن باش که وقت گذروندن باهاش پر از انرژی مثبته!

ارسال کامنت

ثبت نام ورود