Skip to content

Fehlerbehandlung ​

Statuscodes ​

CodeWannWiederholen?
200Erfolg–
201Ressource angelegt; Pfad im Header Location, Rumpf text/plain–
302Weiterleitung, etwa bei /api/users/me und bei öffentlichen LinksZiel folgen
304Seit If-Modified-Since unverändert — nur wenn im Backend eingeschaltet–
400Anfrage verletzt eine Regel: Rumpf, Parameter, Werttyp, Namenslänge, FiltersyntaxNein — erst korrigieren
401Nicht angemeldet oder Zugangsdaten ungültigErst nach neuer Anmeldung
403Angemeldet, aber ohne ausreichende Rolle auf dieser RessourceNein
404Ressource oder Route existiert nichtNein
405Methode auf dieser Route nicht erlaubtNein
500Unerwarteter ServerfehlerEinmal, mit Abstand
503Dienst vorübergehend nicht verfügbarJa, mit wachsendem Abstand

Die zwei Fehlerformate ​

Das Backend schreibt Fehler in zwei Formen. Welche kommt, hängt davon ab, wo der Fehler entsteht — Clients sollten beide lesen können.

Aus einer Operation (Validierung, Berechtigung, Typkonflikt):

json
{
  "error": "constraints error",
  "description": "Space name exceeds maximum of 80"
}

Aus dem Ausnahme-Handler (alles, was die Operation nicht selbst abfängt):

json
{
  "code": 400,
  "type": "AGError",
  "message": "The entity format is incorrect, a dictionary is expected"
}

Auf code und Status verlassen, nicht auf type

type ist der Name der auslösenden Klasse im Backend. Er ist aufschlussreich beim Suchen, aber kein stabiler Vertrag. Verzweigen Sie über den HTTP-Status.

Ein robuster Leser:

javascript
async function fehlermeldung(response) {
  const koerper = await response.json().catch(() => null)
  return koerper?.description ?? koerper?.message ?? response.statusText
}

Die Fehlerarten des Backends ​

Diese Ausnahmen erzeugen jeweils einen festen Statuscode:

FehlerStatuserror im Rumpf
AGHTTPUnauthorized401unauthorized
AGHTTPForbidden403forbidden
AGResourceNotFound404objectNotFound
AGHTTPNotAllowed405method not allowed
AGHTTPParseError400parse error
AGHTTPConstraintsError400constraints error
AGTypeConversionError400type conversion error
AGHTTPValueNotFound400valueNotFound
AGServiceUnavailable503serviceUnavailable

401 und 403 auseinanderhalten ​

Die Unterscheidung ist genauer, als sie oft gehandhabt wird:

  • 401 — die Identität ist unklar. Kein Authorization-Header, falscher Schlüssel, abgelaufenes Token.
  • 403 — die Identität steht fest, ihr fehlt aber die Rolle auf dieser Ressource. Auch eine fremde Ressource, auf die Sie keinerlei Recht haben, antwortet mit 403, nicht mit 404.

Bei 401 kann der Header Apptive-Authorization mitkommen und sagt dann, welche Art von Anmeldung erwartet wird:

WertBedeutung
linkDer öffentliche Link verlangt Benutzername und Passwort
internalDer Link verlangt eine angemeldete ApptiveGrid-Identität

503 und Wiederholung ​

503 entsteht bei Wartungsarbeiten oder wenn eine Datenbanksperre den Zugriff kurzzeitig blockiert. Das Backend wiederholt Schreibvorgänge bei internen Sperrkonflikten bereits selbst (bis zu dreimal), bevor es aufgibt.

Für Clients heißt das: 503 ist der einzige Fehler, bei dem eine schlichte Wiederholung sinnvoll ist. Warten Sie zwischen den Versuchen zunehmend länger.

bash
curl -s --retry 3 --retry-delay 2 --retry-all-errors \
  -u "$APPTIVE_KEY:$APPTIVE_SECRET" "$BASE$GRID/entities"

Schreibende Aufrufe nicht blind wiederholen

POST …/entities ist nicht idempotent: eine Wiederholung nach einer Zeitüberschreitung kann einen zweiten Eintrag anlegen. Prüfen Sie im Zweifel erst mit einem Filter, ob der Eintrag schon existiert.

Bedingtes Lesen ​

Bei gesetztem If-Modified-Since kann das Backend mit 304 Not Modified antworten, wenn sich die Datenbank seitdem nicht geändert hat. Der Vergleich läuft über den Änderungsstand der gesamten Datenbank, nicht über einzelne Ressourcen: ein 304 heißt „hier hat sich nichts getan", ein 200 heißt nicht zwingend, dass sich genau diese Ressource geändert hat.

304 ist optional

Ein 304 ist eine zulässige, aber keine zugesicherte Antwort. Bauen Sie Clients so, dass sie auch dann korrekt arbeiten, wenn auf eine unveränderte Datenbank ein 200 folgt.

Für gezieltes Nachführen einzelner Grids ist GET …/grids/{gridId}/updates?since=… das verlässlichere Mittel. → Grids

Zwei Fehler kommen nicht als JSON ​

401 und 404 aus der Routenschicht — also bevor überhaupt eine Operation läuft — antworten mit text/plain:

No handler found [404 Not Found]
unauthorized [401 Unauthorized]

Ein 404 in dieser Form ist ein Hinweis darauf, dass der Pfad falsch gebaut wurde. Ein Client, der Fehlerrümpfe grundsätzlich als JSON parst, sollte hier nicht abstürzen.

War diese Seite hilfreich?