درک وضعیت 409 Conflict در HTTP

understanding http status 409 conflict
20 آبان 1403

وضعیت 409 Conflict در HTTP زمانی رخ می‌دهد که یک درخواست با وضعیت فعلی سرور تناقض دارد. به عبارت دیگر، این زمانی اتفاق می‌افتد که دو یا چند عملیات در حال انجام بر روی منابع مشابه با یکدیگر تداخل پیدا می‌کنند. معمولاً این وضعیت هنگامی بروز می‌کند که دو درخواست همزمان برای تغییر یک منبع ارسال شوند که منجر به تناقضی در وضعیت داده‌های آن منبع می‌شود. این گونه مشکلات معمولاً در سیستم‌های مدیریت محتوا، پایگاه‌های داده یا درگاه‌های API اتفاق می‌افتد.

مثلاً فرض کنید در حال کار بر روی یک پلتفرم همکاری مانند ویکی‌پدیا باشید. اگر شما و یک کاربر دیگر به صورت همزمان در حال ویرایش یک سند مشابه باشید و شما تقاضای ذخیره تغییرات خودتان را ارسال کنید در حالی که تغییرات کاربر دیگر قبلاً در همین زمان اعمال شده باشد، سرور ممکن است با پاسخ 409 Conflict برگردد. به این معنی که تغییرات شما با داده‌های فعلی که در سرور ذخیره شده است، سازگار نیست.

برای جلوگیری از ایجاد این گونه تناقضات، معمولاً تدابیری مانند قفل کردن منابع، استفاده از نسخه‌گذاری یا مدیریت مناقشه‌ (Conflict Resolution) به کار گرفته می‌شوند. این روش‌ها به کاربران و برنامه‌نویسان کمک می‌کنند تا از همزمانی ناموفق یا زد و خورد اطلاعات جلوگیری کنند، و تجربه کاربری بهتری را فراهم کنند.

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

در زیر یک مثال از نحوه مدیریت خطای 409 در یک درخواست PUT در یک API را مشاهده می‌کنید:


fetch('https://api.example.com/resource/123', {
    method: 'PUT',
    headers: {
        'Content-Type': 'application/json'
    },
    body: JSON.stringify({
        name: 'New Resource Name',
        version: 3
    })
})
.then(response => {
    if (response.status === 409) {
        console.log('Conflict error occurred! Consider reviewing the current version of the resource.');
        // Implement conflict resolution logic here
    } else if (response.ok) {
        return response.json();
    } else {
        throw new Error('Network response was not ok.');
    }
})
.then(data => console.log('Resource updated:', data))
.catch(error => console.error('There was a problem with the request:', error));

توضیحات خط به خط مثال:

fetch('https://api.example.com/resource/123', ...)
در این خط، ما یک درخواست PUT به API برای به‌روزرسانی یک منبع خاص ارسال می‌کنیم.

method: 'PUT'
روش درخواست که در اینجا PUT است تعریف شده که به معنای به‌روزرسانی یک منبع موجود است.

headers: {'Content-Type': 'application/json'}
در اینجا نوع محتوای درخواست به json تنظیم شده است.

body: JSON.stringify({...})
درخواست بدنه به وسیله JSON.stringify بسته‌بندی شده تا به صورت یک شی JSON ارسال شود.

if (response.status === 409)
بررسی می‌کنیم که اگر وضعیت پاسخ 409 باشد، می‌دانیم که یک تناقض رخ داده است.

console.log('Conflict error occurred! ...')
پیام خطا در صورت بروز تناقض به کنسول ارسال می‌شود.

throw new Error('Network response was not ok.')
در صورت بروز خطای دیگر، یک خطای عمومی به کنسول ارسال می‌شود.

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

؟

وضعیت 409 دقیقا چه زمانی اتفاق می‌افتد؟

؟

چگونه می‌توان با خطای 409 مقابله کرد؟