Zum Inhalt springen

Welche Endpunkte gibt es?

Kurzantwort: Jedes Modell bekommt unter /api/rest/<apiPath> einen festen Satz Endpunkte: create, read/{id}, update/{id} (PUT und PATCH), delete/{id}, query, dazu optional {id}/file, {id}/history und {id}/rollback/{revision}. Welche davon existieren, steuert @ExposeApi je Modell. Komplexe Lesevorgänge laufen bewusst über POST, weil der Response Request im Body steht.


Basis-Pfad: api/rest{apiPath} – der apiPath kommt aus dem Modell (@DataObject(apiPath = ...)).

MethodePfadZweckBodyBedingung
POST/createAnlegen (JSON)WritePayload<{Model}CreatePayload>create
POST/create/uploadAnlegen mit DateienMultipart: data + filescreate und Datei-Modell
POST/read/{id}Lesen mit Response RequestReadPayloadread
GET/read/{id}Lesen mit ["*"] als Responseread
PUT/update/{id}ErsetzenWritePayload<{Model}UpdatePayload>update
PUT/update/{id}/uploadErsetzen mit DateienMultipartupdate und Datei-Modell
PATCH/update/{id}TeiländerungPatchPayloadpatch
PATCH/update/{id}/uploadTeiländerung mit DateienMultipartpatch und Datei-Modell
DELETE/delete/{id}Löschendelete
POST/querySuchen/ListenRestListPayloadquery
GET/{id}/fileDatei herunterladendownload
POST/{id}/historyRevisionslisteRestListPayloadhistory
POST/{id}/rollback/{revision}auf Revision zurücksetzenReadPayloadrollback

Für ein Modell mit apiPath = /crm/customer:

POST /api/rest/crm/customer/create
POST /api/rest/crm/customer/read/{id}
GET /api/rest/crm/customer/read/{id}
PUT /api/rest/crm/customer/update/{id}
PATCH /api/rest/crm/customer/update/{id}
DELETE /api/rest/crm/customer/delete/{id}
POST /api/rest/crm/customer/query

Ein @Singleton-Modell hat keine ID in der URL – es gibt nur ein Objekt pro Scope:

MethodePfadZweck
POST/createanlegen (schlägt fehl, wenn es schon existiert)
POST/create/uploadanlegen mit Dateien
POST/readlesen mit Response Request
GET/readlesen mit ["*"]
PUT/updateersetzen
PUT/update/uploadersetzen mit Dateien
PATCH/updateTeiländerung
DELETE/deletelöschen
GET/fileDatei herunterladen
POST/historyRevisionsliste

Ein abstraktes Modell bekommt einen Router-Controller mit denselben Pfaden. Der konkrete Untertyp kommt aus dem Payload:

MethodePfadWoher der Typ kommt
POST/create, /create/uploaddata.@type des Payloads
POST/GET/read/{id}aus der Datenbank ermittelt (_MODELTYPE)
PUT/update/{id}data.@type
PATCH/update/{id}data["@type"]
DELETE/delete/{id}aus der Datenbank ermittelt
POST/querypro Treffer aus der Datenbank; die Zeilen werden parallel über die Untertyp-APIs geladen

Details in Vererbung und abstrakte Modelle.

PfadModulZweck
GET /cias/fetchcdms-authorizationBenutzerprofil des aktuellen Requests (Rollen, Attribute)
POST/GET /api/mcpCDMS-HubMCP-Server, siehe MCP
GET /.well-known/oauth-protected-resource/api/mcpCDMS-HubOAuth-Discovery für MCP-Clients (ohne Token erreichbar)
GET :8081/actuator/health/livenessalleLiveness

GET /read/{id} gibt es, liefert aber immer ["*"] – also alle skalaren Felder plus Referenzen mit ID. Sobald man steuern will, welche Felder und Beziehungen mitkommen, braucht es einen Body; deshalb POST /read/{id} mit ReadPayload. Dasselbe gilt für /query: Filter, Sortierung, Pagination und Response Request sind strukturierte Daten und gehören nicht in eine URL.

Gesteuert über @ExposeApi:

@ExposeApi(create = true, read = true, update = true, patch = true,
delete = true, query = true,
download = false, history = false, rollback = false)

Standardmäßig sind create, read, update, patch, delete und query an; download, history und rollback aus. Im Modell steuert die Endpunkt-Konfiguration diese Flags:

Endpoint im Modellschaltet frei
CreateEndpointcreate
UpdateEndpointupdate und patch
ReadEndpointread und query
DeleteEndpointdelete
SearchEndpointsearch

Jeder Endpunkt prüft eine eigene Rolle aus @AccessByRole: onCreate, onRead, onUpdate, onDelete, onDownload, onHistory, onRollback. Details in Rollen und Rechte.

Bemerkenswert: History liest nur und prüft deshalb die History-Rolle; Rollback schreibt und verlangt zusätzlich die Rollback-Rolle.