CodamAIDocs
Themafertig

Ein Objekt lesen

Wie POST /read/{id} und GET /read/{id} ablaufen, was bei fehlendem oder unsichtbarem Objekt zurückkommt und worin sich Singleton und abstraktes Modell unterscheiden.

Ausprägungen
POST /read/{id} mit responseGET /read/{id} (= *)Singleton POST/GET /readabstraktes Modellnicht vorhanden → 404unsichtbar → 404ohne Leserolle → 403Referenz ohne Leserolle → 403response fehlt → 400

Worum es geht

Du kennst die id eines Objekts und willst es lesen. Dafür hat jedes Modell zwei Endpunkte:

EndpunktKörperwas zurückkommt
POST {basis}/read/{id}JSON mit responsegenau die Felder, die du in response nennst
GET {basis}/read/{id}keinerimmer alles, was ["*"] liefert

{basis} ist der Pfad des Modells, zum Beispiel /api/rest/hr/employee.

Die zwei Wege im Vergleich

POST: du bestimmst die Felder
Anfrage
POST /api/rest/hr/employee/read/7f3…
{ "response": ["firstname", "lastname"] }
Antwort
{
  "data": {
    "id": "7f3…",
    "_createdOn": "2026-03-02 09:14:00",
    "_updatedOn": "2026-09-01 16:40:12",
    "firstname": "Daniel",
    "lastname": "Mertins",
    "company": null,
    "department": null
  },
  "meta": { "error": false }
}

id, _createdOn und _updatedOn kommen immer mit, auch wenn sie nicht in response stehen. Alles andere, was du nicht angefordert hast, steht als null in der Antwort. Mehr dazu unter Systemfelder.

GET: immer alles mit *
Anfrage
GET /api/rest/hr/employee/read/7f3…
Antwort
{
  "data": {
    "id": "7f3…",
    "firstname": "Daniel",
    "lastname": "Mertins",
    "company":    { "id": "a1…", "companyname": null },
    "department": { "id": "d4…", "name": null }
  },
  "meta": { "error": false }
}
POST oder GET?
POST /read/{id}
für Produktion
  • du wählst die Felder in response
  • Referenzen kannst du gezielt ausbauen
  • du brauchst nur die Rollen der Modelle, die du wirklich anfragst
GET /read/{id}
zum Ausprobieren
  • kein Körper, CDMS nimmt immer ["*"]
  • Referenzen kommen nur mit ihrer id
  • braucht die Leserolle jedes referenzierten Modells

Die Stationen einer Leseanfrage

Eine Leseanfrage läuft durch mehrere Prüfungen. Erst wenn alle bestanden sind, kommen Daten zurück:

POST /api/rest/hr/employee/read/7f3…
  1. CIAS
    Filterkette
    Ist das Token gültig?
    ↳ nein 401
  2. CDMS
    Feldauswahl
    Steht eine response im Körper?
    ↳ nein 400 mit messageKey response
  3. CDMS
    Modellrolle
    Hat der Benutzer die Leserolle von employee?
    ↳ nein 403 missing-permission|employee-read
  4. CDMS
    Zeilenfilter
    Gibt es das Objekt, und darf der Benutzer es sehen (Mandant, eigene Daten, Attributfilter)?
    ↳ nein 404 not-found
  5. CDMS
    Referenzen
    Hat der Benutzer die Leserolle jedes Modells, in das die response hineinreicht?
    ↳ nein 403 missing-permission|<rolle>, die ganze Anfrage scheitert
  6. 200 mit den angeforderten Feldern

Zwei Dinge sind hier wichtig:

  1. Unsichtbar ist dasselbe wie nicht vorhanden. Ein Objekt, das es nicht gibt, und ein Objekt, das du nicht sehen darfst, liefern beide 404. So verrät CDMS nicht, dass es fremde Daten gibt. Siehe Warum Unsichtbares 404 liefert.
  2. Die response bestimmt, welche Rollen du brauchst. Liest du nur einfache Felder, reicht die Leserolle des Modells. Sobald die response in eine Referenz hineinreicht, brauchst du auch die Leserolle des referenzierten Modells.

Alle Ausprägungen

Ein Objekt lesen

Wann: Der Normalfall. Du weißt, welche Felder du brauchst.

  1. 1
    Client→CDMS
    schickt POST /hr/employee/read/7f3… mit { "response": ["firstname", "lastname"] }
  2. 2
    CDMS
    löst die response in eine Liste von Feldern auf
  3. 3
    CDMS
    prüft die Leserolle von employee
  4. 4
    CDMS→Datenbank
    sucht die Zeile mit dieser id, eingeschränkt durch die Zeilenfilter, und liest nur die angeforderten Spalten
  5. 5
    Hook
    Lese-Hooks des Projekts sehen das Objekt, bevor es zur Antwort wird
  6. 6
    CDMS→Client
    liefert das Objekt in data

Ergebnis: 200 mit firstname, lastname und den Systemfeldern.

Wann: Du willst dir ein Objekt schnell ansehen, etwa mit curl oder im Browser.

Der Ablauf ist derselbe wie bei POST. CDMS setzt nur selbst response auf ["*"]. Du bekommst alle einfachen Felder und jede Referenz mit ihrer id. Dafür brauchst du die Leserolle jedes referenzierten Modells.

Ergebnis: 200 mit allem, was * liefert, oder 403, wenn eine Referenzrolle fehlt.

Wann: Das Modell hat genau ein Objekt, z. B. Einstellungen. Pfad ohne id: POST /read bzw. GET /read.

  1. 1
    Client→CDMS
    schickt POST /crm/einstellungen/read mit { "response": ["+"] }
  2. 2
    CDMS→Datenbank
    sucht das eine Objekt selbst, mit den Zeilenfiltern
  3. 3
    CDMS→Client
    keins da → 404 no-object-found
  4. 4
    CDMS→Client
    vorhanden → liest es wie ein normales Objekt

Ergebnis: 200 mit dem einen Objekt. Siehe Singletons.

Wann: Du liest über die Hub-API eines abstrakten Modells, z. B. /crm/kunde/read/{id}.

  1. 1
    Client→CDMS
    schickt nur die id, kein @type
  2. 2
    CDMS→Datenbank
    liest den gespeicherten Typ zur id nach, z. B. crm.privatkunde
  3. 3
    CDMS
    gibt die Anfrage an die API des Untertyps weiter, mit dessen Rollen und Filtern
  4. 4
    CDMS→Client
    liefert das Objekt mit @type

Ergebnis: 200 mit den Feldern des Untertyps und "@type": "crm.privatkunde". Siehe Abstrakte Modelle.

Wann: Dem Benutzer fehlt die Rolle employee-read.

  1. 1
    Client→CDMS
    schickt eine gültige Leseanfrage
  2. 2
    CDMS
    prüft die Leserolle von employee
  3. 3
    CDMS→Client
    Rolle fehlt → 403 missing-permission|employee-read

Ergebnis: 403. Die Datenbank wird gar nicht erst gefragt.

Wann: Die id gibt es nicht, oder das Objekt gehört einem anderen Benutzer bzw. fällt durch einen Attributfilter.

  1. 1
    CDMS→Datenbank
    sucht die Zeile mit id und allen Zeilenfiltern
  2. 2
    CDMS→Client
    keine Zeile gefunden → 404 not-found

Ergebnis: 404. Für den Client ist nicht zu unterscheiden, ob es das Objekt nicht gibt oder ob er es nicht sehen darf.

Entscheidungstabelle

Antwort auf POST /hr/employee/read/{id}
response im KörperRolle employee-readObjekt sichtbarRollen der angefragten ReferenzenAntwort
nein–––400 response
janein––403 missing-permission|employee-read
jajanein–404 not-found
jajajafehlt eine403 missing-permission|<rolle>
jajajaalle da oder keine angefragt200

Die Tabelle beschreibt den Standard, den Strict Mode. Ist er ausgeschaltet, ändern sich Status und Schlüssel: Ohne employee-read kommt 404, und eine Einzelreferenz ohne Rolle ist still null. Siehe Strict Mode.

Fallen

Wie es weitergeht

Quellen im Code und in der Wissensdatenbank
  • CDMS/cdms-generator – ApiProcessor, ApiSingletonProcessor (read-by-post, read-by-get)
  • CDMS/cdms-rest-api – AbstractRestApi.readObject, AbstractRestSingletonApi.readObject, AbstractHubApi.read, Expander
  • CDMS/cdms-system-layer – AbstractSystemLayer.readObject, AbstractLayer.recursiveRead
  • CDMS/cdms-authorization – AbstractAuthorizationLayer.classAccess
  • documentation/05-api-guide/04-lesen.md
Suchen