HTTP Status kodlar — 200, 201, 400, 401, 404, Ok(), BadRequest()

~15 daq · .NET Backend · Web API — Controller va Routing

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