Berk Akademi
Birebir ders başvurusu Ücretsiz ön görüşme Ana Sayfa

HTTP 204 No Content: response.json() Hatası Nasıl Çözülür?

http-204-no-content-response-json-hatasi
Bu yazıda neler var?
  1. HTTP 204 No Content neden response.json() ile okunamaz?
  2. Hatalı fetch örneği ve 204 için çalışan çözüm
  3. Güvenli yanıt işleme için karar ağacı: status code, Content-Type ve body
  4. Silme ve güncelleme isteklerinde 204 ile JSON yanıtı ayırmak
  5. Fetch yanıtlarında hata yönetimi için pratik kontrol listesi
  6. Sık Sorulan Sorular

HTTP 204 No Content yanıtı, isteğin başarıyla işlendiğini ancak sunucunun istemciye okunacak bir yanıt gövdesi göndermediğini belirtir. Bu nedenle boş bir response body üzerinde doğrudan response.json() çağırmak, çoğu durumda JSON ayrıştırma hatasına yol açar. Çözüm, yanıtın durum kodunu kontrol ederek 204 için veri ayrıştırmadan başarı akışına geçmektir.

HTTP 204 No Content neden response.json() ile okunamaz?

HTTP durum kodu 204 No Content, sunucunun isteği başarıyla tamamladığını fakat yanıt içinde ek içerik bulunmadığını ifade eder. HTTP standardına göre 204 yanıtı içerik veya yanıt gövdesi taşımaz; yanıt, başlık bölümünün sona ermesiyle tamamlanır.

fetch() ile aldığın yanıt nesnesindeki response.json() metodu, response body içeriğini JSON metnine dönüştürmeye çalışır. Örneğin gövdede {"success": true} varsa bu içerik geçerli bir JSON olarak ayrıştırılabilir. Ancak 204 yanıtında ayrıştırılacak metin bulunmadığı için işlem genellikle Unexpected end of JSON input benzeri bir hata üretir.

Buradaki önemli ayrım şudur: 204 bir başarısızlık kodu değildir. İstek başarılı olmuş olabilir; yalnızca sunucu, istemciye ayrıca veri göndermeyi gerekli görmemiştir. Özellikle bir kaydı silme işleminde sunucu, silinen kaydın tamamını yeniden göndermek yerine yalnızca işlemin tamamlandığını 204 status code üzerinden bildirebilir. Bazı güncelleme işlemlerinde de aynı yaklaşım kullanılabilir.

Dolayısıyla istemci tarafında şu iki durumu birbirinden ayırman gerekir:

  • 204 yanıtı: İstek başarılıdır, fakat okunacak JSON verisi yoktur.
  • JSON içeren yanıt: Yanıt gövdesinde veri vardır ve uygun koşullarda response.json() çağrılabilir.

Hatalı fetch örneği ve 204 için çalışan çözüm

Hatalı fetch örneği ve 204 için çalışan çözüm

Aşağıdaki örnekte her başarılı yanıtta koşulsuz olarak response.json() çağrılıyor:

fetch("/api/users/42", {
  method: "DELETE"
})
  .then(response => {
    if (!response.ok) {
      throw new Error(`İstek başarısız: ${response.status}`);
    }

    // Hatalı: 204 yanıtında JSON gövdesi yoktur.
    return response.json();
  })
  .then(data => {
    console.log("Sunucudan gelen veri:", data);
  })
  .catch(error => {
    console.error("Hata:", error.message);
  });

Sunucu silme işlemini 204 ile tamamladığında bu kodun ilk then bloğunda response.ok değeri doğru olabilir. Ancak hemen ardından çağrılan response.json(), boş gövdeyi JSON olarak ayrıştıramadığı için zincir catch bloğuna düşer. Yanıt 200 gibi başarılı bir durum koduyla birlikte geçerli bir JSON gövdesi taşısaydı kod çalışır ve data değişkenine ayrıştırılmış nesne aktarılırdı.

204 yanıtını ayrı ele alan çözümde, JSON ayrıştırmadan önce status code kontrol edilir:

fetch("/api/users/42", {
  method: "DELETE"
})
  .then(response => {
    if (!response.ok) {
      throw new Error(`İstek başarısız: ${response.status}`);
    }

    if (response.status === 204) {
      // Başarılı işlem; okunacak response body yok.
      return null;
    }

    // 204 dışındaki başarılı yanıtlarda JSON bekleniyor.
    return response.json();
  })
  .then(data => {
    if (data === null) {
      console.log("Kayıt başarıyla silindi.");
      return;
    }

    console.log("Sunucudan gelen veri:", data);
  })
  .catch(error => {
    console.error("Hata:", error.message);
  });

Bu sürümde 204 alındığında program doğrudan başarı akışına geçer ve boş gövdeyi okumaya çalışmaz. JSON içeren başka bir başarılı yanıtta ise response.json() çağrılır. fetch, Promise ve asenkron yanıt işleme mantığını adım adım pekiştirmek için asenkron programlama odaklı video eğitimlerinden yararlanabilirsin.

Güvenli yanıt işleme için karar ağacı: status code, Content-Type ve body

Güvenli yanıt işleme için karar ağacı: status code, Content-Type ve body

fetch() yanıtını güvenli biçimde işlemek için her durumda doğrudan response.json() çağırma. Önce yanıtın durum kodunu, ardından Content-Type başlığını ve son olarak gövdenin gerçekten veri içerip içermediğini kontrol et. 204 No Content yanıtında gövde bulunmadığı için JSON ayrıştırma aşamasına geçmeden işlemi sonlandırmalısın.

Kontrol sırası Sorulacak soru Uygulanacak işlem Beklenen sonuç
1. Status code İstek başarılı mı, istemci hatası mı, sunucu hatası mı? response.ok ve gerektiğinde response.status değerini kontrol et. Başarı ve hata akışları birbirinden ayrılır.
2. Body bekleniyor mu? Yanıt kodu 204 gibi gövdesiz bir durumu mu gösteriyor? JSON ayrıştırmadan null veya benzeri kontrollü bir sonuç döndür. Boş gövdede response.json() hatası oluşmaz.
3. Content-Type Yanıtın medya türü JSON olduğunu belirtiyor mu? response.headers.get("Content-Type") değerini kontrol et; JSON türü değilse farklı işleme akışına geç. HTML, metin veya başka bir veri yanlışlıkla JSON gibi ayrıştırılmaz.
4. Body içeriği JSON bekleniyor ama gövde boş mu? Önce response.text() ile metni al, trim() sonrasında boşsa veri yok kabul et. Boş body ile geçersiz JSON birbirinden ayrılır.
5. JSON ayrıştırma Gövde dolu olsa da içerik geçerli JSON mu? JSON.parse() işlemini try/catch içinde çalıştır. Geçersiz JSON kontrollü bir hataya dönüştürülür.

Bu sırayı kodla şöyle uygulayabilirsin:

async function guvenliJsonOku(response) {
  if (!response.ok) {
    throw new Error(`HTTP hatası: ${response.status}`);
  }

  if (response.status === 204) {
    return null;
  }

  const contentType = response.headers.get("Content-Type") || "";
  const body = await response.text();

  if (!body.trim()) {
    return null;
  }

  if (!contentType.toLowerCase().includes("application/json")) {
    throw new Error("Yanıt JSON türünde değil.");
  }

  try {
    return JSON.parse(body);
  } catch {
    throw new Error("Yanıt geçerli JSON içermiyor.");
  }
}

Buradaki yaklaşımda boş body, JSON olmayan Content-Type ve geçersiz JSON ayrı dallarda ele alınır. Response.json() gövdeyi okuyup JSON olarak ayrıştırdığı için ayrıştırılamayan bir gövde SyntaxError oluşturabilir; bu nedenle kontrolü çağrıdan önce yapmak daha öngörülebilirdir.

Silme ve güncelleme isteklerinde 204 ile JSON yanıtı ayırmak

Silme isteğinde sunucu 204 No Content döndürüyorsa başarı bilgisi gövdede değil, status code içindedir. İstemci bu durumda yanıt verisi beklememeli ve response.json() çağırmamalıdır.

const response = await fetch("/api/kayit/42", {
  method: "DELETE"
});

if (response.status === 204) {
  console.log("Kayıt başarıyla silindi.");
} else if (!response.ok) {
  throw new Error(`Silme başarısız: ${response.status}`);
}

Bu akışın beklenen davranışı, silme başarılı olduğunda kullanıcı arayüzünü güncellemek ve gövde olmadığı için veri ayrıştırmamaktır.

Güncelleme isteğinde ise API sözleşmesine bağlı olarak iki farklı başarı biçimi bulunabilir: Sunucu yalnızca işlemin tamamlandığını bildirerek 204 döndürebilir veya güncellenen kaydı JSON gövdesinde gönderebilir. İkinci durumda istemci JSON verisini okuyabilir:

const response = await fetch("/api/kayit/42", {
  method: "PUT",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({ ad: "Yeni ad" })
});

if (!response.ok) {
  throw new Error(`Güncelleme başarısız: ${response.status}`);
}

const kayit = await guvenliJsonOku(response);
console.log(kayit);

Burada istemcinin davranışını varsayım değil, API sözleşmesi belirlemelidir. Her başarılı yanıtı JSON kabul etmek boş veri hatasına; her yanıtı gövdesiz kabul etmek ise güncellenen kaydın kaybolmasına yol açabilir. Ayrıca beklenmeyen Content-Type ve geçersiz JSON durumları da aynı nedenle ayrı kontrol edilmelidir.

Fetch yanıtlarında hata yönetimi için pratik kontrol listesi

Fetch kodunu güvenli hâle getirirken yalnızca response.ok değerine güvenme. Başarılı bir HTTP yanıtı, her zaman JSON gövdesi bulunduğu anlamına gelmez. Özellikle 204 No Content durumunda önce yanıtın durum kodunu, ardından başlığını ve son olarak gövdesini kontrol et.

  1. Status code kontrolü: 204 durumunu JSON ayrıştırmadan önce ele al. Diğer beklenmeyen durum kodları için anlamlı bir hata mesajı üret.
  2. response.ok kontrolü: Bu değer, durum kodunun genel olarak başarılı olup olmadığını gösterir; yanıt gövdesinde JSON bulunduğunu garanti etmez.
  3. Content-Type kontrolü: response.json() çağırmadan önce response.headers.get("content-type") sonucunun JSON içerik türünü gösterip göstermediğini kontrol et.
  4. Boş body ihtimali: Başarılı yanıtların bazıları boş gövde taşıyabilir. Boş bir metni JSON olarak ayrıştırmaya çalışma.
  5. JSON hatalarını yakalama: response.json() çağrısını uygun bir try...catch akışına al. Geçersiz veya eksik JSON, ağ hatasından farklı bir sorundur.
  6. API sözleşmesini inceleme: Silme, güncelleme veya oluşturma isteğinin JSON mu, boş yanıt mı döndürdüğünü API dokümantasyonundan kontrol et.

Bu kontrolleri uygularken aşağıdaki genel yaklaşım kullanılabilir:

if (response.status === 204) {
  return null;
}

if (!response.ok) {
  throw new Error(`İstek başarısız: ${response.status}`);
}

const contentType = response.headers.get("content-type") || "";

if (!contentType.includes("application/json")) {
  throw new Error("Beklenen JSON yanıtı alınamadı.");
}

try {
  return await response.json();
} catch {
  throw new Error("Yanıt JSON olarak ayrıştırılamadı.");
}

Python tarafında da benzer bir durum vardır: boş bir response body’sini JSON gibi ayrıştırmaya çalışmak hata doğurabilir. Ancak uygulanacak çözüm, kullandığın HTTP istemcisine ve API’nin yanıt sözleşmesine göre değişir. Bu nedenle önce durum kodunu ve gövdenin gerçekten var olup olmadığını kontrol etmek gerekir. JavaScript’teki hata yönetimi mantığını farklı dillerde de uygulamak için ücretsiz bilgi testlerinden yararlanarak temel kavramlarını sınayabilirsin.

Kendi fetch kodunu şu senaryolarla test et:

  • 204 durum kodu ve boş body
  • 200 durum kodu, JSON Content-Type başlığı ve geçerli JSON
  • 200 durum kodu, fakat boş body
  • 200 durum kodu ve JSON olmayan Content-Type
  • 404 veya 500 gibi beklenmeyen bir durum kodu
  • JSON başlığı bulunan fakat bozuk JSON içeren bir body

Sık Sorulan Sorular

204 No Content yanıtında response.json() neden hata verir?

204 yanıtı, sunucunun başarılı bir işlem sonucunda response body göndermediğini belirtir. response.json() ise gövdede ayrıştırılabilecek JSON bekler. Body boş olduğunda JSON ayrıştırma işlemi başarısız olabilir.

response.json() çağırmadan önce Content-Type nasıl kontrol edilir?

response.headers.get("content-type") ifadesiyle başlık okunabilir. Sonuç application/json içeriyorsa JSON ayrıştırma denenebilir. Ancak bu kontrol tek başına yeterli değildir; body yine boş veya geçersiz olabilir.

204 dönen silme isteğinde başarılı işlemi nasıl anlarım?

response.status === 204 kontrolüyle 204 yanıtı açıkça ele alınır. Bu durumda JSON okumadan işlemin başarılı kabul edilmesi gerekir. Ayrıca genel hata durumlarını yakalamak için response.ok kontrolü de yapılmalıdır.

API bazen JSON, bazen boş yanıt döndürüyorsa fetch kodu nasıl yazılmalı?

Önce durum kodu kontrol edilmeli, ardından içerik türü incelenmelidir. 204 veya boş body durumunda null gibi belirlenmiş bir sonuç döndürülmeli; JSON içerik türü ve dolu body varsa response.json() çağrılmalıdır. Ayrıştırma hataları da try...catch ile yönetilmelidir.

Sağlam bir fetch akışı; başarılı durumu, yanıt biçimini ve boş gövde ihtimalini birlikte değerlendirir. Böylece kodun yalnızca ideal API yanıtlarında değil, gerçek kullanım senaryolarında da daha öngörülebilir çalışır.

Bu içerik aradığın cevabı verdi mi?
Yanıtın, hangi yazıları geliştirmemiz gerektiğini anlamamıza yardımcı olur.
Bu içeriğin üretilmesinde yapay zeka araçlarından destek alınmıştır.

Bu konudan sonra ne okuyabilirsin?

Tüm yazılar

İlgili Eğitimler

Berk Keskin, yazılım geliştirici ve eğitmen
Yazar

Berk Keskin Kimdir?

Yazılıma 12 yaşında başladı; İzmir Ekonomi Üniversitesi'ni bölüm birincisi ve yüksek şeref öğrencisi olarak tamamladı. Bugün yalnızca eğitim vermekle kalmıyor, sektörde aktif olarak yazılım projeleri geliştiriyor ve gerçek dünya deneyimini birebir derslerine taşıyor. Ezberden uzak, mühendislik zihniyetini merkeze alan sürdürülebilir öğrenme sistemleri tasarlayarak sorgulayan, üreten ve problem çözebilen yeni nesil yazılımcılar yetiştiriyor.

Sektörel Deneyim & Projeler

  • Ticarify Entegrasyon Yazılım logosu CEO Ticarify Entegrasyon YazılımPazaryerleri ve e-ticaret sitelerine otomatik e-fatura kesimi, sipariş ve kargo takibi hizmetleri sunan e-Dönüşüm platformunun API mimarisini ve yazılım ekibini yönetmektedir.
  • Benim Düğünüm logosu CEO Benim DüğünümDijital etkinlik ve anı paylaşım platformu.
  • Siberdizayn logosu Yazılım Ekibi Lideri SiberdizaynYüksek anlık oyuncu trafiğine sahip oyun kontrol panelleri ve sunucu altyapıları geliştiren yazılım ekibine liderlik etmektedir.
  • MEDYOGRAFYA 360° Dijital Çözümler logosu Dijital Strateji Lideri MEDYOGRAFYA 360° Dijital ÇözümlerŞirketlerin dijital çözümlerde uzun vadede nasıl ilerlemesi gerektiği ve dijital dönüşüm süreçlerinin yönetilmesine destek olmaktadır.
  • İzmir Ekonomi Üniversitesi logosu Danışma Kurulu Üyesi İzmir Ekonomi ÜniversitesiMezun olduğu üniversitesinde, Bilgisayar Programcılığı bölümünün akademik müfredatını güncel sektör ihtiyaçlarına göre şekillendirmek adına Danışma Kurulu'nda görev almaktadır.
WhatsApp Hemen Ara