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
| Code | Wann |
|---|---|
| 200 OK | GET erfolgreich, PUT/PATCH erfolgreich |
| 201 Created | POST hat eine Ressource erstellt |
| 204 No Content | DELETE erfolgreich (kein Body) |
Client-Fehlercodes
| Code | Wann |
|---|---|
| 400 Bad Request | Fehlerhafte Anfrage-Syntax |
| 401 Unauthorized | Fehlende oder ungĂŒltige Authentifizierung |
| 403 Forbidden | Authentifiziert, aber nicht autorisiert |
| 404 Not Found | Ressource existiert nicht |
| 409 Conflict | Ressourcenzustandskonflikt (Duplikat) |
| 422 Unprocessable | GĂŒltige Syntax, aber semantische Fehler |
| 429 Too Many Requests | Ratenlimit ĂŒberschritten |
Server-Fehlercodes
| Code | Wann |
|---|---|
| 500 Internal Server Error | Unerwarteter Serverfehler |
| 502 Bad Gateway | Upstream-Dienstausfall |
| 503 Service Unavailable | VorĂŒ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:
codeist maschinenlesbar (konstanter String, kein HTTP-Status)messageist menschenlesbar (kann geÀndert werden, ohne Clients zu beeintrÀchtigen)detailsliefert feldspezifische Fehler bei ValidierungsproblemenrequestIdermö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
- JSON-Formatierer â API-Antworten formatieren
- JSON-API-Designmuster â Umfassender API-Design-Leitfaden
- JSON-Schema-Validierung â Antwortstrukturen validieren