Fehlerbehandlung

Behandeln Sie API-Fehler elegant mit detaillierten Fehlercodes und Nachrichten.

Pro-Funktion

Die Kanman API verwendet Standard-HTTP-Statuscodes und gibt detaillierte Fehlerinformationen im JSON-Format zurück. Dieses konsistente Fehlerformat macht es einfach, Fehler programmgesteuert zu behandeln und Benutzern hilfreiche Fehlermeldungen anzuzeigen. Wenn etwas schief geht, erhalten Sie einen maschinenlesbaren Fehlercode, eine menschenlesbare Nachricht und oft zusätzliche Details, die bei der Fehlerbehebung helfen.

Fehlerantwort-Format

Alle Fehler folgen dieser Struktur:

{
  "error": {
    "code": "error_code",
    "message": "Menschenlesbare Fehlerbeschreibung",
    "details": {}
  }
}
Feld Typ Beschreibung
code string Maschinenlesbarer Fehlercode
message string Menschenlesbare Beschreibung
details object Zusätzlicher Kontext (optional)

HTTP-Statuscodes

Erfolgscodes

Status Bedeutung
200 OK - Anfrage erfolgreich
201 Created - Ressource erstellt

Client-Fehlercodes

Status Bedeutung
400 Bad Request - Ungültige Eingabe
401 Unauthorized - Ungültiger oder fehlender Token
403 Forbidden - Unzureichende Berechtigungen
404 Not Found - Ressource existiert nicht
429 Too Many Requests - Rate-Limit überschritten

Server-Fehlercodes

Status Bedeutung
500 Internal Server Error - Etwas ist schief gelaufen
503 Service Unavailable - Temporärer Ausfall

Häufige Fehlercodes

Authentifizierungsfehler

invalid_token

{
  "error": {
    "code": "invalid_token",
    "message": "Das bereitgestellte API-Token ist ungültig"
  }
}

Ursache: Token existiert nicht oder ist fehlerhaft

Lösung: Überprüfen Sie, ob das Token korrekt ist und nicht widerrufen wurde

token_expired

{
  "error": {
    "code": "token_expired",
    "message": "Das API-Token ist abgelaufen",
    "details": {
      "expired_at": "2024-01-15T00:00:00Z"
    }
  }
}

Ursache: Token nach Ablaufdatum

Lösung: Erstellen Sie ein neues Token

insufficient_scope

{
  "error": {
    "code": "insufficient_scope",
    "message": "Token hat nicht die erforderliche Berechtigung",
    "details": {
      "required": "write",
      "provided": ["read"]
    }
  }
}

Ursache: Token hat keine Berechtigung für diese Operation

Lösung: Erstellen Sie ein Token mit der erforderlichen Berechtigung

Ressourcenfehler

board_not_found

{
  "error": {
    "code": "board_not_found",
    "message": "Board nicht gefunden oder Zugriff verweigert",
    "details": {
      "board_id": "550e8400-e29b-41d4-a716-446655440000"
    }
  }
}

project_not_found

{
  "error": {
    "code": "project_not_found",
    "message": "Projekt nicht gefunden oder Zugriff verweigert"
  }
}

task_not_found

{
  "error": {
    "code": "task_not_found",
    "message": "Aufgabe nicht gefunden oder Zugriff verweigert"
  }
}

Validierungsfehler

invalid_request

{
  "error": {
    "code": "invalid_request",
    "message": "Anfrage-Validierung fehlgeschlagen",
    "details": {
      "fields": {
        "label": "Label ist erforderlich",
        "status": "Status muss 0, 1 oder 2 sein"
      }
    }
  }
}

invalid_uuid

{
  "error": {
    "code": "invalid_uuid",
    "message": "Ungültiges UUID-Format",
    "details": {
      "field": "projectId",
      "value": "keine-uuid"
    }
  }
}

Kontingentfehler

quota_exceeded

{
  "error": {
    "code": "quota_exceeded",
    "message": "Monatliches API-Kontingent überschritten",
    "details": {
      "limit": 12000,
      "used": 12000,
      "reset": "2024-02-01T00:00:00Z"
    }
  }
}

resource_limit_exceeded

{
  "error": {
    "code": "resource_limit_exceeded",
    "message": "Aufgabenlimit für Ihren Tarif erreicht",
    "details": {
      "resource": "tasks",
      "limit": 500,
      "current": 500
    }
  }
}

Fehler behandeln

JavaScript-Beispiel

async function apiRequest(url, options = {}) {
  const response = await fetch(url, {
    ...options,
    headers: {
      'Authorization': `Bearer ${API_TOKEN}`,
      'Content-Type': 'application/json',
      ...options.headers
    }
  });

  const data = await response.json();

  if (!response.ok) {
    const error = new Error(data.error?.message || 'API-Anfrage fehlgeschlagen');
    error.code = data.error?.code;
    error.status = response.status;
    error.details = data.error?.details;
    throw error;
  }

  return data;
}

// Verwendung
try {
  const task = await apiRequest('https://api.kanman.de/v1/tasks/123');
  console.log(task);
} catch (error) {
  switch (error.code) {
    case 'task_not_found':
      console.log('Aufgabe existiert nicht');
      break;
    case 'token_expired':
      console.log('Bitte erneuern Sie Ihr API-Token');
      break;
    case 'quota_exceeded':
      console.log(`Kontingent wird zurückgesetzt am ${error.details.reset}`);
      break;
    default:
      console.error('API-Fehler:', error.message);
  }
}

Python-Beispiel

import requests

class KanmanAPIError(Exception):
    def __init__(self, code, message, status, details=None):
        self.code = code
        self.message = message
        self.status = status
        self.details = details or {}
        super().__init__(message)

def api_request(method, endpoint, **kwargs):
    response = requests.request(
        method,
        f'https://api.kanman.de/v1{endpoint}',
        headers={'Authorization': f'Bearer {API_TOKEN}'},
        **kwargs
    )

    data = response.json()

    if not response.ok:
        error = data.get('error', {})
        raise KanmanAPIError(
            code=error.get('code', 'unknown'),
            message=error.get('message', 'API-Fehler'),
            status=response.status_code,
            details=error.get('details')
        )

    return data

# Verwendung
try:
    task = api_request('GET', '/tasks/123')
except KanmanAPIError as e:
    if e.code == 'task_not_found':
        print('Aufgabe existiert nicht')
    elif e.code == 'quota_exceeded':
        print(f"Kontingent wird zurückgesetzt am {e.details['reset']}")
    else:
        print(f'Fehler: {e.message}')

Retry-Strategie

Für transiente Fehler (5xx) implementieren Sie exponentielles Backoff:

async function apiRequestWithRetry(url, options, maxRetries = 3) {
  for (let attempt = 0; attempt < maxRetries; attempt++) {
    try {
      const response = await fetch(url, options);

      // Client-Fehler nicht erneut versuchen
      if (response.status >= 400 && response.status < 500) {
        return response;
      }

      // Server-Fehler erneut versuchen
      if (response.status >= 500) {
        throw new Error(`Server-Fehler: ${response.status}`);
      }

      return response;
    } catch (error) {
      if (attempt === maxRetries - 1) throw error;

      // Exponentielles Backoff: 1s, 2s, 4s
      const delay = Math.pow(2, attempt) * 1000;
      await new Promise(resolve => setTimeout(resolve, delay));
    }
  }
}

Verwandte Themen

Zuletzt aktualisiert: January 1, 0001

Kanman testen