HTTP Status kodlar — 200, 201, 400, 401, 404, Ok(), BadRequest()
Muammodan boshlaylik
[HttpGet("{id}")]
public IActionResult Ol(int id)
{
var m = service.Ol(id);
if (m is null) return Ok(new { xato = "Topilmadi" });
return Ok(m);
}
Mijoz har doim 200 OK oladi — topilmasa ham. Frontend javobni ochib, ichida xato maydoni bormi deb tekshirishi kerak. Monitoring "hamma so'rovlar muvaffaqiyatli" deydi. Brauzer keshi "topilmadi" javobini keshlab qo'yadi.
HTTP da natijani bildirishning standart usuli bor — status kod.
Status kod guruhlari
| Guruh | Ma'nosi |
|---|---|
| 1xx | Ma'lumot (kamdan-kam) |
| 2xx | Muvaffaqiyat |
| 3xx | Yo'naltirish |
| 4xx | Mijoz xatosi — so'rovda muammo |
| 5xx | Server xatosi — sizning kodingizda muammo |
Muhim farq: 4xx — mijoz so'rovini tuzatib qayta yuborishi kerak; 5xx — muammo serverda, mijoz aybdor emas.
Hayotiy o'xshatma
Pochta xizmati javoblari. "Yetkazildi" (200), "Qabul qilindi, yangi trek raqami" (201), "Manzil noto'g'ri yozilgan" (400), "Pasport ko'rsating" (401), "Bu posilkani olishga huquqingiz yo'q" (403), "Bunday posilka yo'q" (404), "Bizda xatolik, keyinroq keling" (500). Har bir javob — aniq, va keyin nima qilish kerakligini aytadi.
Eng ko'p ishlatiladiganlar
2xx — muvaffaqiyat
| Kod | Ma'nosi | ASP.NET Core | Qachon |
|---|---|---|---|
| 200 OK | Muvaffaqiyat, body bor | Ok(data) |
GET, ma'lumot qaytaradigan PUT |
| 201 Created | Yaratildi | CreatedAtAction(...) |
POST — Location sarlavhasi bilan |
| 202 Accepted | Qabul qilindi, keyin bajariladi | Accepted() |
Uzoq fon vazifalari |
| 204 No Content | Muvaffaqiyat, body yo'q | NoContent() |
PUT, PATCH, DELETE |
4xx — mijoz xatolari
| Kod | Ma'nosi | ASP.NET Core | Qachon |
|---|---|---|---|
| 400 Bad Request | So'rov noto'g'ri | BadRequest(), ValidationProblem() |
Validatsiya, noto'g'ri format |
| 401 Unauthorized | Autentifikatsiya yo'q yoki yaroqsiz | Unauthorized() |
Token yo'q/muddati o'tgan |
| 403 Forbidden | Kim ekani ma'lum, lekin ruxsat yo'q | Forbid() |
Oddiy user admin endpoint ga |
| 404 Not Found | Resurs yo'q | NotFound() |
ID bo'yicha topilmadi |
| 405 Method Not Allowed | Metod qo'llab-quvvatlanmaydi | avtomatik | POST o'rniga GET |
| 409 Conflict | Holat ziddiyati | Conflict() |
Email band, versiya to'qnashuvi |
| 415 Unsupported Media Type | Content-Type noto'g'ri | avtomatik | JSON o'rniga matn |
| 422 Unprocessable Entity | Shakl to'g'ri, lekin biznes qoidasi buzilgan | UnprocessableEntity() |
Qoldiq yetarli emas |
| 429 Too Many Requests | Juda ko'p so'rov | rate limiter (70-dars) | Limit oshdi |
5xx — server xatolari
| Kod | Ma'nosi |
|---|---|
| 500 Internal Server Error | Kutilmagan xato (ushlanmagan exception) |
| 502 Bad Gateway | Proxy orqasidagi server javob bermadi |
| 503 Service Unavailable | Vaqtincha ishlamaydi (texnik ishlar, yuklama) |
| 504 Gateway Timeout | Proxy javobni kutib, vaqti tugadi |
5xx ni kodda ataylab qaytarish kam bo'ladi — ular odatda ushlanmagan xatolar natijasi (65-dars).
401 va 403 farqi
401 Unauthorized — "Siz kimsiz? Avval tizimga kiring" (token yo'q, yaroqsiz, muddati tugagan)
403 Forbidden — "Sizni taniyman, lekin bunga ruxsatingiz yo'q"
Nomlar chalkash (401 aslida "unauthenticated"), lekin ma'nosi — shunday. Frontend 401 da login sahifasiga yo'naltiradi yoki tokenni yangilaydi (62-dars), 403 da — "ruxsat yo'q" xabarini ko'rsatadi.
400 va 422
- 400 — so'rov shakli noto'g'ri: JSON buzilgan, majburiy maydon yo'q, format xato
- 422 — shakli to'g'ri, lekin ma'no jihatidan bajarib bo'lmaydi: qoldiq yetarli emas, o'tgan sanaga bron
Ko'p API lar ikkalasi uchun ham 400 ishlatadi — muhimi, loyiha bo'ylab izchil bo'lish.
ProblemDetails — xatolar uchun standart format
builder.Services.AddProblemDetails();
return Problem(
title: "Qoldiq yetarli emas",
detail: quot;'{m.Nomi}' dan faqat {m.Qoldiq} ta qolgan",
statusCode: StatusCodes.Status422UnprocessableEntity);
{
"type": "https://tools.ietf.org/html/rfc4918#section-11.2",
"title": "Qoldiq yetarli emas",
"status": 422,
"detail": "'Choynak' dan faqat 2 ta qolgan",
"traceId": "00-..."
}
Barcha xatolar bir xil shaklda — frontend ularni bitta joyda qayta ishlaydi. Global sozlash — 65-dars.
Amaliy — bitta action da
[HttpPost("{id:int}/savatga")]
[ProducesResponseType(StatusCodes.Status204NoContent)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
[ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status422UnprocessableEntity)]
public async Task<IActionResult> SavatgaQosh(int id, SavatQoshDto dto, CancellationToken ct)
{
var m = await db.Mahsulotlar.FindAsync([id], ct);
if (m is null) return NotFound();
if (m.Qoldiq < dto.Soni)
return Problem(title: "Qoldiq yetarli emas", statusCode: 422);
var userId = User.FindFirstValue(ClaimTypes.NameIdentifier)!;
await savat.QoshAsync(userId, id, dto.Soni, ct);
return NoContent();
}
[!TIP]
[ProducesResponseType]atributlari — Swagger hujjatida har bir endpoint qanday javoblar qaytarishini ko'rsatadi. Klient dasturchilari va avtomatik generatsiya qilinadigan klient kodi uchun juda foydali (72-dars).
[!WARNING] 500 javoblarida foydalanuvchiga stack trace va ichki xato xabarlarini ko'rsatmang (Production da) — ular baza tuzilmasi, fayl yo'llari va kutubxona versiyalarini oshkor qiladi. Batafsil ma'lumot — faqat loglarda; javobda — umumiy xabar va
traceId(65-dars).
Tez-tez uchraydigan xatolar
Xatoda 200 qaytarish — Ok(new { xato = ... }).
POST dan 200 — 201 Created.
Ruxsat yo'qligida 404 yoki 401 o'rniga 403 (yoki aksincha) — ma'nolarni aralashtirish.
Kutilgan xatoni exception bilan 500 ga aylantirish — "topilmadi" — exception emas, NotFound().
Xulosa
Status kod — so'rov natijasining standart ifodasi: 2xx — muvaffaqiyat, 4xx — mijoz xatosi, 5xx — server xatosi. Asosiylari: 200 Ok, 201 CreatedAtAction, 204 NoContent, 400 BadRequest/ValidationProblem, 401 Unauthorized (kim ekani noma'lum), 403 Forbid (ruxsat yo'q), 404 NotFound, 409 Conflict, 422 — biznes qoidasi, 429 — limit, 500 — kutilmagan xato.
Xatolar — ProblemDetails formatida, izchil. [ProducesResponseType] — hujjat uchun. Production 500 javoblarida ichki tafsilotlar yo'q.
Keyingi bo'lim
49-dars: EF Core nima? — ORM, DbContext, DbSet, qanday ishlaydi