مدیریت خطاها – Error handling
- مقدمه ای بر Error Handling
- نحوه نگارش خطاها
- Status Code – کدهای وضعیتی درخواست ها
- خطاهایی که در قالب Response دریافت میشود
- دریافت جزئیات خطا از طریق API
- سربرگ – Header
- مقادیر ارسالی – Request Data
- پاسخ صحیح – Response True
- پاسخ نادرست – Response False
مقدمه ای بر Error Handling
قبل از هر چیز لازم است بدانیم مدیریت خطا یا error handling به چه معناست. این اصطلاح به واکنش و مکانیسمهای بازیابی نرمافزار در صورت بروز خطا اشاره میکند. به عبارت دیگر این کار فرآیندی است که شامل پیشبینی دقیق، شناسایی و رفع خطاها در برنامهها است.
اجرای منظم یک برنامه از طریق مدیریت خطا آسانتر است. وقتی صحبت از رویکردهای خطا handling میشود، بسیاری از برنامهها با مشکلات معماری نرمافزار مواجه میشوند.
توجه داشته باشید که API AirPlus کامل منطق بر اصول RESTful API نوشته شده است پس بنابراین پاسخ تمام درخواست ها با Status Code مورد نظر خود ارسال خواهد شد و مدیریت این Status Code ها یا هما کدهای وضعیتی در برنامه شما الزامیست.
طبق اصول کلی تمام پاسخ های صحیح با کد وضعیتی 200 ارسال خواهند شد.
اما اتوماسیون ایرپلاس در زمینه مدیریت خطاها هم مستندات جامع و کاربردی را تهیه نموده است.
نحوه نگارش خطاها
پاسخ نادرست – Response False یا همان مشکل در ارسال اطلاعات
| عنوان | نوع | مقادیر | توضیحات |
| status | Boolean | false | مقدار در پاسخ نادرست همیشه false است |
| time | Timestamp | زمان تولید پاسخ | این زمان بر اساس timestamp می باشد – در صورت نیاز از این زمان استفاده شود. |
| code | Integer | شماره خطا مربوطه | جهت استعلام خطا میتوانید از طریق این لینک اقدام کنید. |
{
"status": false,
"time": "Timestamp", // Timestamp
"code": "Error Code"
}
Status Code – کدهای وضعیتی درخواست ها
وضعیت 200 — OK
کد وضعیت 200 OK نشان میدهد که درخواست بهدرستی توسط سرور دریافت، درک و پردازش شده و پاسخ استاندارد حاوی دادههای درخواستشده را بازگردانده است.
طبق RFC 9110 (HTTP Semantics, 2022)، این کد برای موفقیت عمومی تمام متدهای HTTP استفاده میشود؛ در پاسخ به GET معمولاً به معنی دریافت محتوای صحیح است، در PUT و DELETE به معنی انجام کامل عملیات است.
در صورت دریافت 200، کلاینت میتواند فرض کند که هیچ خطایی در فرآیند ارتباط وجود نداشته و پاسخ معتبر است.
وضعیت 201 — Created
کد 201 Created نشان میدهد که درخواست با موفقیت انجام شده و منبع جدیدی ایجاد شده است.
بر اساس RFC 9110، این پاسخ اغلب برای متدهای POST و گاهی PUT استفاده میشود. سرور میتواند هدر Location را شامل URI منبع تازه ایجادشده برگرداند تا کلاینت بتواند به آن دسترسی پیدا کند.
نمونه: هنگام ثبت سفارش یا خرید بلیت، اگر ایجاد آیتم در پایگاه داده موفقیتآمیز باشد، سرور وضعیت 201 بازمیگرداند.
وضعیت 204 — No Content
کد 204 No Content به معنی موفقیتآمیز بودن درخواست بدون نیاز به ارسال محتوای جدید در پاسخ است.
این کد معمولاً در پاسخ به متدهای PUT, PATCH, DELETE یا POST استفاده میشود، زمانیکه عمل موردنظر در سرور انجام شده ولی دادهای برای بازگرداندن وجود ندارد.
مثال: API حذف رزرو در صورت موفق بودن حذف، بدون بدنهٔ پاسخ، وضعیت 204 ارسال میکند.
وضعیت 207 — Multi‑Status
کد 207 Multi‑Status بخشی از استاندارد WebDAV (RFC 4918) است.
این کد زمانی استفاده میشود که یک درخواست شامل چندین عملیات یا منبع باشد و پاسخ برای هر مورد جداگانه در قالب XML یا JSON شامل وضعیت مجزا ارائه گردد.
بهطور مثال در یک درخواست جمعی برای بروزرسانی چند فایل، اگر بعضی پردازش شوند و بعضی خطا بدهند، پاسخ 207 حاوی نتیجهٔ جزئی هر فایل ارسال میشود.
وضعیت 400 — Bad Request
کد 400 Bad Request نشاندهندهٔ آن است که سرور نمیتواند یا نمیخواهد درخواست را پردازش کند زیرا در نحو (syntax) یا ساختار دادههای درخواست خطا وجود دارد.
علل رایج: بدنه غیرقابل parse شدن، مقادیر ناقص، هدرهای نادرست یا شناسهٔ توکن نامعتبر.
این خطا ناشی از اشتباه سمت کلاینت است و معمولاً با پیامهایی نظیر invalid JSON یا missing parameter همراه میشود.
وضعیت 404 — Not Found
کد 404 Not Found زمانی برگردانده میشود که منبع یا مسیر مورد نظر در سرور وجود ندارد یا حذف شده است.
از دید API یعنی Endpoint یا URI درخواستی شناسایی نمیشود.
دلایل معمول: آدرس غلط، تغییر نسخهٔ سرویس، پایان پشتیبانی از مسیر قبلی (deprecated endpoint).
راهحل: بررسی مجدد URL و در صورت نیاز بهروزرسانی URI مورد استفاده.
وضعیت 405 — Method Not Allowed
کد 405 Method Not Allowed یعنی URI مورد درخواست معتبر است، اما متد (مثلاً POST یا DELETE) توسط سرور برای آن مسیر مجاز نیست.
در پاسخ معمولاً هدر Allow شامل لیستی از متدهای مجاز مثل GET, PUT برگردانده میشود.
این خطا از نوع کلاینت است و نشانهٔ استفاده از متد غیرفعال برای endpoint خاص میباشد.
وضعیت 409 — Conflict
کد 409 Conflict به معنی وجود تعارض در وضعیت فعلی منبع است که مانع انجام عملیات میشود.
این خطا زمانی بازگردانده میشود که درخواست در تضاد با دادههای موجود باشد، مثلاً تلاش برای ایجاد رکورد تکراری یا بروزرسانی نسخهٔ قدیمی شیء.
در سيستمهای دارای نسخهبندی و کنترل همزمان (مثل وبسایت رزرو یا فرم ثبت آیتم تکراری) کاربرد دارد.
وضعیت 422 — Unprocessable Entity
کد 422 Unprocessable Content (نام جدید در RFC 9110، قبلاً Unprocessable Entity در RFC 4918 بود) زمانی ارسال میشود که درخواست از نظر نحوی درست است ولی دادههای آن از نظر منطقی یا اعتبارسنجی نامعتبر است.
مثلاً فیلدهای الزامی خالیاند یا مقادیر بعضی پارامترها خارج از محدودهٔ مجاز هستند.
این کد معمولاً در APIهایی که قبل از پردازش داده، validation دقیقی انجام میدهند (مثلاً در فرمهای ثبت اطلاعات) استفاده میشود.
وضعیت 500 — Internal Server Error
کد 500 Internal Server Error بیانگر خطای عمومی در سمت سرور است، بدون اشاره به علت دقیق.
معمولاً در اثر بروز استثنا (Exception)، نقص در پیکربندی، یا قطع ارتباط سرویس وابسته رخ میدهد.
این خطا قابل تشخیص برای کلاینت نیست و صرفاً به معنی شکست درخواست در سطح سرور است.
توصیهٔ استاندارد: بررسی log سرور، و در صورت نیاز ارائه سرویس پشتیبان یا fallback endpoint برای حفظ پایداری ارتباط.

خطاهایی که در قالب Response دریافت میشود
این خطا ها در قالب Response False بصورت کد دریافت میشوند که میتوانید در متن خطا ها و راه حل آنها را در جدول زیر مشاهده نمائید.
| ردیف | کد خطا | عنوان | راه حل |
| 1 | 1000 | ثبت این آیتم موفقیت آمیز بوده است | در مواردی دیگر خطایی رخ داده است. |
| 2 | 1001 | امکان قفل بر روی چارتری درخواستی امکان پذیر نمی باشد. | این خطا راهکاری ندارد. |
| 3 | 1002 | چارتر درخواستی موجود نمی باشد. | این خطا راهکاری ندارد. |
| 4 | 1003 | مقصد مورد نظر یافت نشد. | لطفا مقصد مورد نظر را یا بصورت یاتا و یا بصورت سریال از طریق API ایرپلاس وارد نمائید (الویت سریال های ایرپلاس می باشد) |
| 5 | 1004 | تاریخ های وارد شده معتبر نمی باشد | لطفا تاریخ ها را به میلادی و با فرمت صحیح ارسال فرمائید (YYYY-MM-DD) |
| 6 | 1005 | قفل ارسالی معتبر نمی باشد. | اطلاعات قفل را بررسی نمائید و اگر از کد اطمینان دارید تعداد مسافرین با قفل همخوانی ندارد. |
| 7 | 1006 | برای این مسافر قبلا این آیتم خریداری شده است. | در صورتی که با این خطا مواجه شده اید از طریق متد بررسی وضعیت اطلاعات این رزرو را دریافت نمائید. |
| 8 | 1007 | آیتم مورد نظر یافت نشد. | این خطا راهکاری ندارد. |
| 9 | 1008 | ظرفیت این آیتم تکمیل شده است | لطفا مجدد جستجو را انجام دهید و در صورت فعال بودن آیتم دیگری را انتخاب نمائید. |
| 10 | 1009 | تعداد مسافرین با قفل ارسالی همخوانی ندارد | لطفا مجدد درخواست خود را با تعداد صحیح مندرج در قفل ارسال فرمائید. |
| 11 | 1010 | جمع مبلغ ارسالی با مبلغ قابل پرداخت همخوانی ندارد. | لطفا مجدد درخواست خود را با مبلغ صحیح ارسال فرمائید. |
| 12 | 1011 | کد ملی/شماره پاسپورت معتبر نمی باشد | لطفا کدملی/شماره پاسپورت موجود در data را بررسی و تصحیح فرمائید. |
| 13 | 1012 | با اطلاعاتی ارسالی رزروی یافت نشد | لطفا اطلاعات رابررسی و دوباره اقدام فرمائید. |
| 14 | 1013 | فرمت شماره موبایل ارسالی صحیح نمی باشد. | فرمت صحیح شماره تلفن همراه باید با +98 یا 09 و یا 9 شروع شده باشد و تعداد کاراکتر صحیح ارسال شود. |
| 15 | 1014 | فرمت ایمیل ارسالی صحیح نمی باشد. | لطفا یک ایمیل صحیح با فرمت درست ارسال فرمائید بطور مثال : info@airplus.app |
| 16 | 1015 | استرداد این آیتم باتوجه به قوانین استرداد امکان پذیر نمی باشد. | با توجه به قوانین استرداد این آیتم امکان استرداد را ندارد. |
| 17 | 1016 | مغادیر مورد نیاز API ارسال نشده است. | لطفا مغادیر را بررسی فرمائید و مقدار لازم را ارسال فرمائید. |
| 18 | 1017 | مغادیر مورد api به درستی ارسال نشده است. | لطفا مغادیر را برسی فرمایید و مقدار لازم را به صورت صحیح و در فرمت مشخص ارسال فرمایید. |
| 19 | 1018 | تاریخ شروع و پایان جستجو فقط میتوانید در آینده باشد. | لطفا محدوده تاریخی خود را به آینده تغییر دهید و اعتبارسنجی این موضوع را انجام دهید. |
| 20 | 1019 | ملیت مسافر معتبر نمی باشد. | لطفا ملیت مسافر را برسی نمائید و ملیت معتبر را ارسال فرمائید. |
| 21 | 1021 | ورود تاریخ با فرمت صحیح الزامی می باشد. | لطفا تاریخ را در فرمت صحیح ارسال فرمائید. |
| 22 | 2000 | خطای مهلک رخ داده است | این خطا الزاما باید از طریق هسته مرکزی رفع شود و لطفا به واحد پشتیبانی اطلاع دهید. |
در ضمن میتوانید از طریق API زیر بصورت داینامیک این خطاها را دریافت و مدیریت نمائید.
دریافت جزئیات خطا از طریق API
| عنوان | وضعیت | مقادیر | توضیحات |
| Method | اجباری | GET | متد ارسال درخواست |
| Domain | اجباری | نام دامنه ثبت شده در اتوماسیون | |
| Api Url | اجباری | دامنه هسته مرکزی سرویس | |
| Api version | اجباری | به نسخه فعلی سرویس API تلقی میشود که در قسمت پیش نیازهای اتوماسیون به ریز شرح داده شده است. | |
| Authorization | اجباری | توکن JWT تولید شده | این توکن بصورت JWT تولید میشود. |
سربرگ – Header
در این روش شما باید درخواست خود را از طریق لینک زیر ارسال فرمائید.
{{Api Url}}/error-handling
HEADER
GET /api/reservation/{{Api version}}/error-handling HTTP/1.1
Host: {{Your Host}}
Authorization: Bearer JWTToken
Content-Type: application/json
Domain: {{Your Domain}}
API Url از طریق پنل کاربری قابل مشاهده خواهد بود
مقادیر ارسالی – Request Data
| عنوان | نوع | وضعیت | مقادیر | توضیحات |
| code | Integer | اختیاری | نام کاربری دریافت شده | در صورت وجود کد فقط کد مورد نظر بازگشت داده می شود. |
{
"code": "Error Code"
}
پاسخ صحیح – Response True
| عنوان | نوع | مقادیر | توضیحات |
| status | Boolean | true | مقدار در پاسخ صحیح همیشه true است |
| time | Timestamp | زمان تولید پاسخ | این زمان بر اساس timestamp می باشد – در صورت نیاز از این زمان استفاده شود. |
| data | Array | ||
| data[Index].title | String | شرح خطا به زبان فارسی | |
| data[Index].solution | String | روش حل خطا به زبان فارسی |
دریافت این پاسخ با Status Code 200 دریافت خواهد شد.
{
"status": true,
"time": "Timestamp", // Timestamp
"data": [
{
"title": "Error title in Persian",
"solution": "How to solve errors in Persian"
},
...
]
}
پاسخ نادرست – Response False
| عنوان | نوع | مقادیر | توضیحات |
| status | Boolean | false | مقدار در پاسخ نادرست همیشه false است |
| time | Timestamp | زمان تولید پاسخ | این زمان بر اساس timestamp می باشد – در صورت نیاز از این زمان استفاده شود. |
| code | Integer | شماره خطا مربوطه |
{
"status": false,
"time": "Timestamp", // Timestamp
"code": "Error Code"
}