Ana içeriğe geç

Hata Kodları

Bu sayfa, SeoAuthor API'yi kullanırken karşılaşabileceğiniz tüm hata kodlarını ve çözüm yollarını açıklamaktadır.

🚨 HTTP Status Kodları

2xx - Başarılı İşlemler

KodDurumAçıklama
200OKİşlem başarıyla tamamlandı
201CreatedKaynak başarıyla oluşturuldu

4xx - İstemci Hataları

400 Bad Request

Açıklama: Gönderilen istek geçersiz veya hatalı parametreler içeriyor.

Yaygın Sebepler:

  • Zorunlu alanların eksik olması
  • Geçersiz veri formatı
  • Geçersiz JSON yapısı
  • Karakter limiti aşımı

Örnek Yanıt:

{
"error": "ValidationError",
"message": "Baslik alanı zorunludur ve boş bırakılamaz",
"statusCode": 400,
"details": {
"field": "baslik",
"code": "REQUIRED",
"value": ""
}
}

Çözüm:

  • Tüm zorunlu alanları doldurun
  • Veri formatlarını kontrol edin
  • API dokümantasyonunu tekrar inceleyin

401 Unauthorized

Açıklama: Kimlik doğrulama başarısız veya token geçersiz.

Yaygın Sebepler:

  • Authorization header eksik
  • Geçersiz access token
  • Süresi dolmuş token
  • Yanlış token formatı

Örnek Yanıt:

{
"error": "Unauthorized",
"message": "Geçersiz veya süresi dolmuş token",
"statusCode": 401,
"code": "TOKEN_EXPIRED"
}

Çözüm:

// Token yenileme
try {
await refreshToken();
// İsteği tekrar dene
} catch (error) {
// Kullanıcıyı giriş sayfasına yönlendir
redirectToLogin();
}

403 Forbidden

Açıklama: İsteğiniz geçerli ancak bu işlemi yapmaya yetkiniz yok.

Yaygın Sebepler:

  • Yetersiz hesap bakiyesi
  • Erişim izni olmayan kaynak
  • Hesap kısıtlaması

Örnek Yanıt:

{
"error": "Forbidden",
"message": "Yetersiz bakiye. Makale oluşturmak için minimum 25 TL gerekli.",
"statusCode": 403,
"code": "INSUFFICIENT_BALANCE",
"requiredBalance": 25.0,
"currentBalance": 10.5
}

Çözüm:

// Bakiye kontrolü
const balance = await getCurrentBalance();
if (balance.amount < requiredAmount) {
alert("Yetersiz bakiye. Lütfen hesabınıza bakiye yükleyin.");
}

404 Not Found

Açıklama: İstenen kaynak bulunamadı.

Yaygın Sebepler:

  • Yanlış endpoint URL'i
  • Var olmayan kaynak ID'si
  • Silinmiş içerik

Örnek Yanıt:

{
"error": "NotFound",
"message": "Makale bulunamadı",
"statusCode": 404,
"code": "ARTICLE_NOT_FOUND",
"requestedId": 12345
}

409 Conflict

Açıklama: İstek mevcut kaynak durumuyla çakışıyor.

Yaygın Sebepler:

  • Aynı başlıkla makale zaten var
  • Eşzamanlı işlem çakışması

Örnek Yanıt:

{
"error": "Conflict",
"message": "Bu başlıkla bir makale zaten mevcut",
"statusCode": 409,
"code": "DUPLICATE_TITLE",
"existingArticleId": 98765
}

422 Unprocessable Entity

Açıklama: İstek formatı doğru ancak iş mantığı kurallarına aykırı.

Yaygın Sebepler:

  • Konu limiti aşımı
  • Geçersiz parametre kombinasyonu

Örnek Yanıt:

{
"error": "UnprocessableEntity",
"message": "Konu limit aşımı",
"statusCode": 422,
"code": "TOPIC_LIMIT_EXCEEDED",
"currentCount": 15,
"maxLimit": 10
}

429 Too Many Requests

Açıklama: Rate limit aşıldı, çok fazla istek yapıldı.

Örnek Yanıt:

{
"error": "TooManyRequests",
"message": "Rate limit aşıldı. 60 saniye sonra tekrar deneyin.",
"statusCode": 429,
"code": "RATE_LIMIT_EXCEEDED",
"retryAfter": 60,
"limit": 100,
"remaining": 0,
"resetTime": 1692789660
}

Çözüm:

// Exponential backoff with retry
async function apiCallWithRetry(apiCall, maxRetries = 3) {
for (let i = 0; i < maxRetries; i++) {
try {
return await apiCall();
} catch (error) {
if (error.status === 429) {
const waitTime = error.retryAfter || Math.pow(2, i) * 1000;
console.log(`Rate limit hit, waiting ${waitTime}ms`);
await new Promise((resolve) => setTimeout(resolve, waitTime));
continue;
}
throw error;
}
}
throw new Error("Max retries exceeded");
}

5xx - Sunucu Hataları

500 Internal Server Error

Açıklama: Sunucu tarafında beklenmeyen bir hata oluştu.

Örnek Yanıt:

{
"error": "InternalServerError",
"message": "Sunucu hatası oluştu",
"statusCode": 500,
"code": "INTERNAL_ERROR",
"requestId": "req_123456789"
}

Çözüm:

  • İsteği birkaç dakika sonra tekrar deneyin
  • Sorun devam ederse teknik destek ile iletişime geçin

502 Bad Gateway

Açıklama: Gateway hatası, upstream servis yanıt vermiyor.

503 Service Unavailable

Açıklama: Servis geçici olarak kullanılamıyor.

Örnek Yanıt:

{
"error": "ServiceUnavailable",
"message": "Sistem bakımda. Tahmini süre: 30 dakika",
"statusCode": 503,
"code": "MAINTENANCE_MODE",
"estimatedDuration": 1800
}

🔍 Özel Hata Kodları

Authentication Hataları

KodAçıklamaÇözüm
INVALID_CREDENTIALSYanlış email/şifreBilgilerinizi kontrol edin
TOKEN_EXPIREDToken süresi dolmuşToken yenileyin
TOKEN_INVALIDToken formatı hatalıYeni token alın
REFRESH_TOKEN_EXPIREDRefresh token süresi dolmuşYeniden giriş yapın

Makale Hataları

KodAçıklamaÇözüm
TITLE_TOO_LONGBaşlık çok uzun255 karakter sınırına uyun
TITLE_TOO_SHORTBaşlık çok kısaEn az 10 karakter girin
INVALID_TONEGeçersiz yazım tonu1-5 arası değer kullanın
INVALID_SIZEGeçersiz makale boyutu1-4 arası değer kullanın
DUPLICATE_TITLEBaşlık zaten varFarklı başlık deneyin

Bakiye Hataları

KodAçıklamaÇözüm
INSUFFICIENT_BALANCEYetersiz bakiyeHesabınıza bakiye yükleyin
PAYMENT_REQUIREDÖdeme gerekliÖdeme bilgilerinizi güncelleyin

Konu Hataları

KodAçıklamaÇözüm
TOPIC_LIMIT_EXCEEDEDKonu limiti aşıldıMevcut konuları düzenleyin
TOPIC_NOT_FOUNDKonu bulunamadıGeçerli konu ID'si kullanın
DUPLICATE_TOPICKonu zaten varFarklı konu adı deneyin

🛠️ Hata Yönetimi Best Practices

1. Comprehensive Error Handling

class APIErrorHandler {
static async handleError(error, context = {}) {
console.error("API Error:", error, context);

switch (error.status) {
case 400:
return this.handleValidationError(error);
case 401:
return this.handleAuthError(error);
case 403:
return this.handleForbiddenError(error);
case 429:
return this.handleRateLimitError(error);
case 500:
return this.handleServerError(error);
default:
return this.handleUnknownError(error);
}
}

static handleValidationError(error) {
const message = error.details?.field
? `${error.details.field} alanında hata: ${error.message}`
: error.message;

return {
type: "validation",
message,
field: error.details?.field,
userAction: "Lütfen form bilgilerinizi kontrol edin",
};
}

static async handleAuthError(error) {
if (error.code === "TOKEN_EXPIRED") {
try {
await refreshToken();
return {
type: "auth",
message: "Token yenilendi, tekrar deneyin",
retry: true,
};
} catch {
return {
type: "auth",
message: "Oturum süresi doldu",
action: "redirect_login",
};
}
}

return {
type: "auth",
message: "Kimlik doğrulama hatası",
action: "redirect_login",
};
}

static handleRateLimitError(error) {
const waitTime = error.retryAfter || 60;
return {
type: "rate_limit",
message: `Çok fazla istek. ${waitTime} saniye bekleyin.`,
waitTime,
retry: true,
};
}
}

2. User-Friendly Error Messages

const ERROR_MESSAGES = {
tr: {
INSUFFICIENT_BALANCE: "Hesabınızda yeterli bakiye bulunmamaktadır.",
TOKEN_EXPIRED: "Oturum süreniz dolmuştur. Lütfen tekrar giriş yapın.",
TITLE_TOO_LONG: "Makale başlığı çok uzun. Lütfen kısaltın.",
NETWORK_ERROR: "Bağlantı hatası. İnternet bağlantınızı kontrol edin.",
SERVER_ERROR: "Sunucu hatası. Lütfen daha sonra tekrar deneyin.",
},
};

function getUserFriendlyMessage(errorCode, language = "tr") {
return ERROR_MESSAGES[language][errorCode] || "Beklenmeyen bir hata oluştu.";
}

3. Retry Logic

class RetryManager {
static async executeWithRetry(operation, options = {}) {
const {
maxRetries = 3,
baseDelay = 1000,
maxDelay = 10000,
retryCondition = (error) => error.status >= 500 || error.status === 429,
} = options;

for (let attempt = 0; attempt <= maxRetries; attempt++) {
try {
return await operation();
} catch (error) {
if (attempt === maxRetries || !retryCondition(error)) {
throw error;
}

const delay = Math.min(baseDelay * Math.pow(2, attempt), maxDelay);

console.log(`Attempt ${attempt + 1} failed, retrying in ${delay}ms`);
await new Promise((resolve) => setTimeout(resolve, delay));
}
}
}
}

4. Error Logging

class ErrorLogger {
static log(error, context) {
const logEntry = {
timestamp: new Date().toISOString(),
error: {
message: error.message,
status: error.status,
code: error.code,
stack: error.stack,
},
context,
userAgent: navigator.userAgent,
url: window.location.href,
};

// Production'da gerçek logging servisi kullanın
console.error("API Error Log:", logEntry);

// Kritik hataları sunucuya gönder
if (error.status >= 500) {
this.sendToLoggingService(logEntry);
}
}

static async sendToLoggingService(logEntry) {
try {
await fetch("/api/logs", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(logEntry),
});
} catch (err) {
console.error("Failed to send log:", err);
}
}
}

📋 Debug Checklist

Hata aldığınızda kontrol etmeniz gerekenler:

✅ Temel Kontroller

  • API endpoint URL'i doğru mu?
  • HTTP method doğru mu?
  • Content-Type header'ı ayarlandı mı?
  • Authorization header'ı var mı?

✅ Authentication

  • Access token geçerli mi?
  • Token süresi dolmamış mı?
  • Bearer prefix kullanıldı mı?

✅ Request Data

  • JSON formatı geçerli mi?
  • Zorunlu alanlar dolu mu?
  • Veri tipleri doğru mu?
  • Karakter limitleri aşılmamış mı?

✅ Network

  • İnternet bağlantısı var mı?
  • Firewall/proxy engeli var mı?
  • DNS çözümleme çalışıyor mu?

🆘 Destek Alma

Hata çözümlenemezse:

  1. Hata kodunu not alın
  2. Request/Response detaylarını kaydedin
  3. Teknik destek ile iletişime geçin
  4. Request ID'yi paylaşın (varsa)

Destek Kanalları:

Hızlı Çözüm

En yaygın hatalar authentication ve validation hataları. İlk olarak token'ınızın geçerliliğini ve gönderdiğiniz verilerin formatını kontrol edin.

Rate Limiting

API çağrı limitlerini aşmamak için isteklerinizi throttle edin ve retry logic kullanın.

Güvenlik

Hata mesajlarında hassas bilgileri (şifreler, token'lar) log etmeyin veya kullanıcıya göstermeyin.