alltools.one
API‱
2025-06-05
‱
7 min
‱
alltools.one Team
APIRESTJSONResponse FormatBest Practices

API-Antwortformate: Best Practices fĂŒr konsistente APIs

Inkonsistente API-Antworten gehören zu den hĂ€ufigsten Beschwerden von Frontend-Entwicklern. Wenn jeder Endpunkt Daten in einer anderen Struktur zurĂŒckgibt, wird der Client-Code mit SonderfĂ€llen ĂŒbersĂ€t. Ein konsistentes Antwortformat verbessert die Entwicklererfahrung, reduziert Fehler und macht Ihre API selbstdokumentierend.

Der Response-Envelope

Verpacken Sie jede Antwort in eine konsistente Struktur:

Erfolg (Einzelne Ressource)

{
  "data": {
    "id": "user_123",
    "name": "Alice",
    "email": "alice@example.com",
    "createdAt": "2024-01-15T10:30:00Z"
  },
  "meta": {
    "requestId": "req_abc123"
  }
}

Erfolg (Sammlung)

{
  "data": [
    { "id": "user_123", "name": "Alice" },
    { "id": "user_456", "name": "Bob" }
  ],
  "meta": {
    "total": 142,
    "page": 1,
    "perPage": 20,
    "requestId": "req_def456"
  }
}

Fehler

{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "Request validation failed",
    "details": [
      { "field": "email", "message": "Invalid email format" }
    ]
  },
  "meta": {
    "requestId": "req_ghi789"
  }
}

Das SchlĂŒsselprinzip: Clients prĂŒfen immer auf data oder error auf der obersten Ebene. Mischen Sie niemals Erfolgsdaten und Fehlerinformationen in derselben Antwort.

Validieren Sie Ihr Antwortformat mit unserem JSON-Validator.

HTTP-Statuscodes

Verwenden Sie Statuscodes korrekt — sie sind das Erste, was Clients prĂŒfen:

Erfolgscodes

CodeWann
200 OKGET erfolgreich, PUT/PATCH erfolgreich
201 CreatedPOST hat eine Ressource erstellt
204 No ContentDELETE erfolgreich (kein Body)

Client-Fehlercodes

CodeWann
400 Bad RequestFehlerhafte Anfrage-Syntax
401 UnauthorizedFehlende oder ungĂŒltige Authentifizierung
403 ForbiddenAuthentifiziert, aber nicht autorisiert
404 Not FoundRessource existiert nicht
409 ConflictRessourcenzustandskonflikt (Duplikat)
422 UnprocessableGĂŒltige Syntax, aber semantische Fehler
429 Too Many RequestsRatenlimit ĂŒberschritten

Server-Fehlercodes

CodeWann
500 Internal Server ErrorUnerwarteter Serverfehler
502 Bad GatewayUpstream-Dienstausfall
503 Service UnavailableVorĂŒbergehende Überlastung oder Wartung

Fehlerantwort-Design

Gute Fehlerantworten helfen Entwicklern beim schnellen Debuggen:

{
  "error": {
    "code": "RESOURCE_NOT_FOUND",
    "message": "User with ID 'user_999' not found",
    "details": [],
    "documentationUrl": "https://api.example.com/docs/errors#RESOURCE_NOT_FOUND"
  },
  "meta": {
    "requestId": "req_xyz789",
    "timestamp": "2024-01-15T10:30:00Z"
  }
}

Regeln:

  • code ist maschinenlesbar (konstanter String, kein HTTP-Status)
  • message ist menschenlesbar (kann geĂ€ndert werden, ohne Clients zu beeintrĂ€chtigen)
  • details liefert feldspezifische Fehler bei Validierungsproblemen
  • requestId ermöglicht dem Support-Team, die Anfrage in den Logs nachzuverfolgen

Paginierungsmuster

Offset-basiert

Einfach und unterstĂŒtzt SprĂŒnge zu beliebigen Seiten:

{
  "data": ["..."],
  "meta": {
    "page": 2,
    "perPage": 20,
    "total": 142,
    "totalPages": 8
  },
  "links": {
    "first": "/api/users?page=1&per_page=20",
    "prev": "/api/users?page=1&per_page=20",
    "next": "/api/users?page=3&per_page=20",
    "last": "/api/users?page=8&per_page=20"
  }
}

Cursor-basiert

Besser fĂŒr Echtzeitdaten und große DatensĂ€tze:

{
  "data": ["..."],
  "meta": {
    "hasNext": true,
    "hasPrev": true
  },
  "links": {
    "next": "/api/users?cursor=eyJpZCI6MTQzfQ&limit=20",
    "prev": "/api/users?cursor=eyJpZCI6MTIzfQ&limit=20&direction=prev"
  }
}

Datum und Uhrzeit

Verwenden Sie immer ISO 8601 mit Zeitzoneninformation:

{
  "createdAt": "2024-01-15T10:30:00Z",
  "updatedAt": "2024-01-15T14:22:33+00:00",
  "expiresAt": "2024-12-31T23:59:59Z"
}

Verwenden Sie niemals:

  • Unix-Zeitstempel (mehrdeutig: Sekunden oder Millisekunden?)
  • Lokale Daten ohne Zeitzone
  • Benutzerdefinierte Formate wie MM/TT/JJJJ

Mehr zur Zeitstempelverarbeitung finden Sie in unserem Unix-Zeitstempel-Leitfaden.

Null vs. fehlende Felder

Zwei gÀngige AnsÀtze:

Mit null einbeziehen (explizit):

{ "name": "Alice", "avatar": null, "bio": null }

Fehlende Felder weglassen (sparsam):

{ "name": "Alice" }

Empfehlung: Seien Sie innerhalb Ihrer API konsistent. Explizite Nullwerte sind besser fĂŒr typisierte Sprachen (Clients wissen, dass das Feld existiert). Sparsam ist besser fĂŒr bandbreitenbeschrĂ€nkte Umgebungen.

Versionierung von Antworten

Wenn sich das Antwortformat Àndert, versionieren Sie Ihre API:

GET /api/v2/users/123

Breaking Changes, die eine Versionierung erfordern:

  • Entfernen eines Feldes
  • Ändern eines Feldtyps
  • Umbenennen eines Feldes
  • Ändern der Response-Envelope-Struktur

Nicht-breaking Changes (sicher ohne Versionierung):

  • HinzufĂŒgen neuer Felder
  • HinzufĂŒgen neuer Endpunkte
  • HinzufĂŒgen neuer Enum-Werte

FAQ

Sollte ich erfolgreiche Antworten in einem data-Key verpacken oder die Ressource direkt zurĂŒckgeben?

Die Verwendung eines data-Wrappers bietet eine konsistente Struktur fĂŒr alle Antworten und lĂ€sst Raum fĂŒr Metadaten, Paginierung und Links neben den Daten. Die direkte RĂŒckgabe der Ressource ist einfacher fĂŒr Einzelressourcen-Endpunkte. Die meisten modernen APIs verwenden den Wrapper-Ansatz fĂŒr Konsistenz.

Wie sollte ich TeilausfÀlle bei Batch-Operationen behandeln?

Geben Sie 200 mit einer Antwort zurĂŒck, die sowohl Erfolge als auch Fehler im data-Objekt enthĂ€lt. Die Verwendung von 207 Multi-Status (WebDAV) ist eine weitere Option, wird aber seltener in REST-APIs verwendet.

Verwandte Ressourcen

Published on 2025-06-05
API Response Formats: Best Practices for Consistent APIs | alltools.one