Worum es geht
Jede Antwort hat einen HTTP-Statuscode, eine dreistellige Zahl. Die erste Ziffer sagt, wer handeln muss:
- 2xx: Es hat geklappt.
- 4xx: Die Anfrage passt nicht. Der Client muss etwas ändern, bevor ein neuer Versuch Sinn hat.
- 5xx: Im Server ist etwas schiefgegangen. Der Client kann an der Anfrage nichts verbessern.
Wo die Codes entstehen
Eine Anfrage läuft durch mehrere Stationen. Jede Station hat ihre eigenen Codes:
-
CIASFilterketteGibt es ein gültiges Token? Lässt sich der Mandant bestimmen?↳ nein 401 Token ungültig · 403 kein Token oder Mandant abgelehnt
-
CDMSWeiterleitungGibt es diesen Pfad?↳ nein 404 ohne
messageKey -
CDMSREST-LayerLässt sich der Körper lesen? Sind
dataundresponseda?↳ nein 400 · 413 Upload zu groß -
CDMSSystem-LayerRolle, Sichtbarkeit, Beziehungen, Feldregeln, Hooks↳ nein 403 · 404 · 400 · 422
-
DatenbankPersistenzNimmt die Datenbank die Änderung an?↳ nein 409 Wert schon vergeben oder Objekt noch verwiesen · 409 gleichzeitige Änderung · 400 Wert passt nicht in die Spalte · 503 Datenbank nicht erreichbar
- 200 mit
data, die Änderung ist festgeschrieben
Wann Rolle und wann Sichtbarkeit zuerst geprüft wird, steht unter 401, 403 oder 404?.
Die Matrix
| Code | heißt | typische Situationen und messageKey | nochmal versuchen? |
|---|---|---|---|
| 200 | erfolgreich | Lesen, Suchen, Anlegen, Ändern, Löschen, Rollback. Sonderfall: angelegt, aber nicht zurückgelesen (CDMS_CREATE_SUCCEEDED_READ_FAILED) | – |
| 400 | Anfrage fehlerhaft | JSON nicht lesbar, Wert passt nicht zum Feld, response oder data fehlt, Filter mit falschem Wert, Anlegen über eine Beziehung nicht erlaubt, Wert passt nicht in die Datenbankspalte | erst nach einer Korrektur |
| 401 | Token ungültig | Token abgelaufen, kaputt oder falsch signiert | nach dem Erneuern des Tokens, einmal |
| 403 | nicht erlaubt | kein Token, Mandant abgelehnt, Rolle fehlt (missing-permission|<rolle>), Mandantenwechsel nicht erlaubt | nein |
| 404 | nicht gefunden | Objekt gibt es nicht oder es ist für dich unsichtbar, Singleton noch nicht angelegt, Pfad unbekannt | nein |
| 409 | Konflikt | eindeutiger Wert schon vergeben (already-exists), Objekt wird noch verwiesen (database-integrity-failed), zwei Anfragen schreiben gleichzeitig einen neuen Inhalt in dasselbe Datei-Objekt | bei already-exists und database-integrity-failed erst nach einer Korrektur, sonst nach neuem Lesen |
| 413 | Upload zu groß | eine Datei (file-too-large|<bytes>), alle Dateien zusammen (request-too-large|<bytes>) oder die Zahl der Teile (too-many-parts|<anzahl>) über der Grenze | erst nach einer Korrektur |
| 422 | Inhalt verletzt Regeln | Feldregeln verletzt (validation-failed mit violations), Hook lehnt ab, Profilattribut fehlt | erst nach einer Korrektur |
| 500 | Serverfehler | unerwarteter Fehler im Server oder ein Fehler in der Einrichtung des Projekts | meist zwecklos |
| 503 | Datenbank nicht erreichbar | der Datenbankserver antwortet nicht, die Verbindung bricht ab, eine Sperre wird nicht rechtzeitig frei, die Datenbank bricht eine Verklemmung ab | nach einer Pause |
Was nach jedem Code gespeichert ist und wie du wiederholst, steht unter Darf der Client wiederholen?.
200: erfolgreich
Jede erfolgreiche Anfrage liefert 200, auch ein create und ein delete. Codes wie 201 oder 204 gibt es nicht. Ein Löschen antwortet mit leerem Körper, alles andere mit data. Siehe Das Antwortformat.
Einen Sonderfall gibt es: Im Modus LENIENT kann ein create gelingen und nur das Zurücklesen scheitern. Dann kommt 200 mit einem Körper in Fehlerform, dem messageKey CDMS_CREATE_SUCCEEDED_READ_FAILED und der id des neuen Objekts. Das Objekt ist gespeichert, lege es nicht noch einmal an. Siehe Anlegen und Zurücklesen.
400: die Anfrage ist fehlerhaft
400 heißt: So, wie die Anfrage ist, kann CDMS sie nicht ausführen. Der messageKey sagt, was nicht passt, oft mit dem Pfad oder Feld dahinter.
| Bereich | messageKey | Seite |
|---|---|---|
| Körper nicht lesbar | malformed-json, unreadable-body | Validierung |
| Wert passt nicht zum Feld | invalid-value|<pfad>, z. B. Text in einem Zahlfeld | Validierung |
| Teil der Anfrage fehlt | response, missing-data, missing-id, missing-parameter | Ein Objekt lesen |
| Pfadangabe hat den falschen Typ | invalid-parameter|<name>, z. B. eine id, die keine UUID ist | – |
| Filter oder Sortierung falsch | wrong-value-in-where|…, wrong-uuid-in-where|…, like-needs-text|…, wrong-order-element-exception | Wenn ein Filter nicht passt |
| Beziehung erlaubt kein Anlegen | recursive-create-not-allowed|<feld> | Die vier Fälle |
| Untertyp fehlt oder unbekannt | missing-type-for-abstract-field|…, unknown-type-for-abstract-field|… | Abstrakte Modelle |
| Datenbank nimmt einen Wert nicht an, z. B. länger als die Spalte oder leer in einer Pflichtspalte | constraint-violation | Validierung |
| Verweis zeigt beim Speichern auf ein Objekt, das es nicht (mehr) gibt | unknown-reference | Die vier Fälle |
| Singleton gibt es schon | object-already-exists|use-update | Singleton |
| Datei-Objekt ohne passende Datei | file-part-missing|<name>, file-name-missing | Hochladen |
| Mandant fehlt | CDMS_TENANT_REQUIRED | Woher der Mandant kommt |
401 und 403: wer du bist und was du darfst
401 kommt nur von der Filterkette: Das Token ist abgelaufen, kaputt oder falsch signiert. Die Antwort hat keinen Körper, aber den Header WWW-Authenticate: Bearer error="invalid_token". Erneuere das Token und wiederhole die Anfrage einmal.
403 heißt: Diese Anfrage ist für dich nicht erlaubt. Es gibt drei Quellen:
| Quelle | woran du sie erkennst | Beispiel |
|---|---|---|
| Filterkette, kein Token | Körper ohne messageKey | Header Authorization fehlt |
| Filterkette, Mandant | Feld error mit cias.authentication.… | cias.authentication.tenant-unresolved |
| CDMS | messageKey | missing-permission|hr-employee-read, ohne Strict Mode missing-create-role u. a., CDMS_TENANT_SWITCH_NOT_AUTHORIZED |
Siehe Zugriff ohne Token, Modellrollen und Strict Mode.
404: nicht gefunden
404 mit messageKey heißt: Das Objekt gibt es nicht, oder du darfst es nicht sehen. CDMS unterscheidet das absichtlich nicht. Typische Schlüssel sind not-found, not-found|<Dto>|<id>, missing-object|… für ein fehlendes Kind in einer Beziehung und no-data-exists|use-create bei einem Singleton, das es noch nicht gibt.
404 ohne messageKey heißt: Den Pfad gibt es nicht. Meist ist der Modellpfad falsch geschrieben, oder das Modell hat diesen Endpunkt nicht. Siehe Warum Unsichtbares 404 liefert und Welche Endpunkte ein Modell hat.
409: Konflikt
409 heißt: Die Änderung passt nicht zu den Daten, die schon gespeichert sind. Nichts ist gespeichert. Es gibt drei Fälle:
| Situation | messageKey | was tun |
|---|---|---|
ein eindeutiger Wert oder die id ist schon vergeben | already-exists | nicht wiederholen: Den Wert gibt es schon. Anderen Wert wählen oder das vorhandene Objekt ändern |
| ein anderes Objekt verweist beim Speichern noch auf dieses, etwa weil der Verweis gleichzeitig entstanden ist. Verweise über das Modell löst CDMS beim Löschen selbst, siehe Abhängige Objekte (Kaskaden) | database-integrity-failed | nicht wiederholen: erst den Verweis lösen |
| zwei Anfragen schreiben gleichzeitig einen neuen Inhalt in dasselbe Datei-Objekt, die zweite verliert | CDMS_OPTIMISTIC_LOCK_CONFLICT | Objekt neu lesen, dann noch einmal versuchen |
Den gleichzeitigen Schreibkonflikt gibt es nur bei Datei-Modellen, bei allen anderen Modellen gewinnt die letzte Änderung ohne Fehler. Siehe Gleichzeitige Änderungen.
422: der Inhalt verletzt Regeln
422 heißt: Die Anfrage ist richtig gebaut, aber ihr Inhalt verletzt eine Regel.
Wann: Pflichtfeld leer, Text zu lang, Muster, Mindest- oder Höchstwert, Datum
messageKey validation-failed. In violations stehen alle Verstöße der Anfrage, jeder mit Feldpfad und Regel.
Ergebnis: Siehe Validierungsfehler ins Formular bringen.
Wann: Die Fachlogik des Projekts wirft einen Validierungsfehler.
layer ist hook, den messageKey wählt der Hook. Es gibt kein violations.
Ergebnis: Siehe Wenn ein Hook scheitert.
Wann: Ein Attributfilter braucht einen Wert aus deinem Profil, und der fehlt oder ist leer.
missing-attribute-on-profile|<attribut> oder empty-attribute-on-profile|<attribut>, ohne violations.
Ergebnis: Nicht die Daten sind falsch, sondern das Profil der Person. Siehe Attributfilter.
500: Fehler im Server
500 heißt: Im Server ist etwas passiert, das der Client nicht beheben kann. Es gibt zwei Arten:
- Unerwarteter Fehler. Der
messageKeyistdetails see logfiles,layeristundefined. Die Ursache steht im Server-Log. - Fehler in der Einrichtung. Das Projekt ist falsch eingerichtet, der
messageKeynennt es. Beispiele:unresolvable-mandatory-filter|…bei einem Filter auf ein Feld, das es nicht gibt, undCDMS_TENANT_DATASOURCE_NOT_FOUND, wenn die Datenbank des Mandanten fehlt.
Auch eine unerwartete Ausnahme in einem Hook endet mit 500. Eine Wiederholung hilft in keinem dieser Fälle. Gib Status, messageKey und Zeitpunkt an das Team weiter.
503: die Datenbank ist nicht erreichbar
503 heißt: Die Datenbank kann die Anfrage gerade nicht bedienen. Nichts ist gespeichert, die Transaktion ist zurückgerollt. Das ist eine Störung, kein Fehler in deinen Daten: Eine Wiederholung nach einer Pause kann gelingen.
| Situation | messageKey |
|---|---|
| der Datenbankserver des Mandanten ist nicht erreichbar | CDMS_TENANT_DATASOURCE_UNAVAILABLE |
| die Verbindung bricht während der Anfrage ab | database-unavailable|connection |
| eine Sperre auf dem Objekt wird nicht rechtzeitig frei | database-unavailable|lock-timeout |
| die Datenbank bricht die Anfrage wegen einer Verklemmung mit einer anderen ab | database-unavailable|deadlock |
Lehnt die Datenbank eine Änderung dagegen wegen der vorhandenen Daten ab, kommt 409, und eine unveränderte Wiederholung scheitert genauso. Siehe oben.
Ablehnungen beim Hochladen
Beim Hochladen von Dateien lehnt CDMS eine Anfrage mit 400 ab, wenn zwei Teile denselben Dateinamen haben (duplicate-filenames|<name>), ein Teil keinen Dateinamen hat (missing-filename) oder sich der Multipart-Körper nicht lesen lässt (malformed-multipart). Ist eine Datei, der ganze Request oder die Zahl der Teile zu groß, kommt 413, und der messageKey nennt die Grenze, etwa file-too-large|26214400 (Bytes). Prüfe Namen und Größe schon im Client. Siehe Hochladen und Größengrenzen.
Fallen
Wie es weitergeht
- Wie eine Fehlerantwort aufgebaut ist: Das Fehlerformat
- Die drei häufig verwechselten Codes: 401, 403 oder 404?
- Was nach einem Fehler gespeichert ist: Ein Request, eine Transaktion