GH GambleHub

API səhv kodları və ən yaxşı practices

1) Niyə səhvləri standartlaşdırmaq

Müştərilər üçün proqnozlaşdırma: vahid format və retraj davranışı.
Debatın sürətləndirilməsi: 'trace _ id '/' request _ id', sabit 'error _ code'.
Təhlükəsizlik: SQL/stack traces/konfiqlər sızmaz.
Müşahidə: səhvlərin taksonomiyası üzrə hesabat (validasiya, kvota, taymaut və s.).

2) Əsas prinsiplər

1. Bütün 4xx/5xx üçün vahid cavab formatı (və qismən səhvləri olan 2xx üçün - ayrıca sxem).
2. HTTP dəqiq semantikası: düzgün status ən vacibdir.
3. İki səviyyəli kod: nəqliyyat ('status') və sabit domen 'error _ code'.
4. Retriable vs Non-retriable: açıq göstərin və geri off üçün bir ipucu verin.
5. Default təhlükəsizlik: təfərrüatlar - yalnız hüquqlu müştəri; daxili yollar olmadan.
6. Lokalizasiya: maşın kodu sabit qalır, mətn tərcümə olunur.

3) Vahid səhv formatı (RFC 7807 əsasında)

Tövsiyə JSON (genişləndirilmiş '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"}
}

Məcburi: 'type', 'title', 'status', 'error _ code', 'trace _ id'.
Əlavə: 'errors []' (sahələr üzrə), 'retriable', 'hint', 'meta'.

Cavabda başlıqlar:
  • `Content-Type: application/problem+json`
  • `X-Request-ID`/`Traceparent` (W3C)
  • (429/503 üçün) 'Retry-After' (saniyə və ya tarix)

4) HTTP status semantikası («klassika» və praktikanın birləşməsi)

2xx (nüanslarla uğur)

200 OK - adi uğur.
201 Created - resurs (Location) yaradılmışdır.
202 Accepted - asenxron (verin 'status _ url').
207 Multi-Status - qismən uğur (mümkünsə çəkinin).

4xx (müştəri səhvi)

400 Bad Request - sintaksis/format, lakin sahələrin validasiyası deyil (daha yaxşı 422).
401 Unauthorized - heç bir/səhv token. Gəlin 'WWW-Authenticate'.
403 Forbidden - validen token, lakin yetərli hüquqlar (RBAC/ABAC/limitlər).
404 Not Found - resurs/end-point yoxdur.
409 Conflict - versiya/vəziyyət toqquşması (optimistic locking, idempotency).
410 Gone - son nöqtə əbədi olaraq silinir.
412 Precondition Failed - ETag/If-Match keçmədi.
415 Unsupported Media Type - səhv 'Content-Type'.
422 Unprocessable Entity - biznes qaydalarının təsdiqi.
429 Too Many Requests - kvota/sürət aşdı (bax § 7).

5xx (server səhvi)

500 Internal Server Error - qəfil səhv; detalları açıqlamayın.
502 Bad Gateway - axın səhvidir.
503 Service Unavailable - deqradasiya/həddindən artıq yükləmə, 'Retry-After' verin.
504 Gateway Timeout - arxa tərəfin vaxtıdır.

💡 Eşik: 4xx retraj deyil, 5xx retraj edilə bilər (backoff/jitter ilə), 429 - retray sonra 'retry-After'.

5) Domen taksonomiyası 'error _ code'

Tövsiyə olunan diapazonlar:
  • 'AUTH _' - autentifikasiya/avtorizasiya.
  • 'VAL _' - giriş məlumatlarının validasiyası.
  • 'RATELIMIT _' - kvotalar və sürət.
  • 'IDEMP _' - idempotentlik/dublikatlar.
  • 'CONFLICT _' - versiyalar/vəziyyət.
  • 'DEP _' - asılılıqlar (PSP/DNS/SMTP).
  • 'PAY _' - ödəniş domeninin biznes səhvləri.
  • 'SEC _' - təhlükəsizlik (imzalar, HMAC, mTLS).
  • 'INT _' - daxili qəfil.
Tələblər:
  • Zaman sabitliyi (back-compat).
  • Səhv kataloqunda təsvirlər və nümunələr (docs + machine-readable JSON).

6) Retriable vs Non-retriable

Sahələr:
  • `retriable: true|false`
  • Əgər 'true' - mütləq 'Retry-After' (saniyədə) və ya müqavilə «eksponensial geri dönüş (1-2 s, maksimum 30-60 s)».

Retriable adətən: '502/503/504', bəzi '500', '429' (pəncərədən sonra).
Non-retriable: `400/401/403/404/409/410/415/422`.

7) Rate limit & quota səhvlər (429)

Bədən:
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
}
Başlıqlar:
  • `Retry-After: 12`
  • `X-RateLimit-Limit`, `X-RateLimit-Remaining`, `X-RateLimit-Reset`
  • Для квот: `X-Quota-Limit`, `X-Quota-Remaining`, `X-Quota-Reset`

8) İdempotentlik və münaqişələr

Qeyd sorğularında - «Idempotency-Key» (24-72 saat ərzində unikaldır).
Yenidən əməliyyat konflikti → 409 Conflict ilə 'error _ code: "IDEMP_REPLAY"'.
ETag → 412 Precondition Failed.
Cavabda təhlükəsiz təkrar sorğu üçün 'resource _ id '/' status _ url' əlavə edin.

9) Validasiya və 422

Xətaların siyahısını sahələrə qaytarın:
json
{
"status": 422,
"error_code": "VAL_001",
"errors": [
{"field":"email","code":"email_invalid","message":"Invalid email"},
{"field":"age","code":"min","message":"Must be >= 18"}
]
}
Qaydalar:
  • Eyni şeyi 400 - 422-də təkrarlamayın.
  • Mesajlar - insan oxunan; 'code' - maşın.

10) Səhv təhlükəsizliyi

Heç vaxt: stack traces, SQL, fayl yolları, xüsusi hosts adları.
PII-ni redaktə edin; GDPR/DSAR-ı izləyin.
İmza üçün/NMAS: 'SEC _ SIGNATURE _ MISMATCH' (403) və 'SEC _ TIMESTAMP _ SKEW' (401/403) '5 dəq ± vaxtını yoxlayın.

11) Korrelyasiya və müşahidə

Həmişə 'trace _ id '/' X-Request-ID' əlavə edin və qeydlərə/yollara atın.
Səhvlər 'error _ code' və 'status' → dashboard «top səhvlər», «new vs known».
Alertlər: 5xx/422/429 sıçrayış, gecikmə p95, share of errors.

12) gRPC/GraphQL/Webhooks - mappinqlər

gRPC ↔ HTTP

gRPCMənasıHTTP
`OK`uğur200
`INVALID_ARGUMENT`Validasiya422/400
`UNAUTHENTICATED`token yoxdur401
`PERMISSION_DENIED`heç bir hüquq403
`NOT_FOUND`heç bir resurs404
`ALREADY_EXISTS`münaqişə409
`FAILED_PRECONDITION`ETAG/ön şərtlər412
`RESOURCE_EXHAUSTED`kvotalar429
`UNAVAILABLE`mövcud deyil503
`DEADLINE_EXCEEDED`Taymaut504
`INTERNAL`daxili500

GraphQL

Nəqliyyat 200, lakin 'errors []' daxilində - 'extensions əlavə edin. code` и `trace_id`.
«Fatal» üçün (autentifikasiya/kvota) - daha yaxşı real HTTP 401/403/429.

Webhooks

Yalnız 2xx alıcını uğurlu hesab edin.
«X-Webhook-ID», «X-Signature».
410 alıcıdan - retrayaları dayandırın (endpoint silinir).

13) Səhv versiyası

'type '/' error _ code' - sabit; yeni - yalnız əlavə edin.
Bədən sxemini dəyişdirdikdə - API və ya 'problem + json-un kiçik versiyasını artırın; v=2`.
Sənədləşmə: kodlar cədvəli + nümunələr; səhv changelog.

14) Sənədləşmə (OpenAPI fraqmentləri)

Qlobal cavablar

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 }

Endpoint nümunəsi

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) Test və keyfiyyət

Müqavilə testləri: uyğunluq 'application/problem + json', məcburi sahələr.
Negative tests: bütün filiallar 401/403/404/ 409/422/429/500.
Chaos/latency: 5xx/ 503/504/429 ('Retry-After') retraylarını yoxlayın.
Təhlükəsizlik testləri: daxili mesajların olmaması, düzgün PII maska.
Backward-compat: Köhnə müştərilər yeni sahələri başa düşürlər (əlavə edin, sındırmayın).

16) Giriş çek siyahısı

  • Vahid 'problem + json' + sabit 'error _ code'.
  • HTTP/gRPC/GraphQL düzgün semantikası.
  • Retriable/non-retriable + 'Retry-After '/back-off tövsiyələri.
  • Rate-limit başlıqları və 429 davranış.
  • İdempotentlik ('Idempotency-Key', 409/412).
  • Təhlükəsizlik: No stack traces/secrets, PII-edition.
  • 'trace _ id '/' X-Request-ID' bütün səhvlərdə.
  • Səhv kataloqunun sənədləşdirilməsi və nümunələri.
  • Səhv taksonomiyası üzrə monitorinq.
  • Mənfi ssenarilərin avtostestləri.

17) Mini-FAQ

400 422-dən nə ilə fərqlənir?
400 - sınıq sorğu (sintaksis/məzmun növü). 422 - sintaksis etibarlı, lakin biznes qaydaları keçmədi.

Nə zaman 401, nə zaman 403?
401 - yox/səhv token; 403 - token var, hüquqlar yoxdur.

Həmişə 'Retry-After' lazımdır?
429/503 üçün - bəli; qalanları üçün retriable - açıq tövsiyə vermək məsləhətdir.

Yekun

Yaxşı dizayn edilmiş səhvlər bir müqavilədir: düzgün HTTP statusu, vahid 'problem + json', sabit 'error _ code', retrajlarda aydın ipuçları və ciddi təhlükəsizlik. Formatı standartlaşdırın, taksonomiyanı sənədləşdirin, telemetriya və testlər əlavə edin və API-ləriniz proqnozlaşdırıla bilən, təhlükəsiz və inteqratorlara dost olacaq.

Contact

Bizimlə əlaqə

Hər hansı sualınız və ya dəstək ehtiyacınız varsa — bizimlə əlaqə saxlayın.Həmişə köməyə hazırıq!

Telegram
@Gamble_GC
İnteqrasiyaya başla

Email — məcburidir. Telegram və ya WhatsApp — istəyə bağlıdır.

Adınız istəyə bağlı
Email istəyə bağlı
Mövzu istəyə bağlı
Mesaj istəyə bağlı
Telegram istəyə bağlı
@
Əgər Telegram daxil etsəniz — Email ilə yanaşı orada da cavab verəcəyik.
WhatsApp istəyə bağlı
Format: ölkə kodu + nömrə (məsələn, +994XXXXXXXXX).

Düyməyə basmaqla məlumatların işlənməsinə razılıq vermiş olursunuz.