Tüm blog yazıları

HTTP Durum Kodları (Status Codes)

Bir API'ye istek gönderdiğinizde sunucudan dönen HTTP durum kodları, isteğinizin sonucunu gösterir: Başarılı mı, bir hata mı var, yoksa yönlendirme mi yapıldı? 200 OK'tan 404 Not Found'a kadar tüm kodları ve kategorileri bu yazıda keşfedin.

eminbasbayan7 dk okuma
HTTP durum kodlarını (200, 404, 500) gösteren, programlama arayüzünü temsil eden görsel

Bir API'ye istek yaptığınızda, sunucu size sadece veri göndermez. Aynı zamanda bir durum kodu da döner. Bu kod, isteğinizin nasıl sonuçlandığını söyler: Başarılı mı? Hata mı var? Yetkiniz mi yok?

Muhtemelen 404 hatasını daha önce görmüşsünüzdür. Bu bir durum kodu. Bu makalede tüm durum kodu kategorilerini ve en sık karşılaşılanları öğreneceksiniz.

Durum Kodu Nedir?

HTTP durum kodu, sunucunun isteğinize verdiği 3 haneli sayısal yanıttır. Her kod belirli bir anlam taşır.

metin
İstek: GET /urunler/5
Yanıt: 200 OK
       { "id": 5, "ad": "Laptop", "fiyat": 15000 }

Burada 200 durum kodu, OK ise durum mesajı.

Durum Kodu Kategorileri

Durum kodları 5 kategoriye ayrılır. İlk rakam kategoriyi belirler:

AralıkKategoriAnlam
1xxBilgilendirmeİstek alındı, işleniyor
2xxBaşarıİstek başarıyla tamamlandı
3xxYönlendirmeBaşka bir yere yönlendiriliyorsunuz
4xxİstemci HatasıSizin yaptığınız bir hata var
5xxSunucu HatasıSunucu tarafında bir sorun var

Basit kural:

  • 2 ile başlıyorsa → Her şey yolunda ✓
  • 4 ile başlıyorsa → Siz hata yaptınız ✗
  • 5 ile başlıyorsa → Sunucu hata yaptı ✗

2xx - Başarı Kodları

Bu kodları görmek istiyoruz. Her şeyin yolunda gittiğini gösterir.

200 OK

En yaygın durum kodu. İstek başarılı, yanıt gövdesinde veri var.

metin
GET /kullanicilar/1
→ 200 OK
→ { "id": 1, "isim": "Ali", "email": "ali@mail.com" }

Ne zaman döner:

  • GET isteği başarılı olduğunda
  • PUT/PATCH güncellemesi başarılı olduğunda
  • Genel başarı durumlarında

201 Created

Yeni kayıt oluşturuldu. POST isteğinden sonra sıkça görülür.

metin
POST /urunler
Body: { "ad": "Telefon", "fiyat": 8000 }
→ 201 Created
→ { "id": 42, "ad": "Telefon", "fiyat": 8000 }

Ne zaman döner:

  • Yeni kullanıcı kaydedildiğinde
  • Yeni sipariş oluşturulduğunda
  • Yeni içerik eklendiğinde

204 No Content

Başarılı ama döndürülecek içerik yok. Silme işlemlerinde yaygın.

metin
DELETE /yorumlar/55
→ 204 No Content
→ (boş yanıt)

Ne zaman döner:

  • DELETE başarılı olduğunda
  • Güncelleme yapıldı ama yanıt gerekmediğinde

3xx - Yönlendirme Kodları

İstediğiniz kaynak başka bir yerde. Tarayıcı genellikle otomatik yönlendirir.

301 Moved Permanently

Kalıcı yönlendirme. Kaynak artık başka bir URL'de.

metin
GET http://eski-site.com/sayfa
→ 301 Moved Permanently
→ Location: https://yeni-site.com/sayfa

Örnek: http:// adresine gittiğinizde https:// adresine yönlendirilirsiniz.

302 Found (Temporary Redirect)

Geçici yönlendirme. Kaynak şimdilik başka bir yerde.

metin
GET /promosyon
→ 302 Found
→ Location: /kampanya/yaz-indirimi

Ne zaman döner:

  • Geçici kampanya sayfalarına yönlendirme
  • Bakım sayfasına yönlendirme

304 Not Modified

Değişiklik yok. Önbellekteki (cache) versiyon hâlâ geçerli.

metin
GET /logo.png
If-Modified-Since: Wed, 21 Oct 2024 07:28:00 GMT
→ 304 Not Modified

Tarayıcı, önceden indirdiği dosyayı kullanmaya devam eder. Bant genişliği tasarrufu sağlar.

4xx - İstemci Hata Kodları

Bu kodlar sizin bir hata yaptığınızı gösterir. URL yanlış, yetkiniz yok, veri eksik...

400 Bad Request

Hatalı istek. Sunucu isteğinizi anlayamadı.

metin
POST /kullanicilar
Body: { isim: Ali }  ← Geçersiz JSON (tırnaklar eksik)
→ 400 Bad Request
→ { "hata": "Geçersiz JSON formatı" }

Yaygın nedenler:

  • JSON formatı bozuk
  • Zorunlu alan eksik
  • Veri tipi yanlış (sayı yerine metin gönderilmiş)

401 Unauthorized

Kimlik doğrulama gerekli. Giriş yapmadınız veya token geçersiz.

metin
GET /hesabim
→ 401 Unauthorized
→ { "hata": "Lütfen giriş yapın" }

Yaygın nedenler:

  • Token/API key gönderilmemiş
  • Token süresi dolmuş
  • Yanlış şifre

Not: "Unauthorized" (yetkisiz) adı biraz yanıltıcı. Aslında "Unauthenticated" (kimliği doğrulanmamış) demek istiyor.

403 Forbidden

Erişim yasak. Kimliğiniz doğrulandı ama bu kaynağa yetkiniz yok.

metin
GET /admin/kullanicilar
→ 403 Forbidden
→ { "hata": "Bu sayfaya erişim yetkiniz yok" }

401 vs 403 farkı:

  • 401: Kim olduğunuzu bilmiyoruz → Giriş yapın
  • 403: Kim olduğunuzu biliyoruz ama izniniz yok → Yetkiniz yok

Örnek:

  • Normal kullanıcı, admin paneline erişmeye çalışıyor → 403
  • Giriş yapmamış biri, profil sayfasına erişmeye çalışıyor → 401

404 Not Found

Kaynak bulunamadı. En ünlü hata kodu.

metin
GET /urunler/999999
→ 404 Not Found
→ { "hata": "Ürün bulunamadı" }

Yaygın nedenler:

  • URL yanlış yazılmış
  • Kaynak silinmiş
  • ID mevcut değil

Hoppscotch'ta test:

metin
GET https://jsonplaceholder.typicode.com/posts/999
→ 404 Not Found

405 Method Not Allowed

Metod desteklenmiyor. Bu URL o metodu kabul etmiyor.

metin
DELETE /hakkimizda
→ 405 Method Not Allowed
→ { "hata": "Bu endpoint DELETE metodunu desteklemiyor" }

Örnek:

  • Sadece GET destekleyen bir endpoint'e POST yapmak
  • Salt okunur bir kaynağı silmeye çalışmak

409 Conflict

Çakışma var. İstek, mevcut durumla çelişiyor.

metin
POST /kullanicilar
Body: { "email": "ali@mail.com" }
→ 409 Conflict
→ { "hata": "Bu email adresi zaten kayıtlı" }

Yaygın nedenler:

  • Aynı kullanıcı adı/email ile kayıt
  • Aynı ürün kodunu tekrar ekleme
  • Versiyon çakışması

422 Unprocessable Entity

İşlenemeyen varlık. Sözdizimi doğru ama içerik mantıksız.

metin
POST /siparisler
Body: { "urunId": 5, "adet": -3 }
→ 422 Unprocessable Entity
→ { "hata": "Adet negatif olamaz" }

400 vs 422 farkı:

  • 400: JSON bozuk, parse edilemiyor
  • 422: JSON doğru ama iş kurallarına uymuyor

429 Too Many Requests

Çok fazla istek. Rate limit aşıldı.

metin
GET /api/veriler
→ 429 Too Many Requests
→ { "hata": "Dakikada maksimum 60 istek yapabilirsiniz" }

Ne zaman döner:

  • API limitini aştığınızda
  • Çok hızlı istek yaptığınızda
  • DDoS koruması devreye girdiğinde

5xx - Sunucu Hata Kodları

Bu kodlar sunucunun bir sorun yaşadığını gösterir. Sizin hatanız değil.

500 Internal Server Error

Genel sunucu hatası. Bir şeyler ters gitti ama ne olduğu belli değil.

metin
GET /rapor/olustur
→ 500 Internal Server Error
→ { "hata": "Beklenmeyen bir hata oluştu" }

Yaygın nedenler:

  • Sunucu kodunda bug
  • Veritabanı bağlantı sorunu
  • Beklenmeyen durum (exception)

502 Bad Gateway

Geçersiz ağ geçidi. Sunucu, başka bir sunucudan geçersiz yanıt aldı.

metin
GET /api/harici-servis
→ 502 Bad Gateway

Ne zaman döner:

  • Proxy/load balancer arkasındaki sunucu çöktüğünde
  • Mikroservisler arası iletişim koptuğunda

503 Service Unavailable

Servis kullanılamıyor. Sunucu geçici olarak hizmet veremiyor.

metin
GET /api/veriler
→ 503 Service Unavailable
→ { "hata": "Bakım çalışması devam ediyor" }

Yaygın nedenler:

  • Planlı bakım
  • Sunucu aşırı yüklenmiş
  • Bağımlı servis çalışmıyor

504 Gateway Timeout

Ağ geçidi zaman aşımı. Sunucu, başka bir sunucudan zamanında yanıt alamadı.

metin
GET /api/yavas-islem
→ 504 Gateway Timeout

Ne zaman döner:

  • Uzun süren işlemler zaman aşımına uğradığında
  • Arka uç servis yanıt vermediğinde

Durum Kodlarını Test Etme

Hoppscotch/Postman'da

İstek yaptığınızda yanıt bölümünde durum kodunu görebilirsiniz:

  • Yeşil: 2xx (başarı)
  • Sarı/Turuncu: 3xx (yönlendirme)
  • Kırmızı: 4xx, 5xx (hata)

httpstat.us ile Test

Bu site, istediğiniz durum kodunu döndürür:

metin
GET https://httpstat.us/200  → 200 OK
GET https://httpstat.us/404  → 404 Not Found
GET https://httpstat.us/500  → 500 Internal Server Error

Hata yönetimi kodunuzu test etmek için kullanışlı.

Özet Tablosu

KodİsimAnlamÖrnek Durum
200OKBaşarılıVeri alındı
201CreatedOluşturulduYeni kayıt eklendi
204No Contentİçerik yokSilme başarılı
301Moved PermanentlyKalıcı taşındıSite taşındı
304Not ModifiedDeğişmediCache geçerli
400Bad RequestHatalı istekJSON bozuk
401UnauthorizedYetkisizGiriş yapılmamış
403ForbiddenYasakYetki yok
404Not FoundBulunamadıSayfa yok
405Method Not AllowedMetod izinsizPOST yasak
409ConflictÇakışmaEmail kayıtlı
422Unprocessable EntityİşlenemezGeçersiz değer
429Too Many RequestsÇok fazla istekLimit aşıldı
500Internal Server ErrorSunucu hatasıBug
502Bad GatewayGeçersiz ağ geçidiProxy hatası
503Service UnavailableServis dışıBakımda
504Gateway TimeoutZaman aşımıYanıt gelmedi

Sırada Ne Var?

HTTP durum kodlarını öğrendik. Artık bir API yanıtını tam olarak anlayabilirsiniz.

Bir sonraki makalede Query String (sorgu dizisi) kullanımını detaylı inceleyeceğiz.

JavaScript Classes ile pratik uygulamalar, metotlar arası iletişim ve gerçek dünya kod örnekleri
JavaScript Dersleri9 dk okuma

JavaScript Classes - Pratik Uygulamalar

JavaScript class'ları ile pratik uygulamalara geçin! Metotlar arası iletişimden constructor'da metot çağırmaya, kod tekrarını azaltmaktan gerçek dünya senaryolarına kadar class kullanımının inceliklerini keşfedin. Kendi alışveriş sepeti örneğinizle bilginizi pekiştirin.

Yazıyı oku
JavaScript class yapısını gösteren bir kod örneği, ES6 ile modern nesne oluşturma
JavaScript Dersleri9 dk okuma

JavaScript Classes

ES6 ile JavaScript'e gelen class yapısı sayesinde nesne oluşturmak artık çok daha kolay ve düzenli! Constructor function karmaşasından kurtulup, okunabilir ve yönetilebilir kodlar yazmak isteyenler için modern JavaScript'in temel taşı olan class'ları tüm detaylarıyla keşfedin. Bu rehberle nesne şabl

Yazıyı oku
JavaScript kodunda Constructor Function ve new keyword'ü ile nesne oluşturma örnekleri
JavaScript Dersleri8 dk okuma

Constructor Functions ve new Keyword

Factory Function'ların hafıza israfı sorununa Constructor Function'lar ve new keyword'ü ile son verin! Metotları paylaştırarak JavaScript objelerini daha verimli nasıl oluşturacağınızı, new'in perde arkasında neler yaptığını ve prototype sisteminin gücünü bu rehberde keşfedin.

Yazıyı oku

Çerez tercihlerin

Platformun çalışması için zorunlu çerezler kullanıyoruz. İzin verirsen anonim kullanım verilerini ölçüyoruz. Ayrıntıları incele