CodeShot

درخواست ساده (Simple Request) در مقابل درخواست Preflight (OPTIONS)

درخواست ساده در CORS شرایط محدودی دارد (متد GET/POST/HEAD، هدرهای استاندارد) و مرورگر مستقیماً آن را ارسال می‌کند، در حالی که اگر درخواست از متدهایی مثل PUT/DELETE یا هدرهای سفارشی (مثل Authorization یا Content-Type: application/json) استفاده کند، مرورگر ابتدا یک درخواست OPTIONS به نام Preflight می‌فرستد تا از سرور اجازه بگیرد.

ویژگیدرخواست ساده (Simple Request)درخواست Preflight (OPTIONS)
درخواست اضافهنداردیک درخواست OPTIONS اضافه
متدهای مجازGET، POST، HEAD سادهPUT، DELETE، PATCH و غیره
تأخیر اضافهنداردیک رفت‌وبرگشت اضافه

کِی از درخواست ساده (Simple Request) استفاده کنیم؟

وقتی درخواست شما فقط از GET یا POST ساده با Content-Type استاندارد (مثل form-urlencoded) استفاده می‌کند.

کِی از درخواست Preflight (OPTIONS) استفاده کنیم؟

وقتی از متدهای PUT/DELETE/PATCH، هدرهای سفارشی یا Content-Type: application/json استفاده می‌کنید که نیاز به تأیید سرور قبل از ارسال درخواست اصلی دارد.

مثال درخواست ساده (Simple Request)

// Simple Request: مستقیم ارسال می‌شود
GET /api/products HTTP/1.1
Origin: https://app.example.com

مثال درخواست Preflight (OPTIONS)

// ابتدا مرورگر این را می‌فرستد:
OPTIONS /api/products HTTP/1.1
Access-Control-Request-Method: DELETE
Access-Control-Request-Headers: Authorization
// سپس در صورت تأیید سرور، درخواست اصلی می‌رود

اشتباه رایج

اشتباه رایج فراموش کردن پاسخ‌دهی سرور به متد OPTIONS برای Preflight است؛ اگر سرور به این درخواست با هدرهای CORS درست (Access-Control-Allow-Methods و غیره) پاسخ ندهد، درخواست اصلی هرگز ارسال نمی‌شود و در Console مرورگر خطای CORS دیده می‌شود.

جمع‌بندی

برای درخواست‌های ساده مرورگر بدون Preflight کار می‌کند، اما به‌محض استفاده از متد/هدر غیراستاندارد باید مطمئن شوید سرور به درخواست OPTIONS مربوطه هم پاسخ صحیح می‌دهد.