Worum es geht
Geht eine Anfrage schief, antwortet CDMS mit einem Fehlerstatus (400 und höher) und einer Fehlerantwort. Die Fehlerantwort ist ein kleines JSON-Objekt ohne data. Es sagt dir, was passiert ist, und zwar so, dass ein Programm es auswerten kann. CIAS antwortet in genau derselben Form.
Die Antwort enthält keinen Satz für Menschen, sondern einen Schlüssel. Den Text, den der Benutzer sieht, macht dein Frontend daraus, in seiner Sprache.
Eine Fehlerantwort, beschriftet
POST /api/rest/hr/employee/read/5a2b…
{ "response": ["name"] }{
"messageKey": "missing-permission|hr-employee-read",
└ Schlüssel ┘ └── Detail ───┘ ← hierauf verzweigen
"code": "403", ← Status als Text
"layer": "validation" ← Schicht, nur zur Fehlersuche
}| Feld | immer da? | Bedeutung | im Client |
|---|---|---|---|
messageKey | ja | fester Schlüssel, oft mit Details nach | | hierauf verzweigen |
detail | nur im Debug-Modus des Servers | technischer Text der Ursache | nie anzeigen, nie auswerten |
code | ja | der HTTP-Status als Text, z. B. "422" | gleich dem Status der Antwort |
layer | ja | Schicht, in der der Fehler entstand | nur zur Fehlersuche |
violations | nur bei Validierungsfehlern | alle verletzten Feldregeln mit Pfad | den Formularfeldern zuordnen |
id | nur beim Sonderfall LENIENT | id des angelegten Objekts | merken, später lesen |
stacktrace | nur im Debug-Modus des Servers | technischer Aufrufstapel | nie auswerten |
Der messageKey im Einzelnen
Der messageKey hat die Form schlüssel|detail|detail. Vor dem ersten | steht der Schlüssel, also die Art des Problems. Danach folgen, je nach Fehler, Details wie ein Feldname, ein Modellname, ein Rollenname oder eine id. Werte, die du in Feldern oder Filtern mitschickst, stehen nie darin.
messageKey | Schlüssel | Details |
|---|---|---|
missing-permission|hr-employee-read | missing-permission | die fehlende Rolle |
invalid-value|data.amount | invalid-value | Pfad des Feldes im Körper |
wrong-value-in-where|amount | wrong-value-in-where | das Feld des Filters, nie der Wert |
recursive-create-not-allowed|employees | recursive-create-not-allowed | die Beziehung |
not-found|Person|5a2b… | not-found | Modell und id |
validation-failed | validation-failed | keine, die Einzelheiten stehen in violations |
optimistic-lock-conflict | optimistic-lock-conflict | keine |
So kommst du im Client an den Schlüssel:
const [key, ...details] = body.messageKey.split('|');
// key = "missing-permission"
// details = ["hr-employee-read"]switch (key) {
case 'missing-permission': … // Rolle fehlt
case 'not-found': … // Objekt weg oder unsichtbar
case 'validation-failed': … // violations ins Formular
default: … // allgemeine Meldung
}Alle Schlüssel von CDMS sind klein und mit Bindestrich geschrieben, etwa tenant-required oder missing-id. Vergleiche den Schlüssel Zeichen für Zeichen, so wie er ist.
Drei Formen von Fehlerkörpern
Nicht jede Ablehnung kommt von CDMS selbst. Die Filterkette von CIAS läuft vorher. Sie antwortet in derselben Form, ihr Schlüssel beginnt mit cias.authentication.. Manche Ablehnungen haben gar keinen Körper.
messageKeymessageKey,code,layer- jede Ablehnung ab der Rollenprüfung
- auch 400 für eine Anfrage, die sich nicht lesen lässt
messageKey, Schlüssel cias.authentication.…{"messageKey": "cias.authentication.tenant-unresolved", "code": "403", "layer": "api"}- der Mandant ist nicht bestimmbar, wird nicht bedient oder fehlt
- dieselbe Form wie bei CDMS
- 401: Token ungültig oder abgelaufen, Header
WWW-Authenticate - 403: gar kein Token
- 404: den Pfad gibt es nicht
Mehr zu den Ablehnungen der Filterkette unter Zugriff ohne Token und 401, 403 oder 404?.
Die Validierung: violations
Nur ein Validierungsfehler hat eine Liste violations. Jeder Eintrag nennt das Feld mit seinem Pfad und die verletzte Regel:
POST /api/rest/crm/customer/create
{ "data": { "name": "" }, "response": ["id"] }{
"messageKey": "validation-failed",
"code": "422",
"layer": "API",
"violations": [
{ "field": "name", "rule": "cannot-be-empty" },
{ "field": "email", "rule": "cannot-be-null" }
]
}Wie du die Einträge den Formularfeldern zuordnest, steht unter Validierungsfehler ins Formular bringen. Welche Regeln es gibt: Validierung.
Der Sonderfall: 200 in Fehlerform
Nach einem create im Modus LENIENT kann das Anlegen gelingen und nur das Zurücklesen scheitern. Dann kommt Status 200, aber ein Körper in Fehlerform mit der id des neuen Objekts:
{
"messageKey": "create-succeeded-read-failed",
"code": "200",
"layer": "system",
"id": "5a2b…"
}Das Objekt existiert.
Die id merken und später lesen,
NICHT noch einmal anlegen.Siehe Anlegen und Zurücklesen: STRICT oder LENIENT.
So wertet ein Client aus
-
1ClientStatus 2xx?
-
2Clientja, und
messageKeyistcreate-succeeded-read-failed→ angelegt,idmerken -
3Clientja, sonst →
dataverwenden -
4Clientnein → Körper lesen, wenn es einen gibt. Hat er einen
messageKey? -
5Clientja → Schlüssel vor dem ersten
|auswerten, bei 422 zusätzlichviolations. Beginnt er mitcias.authentication., hat schon die Filterkette abgelehnt, etwa wegen des Mandanten -
6Clientnein → am Status entscheiden: 401 Token erneuern, 403 ohne Token anmelden, sonst allgemeine Meldung
Fallen
Wie es weitergeht
- Welcher Status was bedeutet: Landkarte der Statuscodes
- Die drei häufig verwechselten Codes: 401, 403 oder 404?
- Die Hülle einer Erfolgsantwort: Das Antwortformat