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

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

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.
- Status code kontrolü:
204durumunu JSON ayrıştırmadan önce ele al. Diğer beklenmeyen durum kodları için anlamlı bir hata mesajı üret. response.okkontrolü: Bu değer, durum kodunun genel olarak başarılı olup olmadığını gösterir; yanıt gövdesinde JSON bulunduğunu garanti etmez.- Content-Type kontrolü:
response.json()çağırmadan önceresponse.headers.get("content-type")sonucunun JSON içerik türünü gösterip göstermediğini kontrol et. - 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.
- JSON hatalarını yakalama:
response.json()çağrısını uygun birtry...catchakışına al. Geçersiz veya eksik JSON, ağ hatasından farklı bir sorundur. - 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:
204durum kodu ve boş body200durum kodu, JSONContent-Typebaşlığı ve geçerli JSON200durum kodu, fakat boş body200durum kodu ve JSON olmayanContent-Type404veya500gibi 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.