GH GambleHub

کدهای خطای API و بهترین شیوه ها

1) چرا استاندارد کردن خطاها

پیش بینی برای مشتریان: یک فرمت واحد و رفتار retras.
شتاب اشکال زدایی: 'trace _ id '/' request _ id'، پایدار 'error _ code'.
امنیت: ردیابی/پیکربندی SQL/پشته نشت نخواهد کرد.
قابلیت مشاهده: گزارش در طبقه بندی خطا (اعتبار سنجی، سهمیه، زمان بندی، و غیره).

2) اصول اساسی

1. یک فرمت پاسخ واحد برای همه 4xx/5xx (و برای 2xx با خطاهای جزئی - یک طرح جداگانه).
2. پاک کردن معانی HTTP: وضعیت صحیح مهم است.
3. دو سطح کد: حمل و نقل («وضعیت») و دامنه پایدار «error _ code».
4. قابل بازیابی در مقابل غیر قابل بازیابی: به صراحت مشخص کنید و اشاره ای به عقب نشینی کنید.

5. امنیت پیش فرض: جزئیات - فقط به مشتری با حقوق ؛ بدون آثار داخلی

6. محلی سازی: کد ماشین پایدار باقی می ماند، متن - ما ترجمه می کنیم.

3) فرمت خطای تنها (بر اساس RFC 7807)

JSON توصیه شده (توسعه یافته 'application/problem + json'):
json
{
"type": "https://api. example. com/errors/validation_failed",
"title": "Validation failed",
"status": 422,
"error_code": "VAL_001",
"detail": "Field 'email' must be a valid address",
"instance": "req_01HZY...93",
"trace_id": "a1b2c3d4e5f6",
"retriable": false,
"errors": [
{"field": "email", "code": "email_invalid", "message": "Invalid email"}
],
"hint": "Fix payload and retry",
"meta": {"docs": "https://docs. example. com/errors#VAL_001"}
}

مورد نیاز: 'type'، 'title'، 'status'، 'error _ code'، 'trace _ id'.
اختیاری: «خطاها []» (توسط زمینه ها)، «قابل بازیابی»، «اشاره»، «متا».

عناوین در پاسخ:
  • 'Content-Type: application/problem + json'
  • 'X-Request-ID '/' Traceparent' (W3C)
  • (برای 429/503) 'Retry-After' (ثانیه یا تاریخ)

4) معانی وضعیت HTTP (ادغام «کلاسیک» و عمل)

2XX (موفقیت ظریف)

200 OK یک موفقیت مشترک است.
201 ایجاد شده - محل.
202 پذیرفته شده - به صورت ناهمگام در صف (به 'status _ url').
207 چند وضعیت - موفقیت جزئی (اجتناب از در صورت امکان).

4xx (خطای مشتری)

۴۰۰ Bad Request - syntax/format, but not field validation (ترجیحا ۴۲۲).
401 توکن غیر مجاز - بدون/نامعتبر. بیایید «WWW-Authenticate» را بررسی کنیم.
۴۰۳ Forbidden - توکن معتبر است، اما حقوق کافی وجود ندارد (RBAC/ABAC/limits).
404 یافت نشد - هیچ منبع/نقطه پایانی وجود ندارد.
409 تعارض - قفل بهینه، idemotency.
۴۱۰ Gone - نقطه پایانی به طور دائم حذف شده است.
412 پیش شرط شکست خورده - ETag/If-Match شکست خورده است.
415 نوع رسانه پشتیبانی نشده - نامعتبر «محتوا نوع».
422 نهاد غیر قابل پردازش - اعتبار قوانین کسب و کار.
429 Too Many Requests - بیش از سهمیه/سرعت (نگاه کنید به § 7).

5xx (خطای سرور)

500 خطای سرور داخلی - خطای ناگهانی ؛ جزئیات را فاش نکند.

خطای 502 Bad Gateway - Upstream

503 سرویس در دسترس نیست - تخریب/اضافه بار، به 'Retry-After'.
504 اتمام وقت دروازه - اتمام وقت باطن.

💡 آستانه: 4xx retrayem نیست، 5xx قابل پرداخت است (backoff/jitter)، 429 پس از «Retry-After» بازپرداخت می شود.

5) طبقه بندی دامنه 'error _ code'

محدوده های زیر را توصیه می کنیم:
  • 'AUTH _' - احراز هویت/مجوز.
  • 'VAL _' - اعتبار سنجی داده های ورودی.
  • 'RATELIMIT' - سهمیه و سرعت.
  • 'IDEMP _' - idempotence/تکراری.
  • 'CONFLICT _' - نسخه/وضعیت.
  • 'DEP _' - وابستگی ها (PSP/DNS/SMTP).
  • «PAY» - خطاهای تجاری دامنه پرداخت.
  • 'SEC _' - امنیت (امضا، HMAC، mTLS).
  • 'INT' - ناگهانی داخلی.
مورد نیاز:
  • پایداری در طول زمان (back-compat).
  • توضیحات و نمونه ها در دایرکتوری خطا (docs + JSON قابل خواندن برای ماشین).

6) قابل بازیابی در مقابل غیر قابل بازیابی

زمینه های فعالیت:
  • «قابل جستجو: درست است»
  • اگر «درست» - لزوما «Retry-After» (به ثانیه) یا قرارداد «عقب نشینی نمایشی (با شروع از 1-2 ثانیه، حداکثر 30-60 ثانیه)».

قابل بازیابی معمولا: «502/503/504»، برخی از «500»، «429» (بعد از پنجره).
غیر قابل بازیابی: '400/401/403/404/ 409/410/415/422'.

7) محدودیت نرخ و خطاهای سهمیه بندی (429)

بدن:
json
{
"type": "https://api. example. com/errors/rate_limited",
"title": "Rate limit exceeded",
"status": 429,
"error_code": "RATELIMIT_RPS",
"detail": "Too many requests",
"retriable": true
}
عناوین:
  • «تلاش مجدد پس از: 12»
  • 'X-RateLimit-Limit', 'X-RateLimit-Remaining', 'X-RateLimit-Reset'
  • Для квот: «X-Quota-Limit»، «X-Quota-Remaining»، «X-Quota-Reset»

8) ناتوانی و درگیری

درخواست نوشتن - 'Idempotency-Key' (منحصر به فرد در عرض 24-72 ساعت).
ناسازگاری → 409 ناسازگاری با «error _ code:» IDEMP_REPLAY"'.
ناسازگاری نسخه منبع برای ETag → 412 پیش شرط شکست خورد.
در پاسخ، ضمیمه 'resource _ id '/' status _ url' برای درخواست مجدد امن.

9) اعتبار سنجی و 422

یک لیست از خطاها را با فیلد بازگردانید:
json
{
"status": 422,
"error_code": "VAL_001",
"errors": [
{"field":"email","code":"email_invalid","message":"Invalid email"},
{"field":"age","code":"min","message":"Must be >= 18"}
]
}
قوانین و مقررات:
  • همان را در 400 - 422 ترجیح داده شده برای اعتبار کسب و کار تکرار نکنید.
  • پیام ها قابل خواندن توسط انسان هستند. «کد» ماشین قابل خواندن است.

10) امنیت خطا

هرگز: ردیابی پشته، SQL، مسیرهای فایل، نام میزبان خصوصی.
ویرایش PII ؛ به GDPR/DSAR توجه کنید.
برای امضا/HMAC، بین «SEC _ SIGNATURE _ MISMATCH» (403) و «SEC _ TIMESTAMP _ SKEW» (401/403) با اعلان «check ± time 5 min» تمایز قائل شوید.

11) همبستگی و قابلیت مشاهده

همیشه «trace _ id »/« X-Request-ID» را اضافه کنید و از طریق سیاهههای مربوط/آهنگ حرکت کنید.
خطاهای مجموع توسط «error _ code» و «status» → داشبورد «خطاهای بالا»، «جدید در مقابل شناخته شده».
هشدارها: سنبله 5xx/422/429، تأخیر p95، سهم خطاها.

12) gRPC/GraphQL/Webhooks - نقشه ها

gRPC ↔ HTTP

جی آر پی سیارزش گذاریوب سایت ها
«بسیار خوب»موفقیت آمیز200
«استدلال نامعتبر»اعتبار سنجی422/400
«تأیید نشده»هیچ نشانه ای نیست401
'اجازه _ انکار'بدون حقوق403
'نه' کشف شد 'بدون منبع404
«در حال حاضر وجود دارد»درگیری409
«شکست خورده _ پیش شرط»ETag/پیش شرط412
'منابع _ خسته'سهمیه ها429
«در دسترس نبودن»در دسترس نیست503
«مهلت _ بیش از حد»اتمام وقت504
«بین المللی»داخلی500

GraphQL

حمل و نقل 200، اما 'errors [] در داخل - اضافه کردن extensions. کد 'и' trace _ id '.
برای «کشنده» (احراز هویت/سهمیه) - یک 401/403/429 HTTP واقعی بهتر است.

صفحات وب

فقط دریافت کنندگان 2xx موفق هستند.
«X-Webhook-ID»، «X-Signature».
410 از گیرنده - توقف retray (نقطه پایانی حذف شده).

13) نسخه خطا

'type '/' error _ code' - stable; جدید - فقط اضافه کنید

هنگام تغییر طرح بدنه، نسخه جزئی API یا "problem + json را بالا ببرید. v = 2.

مستندات: جدول کد + نمونه; تغییر اشتباهات

14) مستندات (قطعات OpenAPI)

پاسخ های جهانی

yaml components:
responses:
Problem:
description: Problem Details content:
application/problem+json:
schema:
$ref: '#/components/schemas/Problem'
schemas:
Problem:
type: object required: [type, title, status, error_code, trace_id]
properties:
type: { type: string, format: uri }
title: { type: string }
status: { type: integer }
error_code: { type: string }
detail: { type: string }
instance: { type: string }
trace_id: { type: string }
retriable: { type: boolean }
errors:
type: array items:
type: object properties:
field: { type: string }
code: { type: string }
message: { type: string }

نمونه ای از یک نقطه پایانی

yaml paths:
/v1/users:
post:
responses:
'201': { description: Created }
'401': { $ref: '#/components/responses/Problem' }
'422': { $ref: '#/components/responses/Problem' }
'429': { $ref: '#/components/responses/Problem' }
'500': { $ref: '#/components/responses/Problem' }

15) تست و کیفیت

قرارداد تست: مطابقت 'نرم افزار/مشکل + json'، زمینه های مورد نیاز.
تست منفی: تمام شاخه های 401/403/404/ 409/422/429/500.
هرج و مرج/تاخیر: چک کردن retrays برای 5xx/ 503/504/429 ('Retry-After').
تست های امنیتی: بدون پیام داخلی، ماسک PII صحیح.
کامپات عقب مانده: مشتریان قدیمی زمینه های جدید را درک می کنند (اضافه کردن، شکستن).

16) چک لیست پیاده سازی

  • تنها 'مشکل + json' + پایدار 'error _ code'.
  • معانی HTTP/gRPC/GraphQL را درست کنید.
  • قابل بازیابی/غیر قابل بازیابی + 'Retry-After '/توصیه های برگشت.
  • هدر نرخ محدود و رفتار 429.
  • Idempotency («Idempotency-کلید»، 409/412).
  • امنیت: هیچ اثری/اسرار پشته، نسخه PII.
  • 'trace _ id '/' X-Request-ID' در تمام خطاها.
  • مستندات کاتالوگ خطا و نمونه.
  • نظارت بر طبقه بندی خطا.
  • نشانه های سناریوهای منفی.

17) مینی سوالات متداول

400 چه تفاوتی با 422 دارد ؟

400 - درخواست شکسته (نحو/نوع محتوا). ۴۲۲ - در نحو معتبر است، اما قوانین کسب و کار تصویب نشده است.

401 چه زمانی است و 403 چه زمانی است ؟

401 - نشانه بدون/نادرست ؛ ۴۰۳ - یک نشانه وجود دارد، حقوق کافی وجود ندارد.

آیا «بازگشت» همیشه لازم است ؟

برای 429/503، بله ؛ برای بقیه، قابل بازیابی است - توصیه می شود یک توصیه صریح ارائه دهید.

مجموع

اشکالات به خوبی طراحی شده قرارداد هستند: وضعیت HTTP صحیح، تنها «مشکل + json»، پایدار «error _ code»، نکات صریح retray و امنیت قوی. فرمت را استاندارد کنید، طبقه بندی را مستند کنید، تله متری و تست ها را اضافه کنید - و API شما قابل پیش بینی، امن و یکپارچه می شود.

Contact

با ما در تماس باشید

برای هرگونه سؤال یا نیاز به پشتیبانی با ما ارتباط بگیرید.ما همیشه آماده کمک هستیم!

Telegram
@Gamble_GC
شروع یکپارچه‌سازی

ایمیل — اجباری است. تلگرام یا واتساپ — اختیاری.

نام شما اختیاری
ایمیل اختیاری
موضوع اختیاری
پیام اختیاری
Telegram اختیاری
@
اگر تلگرام را وارد کنید — علاوه بر ایمیل، در تلگرام هم پاسخ می‌دهیم.
WhatsApp اختیاری
فرمت: کد کشور و شماره (برای مثال، +98XXXXXXXXXX).

با فشردن این دکمه، با پردازش داده‌های خود موافقت می‌کنید.