CodamAIDocs
Themafertig

Welche Endpunkte ein Modell hat

Der feste Satz von Operationen pro Modell (create, read, update, delete, query, history, rollback, Datei) und wie die Endpunkt-Liste im Modell einzelne Operationen ein- und ausschaltet.

Ausprägungen
StandardsatzEndpunkt-Liste leer = alles außer HistorieUPDATE schaltet PUT und PATCHREAD ohne QUERYHISTORY / HISTORY_ROLLBACKUPLOAD / DOWNLOADSingleton-Modellabstraktes Modell (Hub-API)Datei-Modellnicht vorhanden → 404

Worum es geht

Für jedes Modell erzeugt der Generator einen REST-Controller mit einem festen Satz von Operationen. Alle Pfade beginnen mit /api/rest und dem API-Pfad des Modells. Der API-Pfad entsteht aus dem Ordner im Hub und dem Modellnamen in Kleinbuchstaben, zum Beispiel /crm/customer.

Der vollständige Satz

So sieht der Satz eines normalen Modells aus, wenn alles eingeschaltet ist. {basis} steht für /api/rest/crm/customer.

Was du tun willstMethode und PfadKörper
anlegenPOST {basis}/createJSON
anlegen, mit DateienPOST {basis}/create/uploadMultipart
lesen, Felder selbst wählenPOST {basis}/read/{id}JSON mit response
lesen, schnell ansehenGET {basis}/read/{id}keiner, liefert immer *
ersetzenPUT {basis}/update/{id}JSON
ersetzen, mit DateienPUT {basis}/update/{id}/uploadMultipart
ändernPATCH {basis}/update/{id}JSON
ändern, mit DateienPATCH {basis}/update/{id}/uploadMultipart
löschenDELETE {basis}/delete/{id}keiner
suchen, filtern, blätternPOST {basis}/queryJSON mit response und parameter
Historie lesenPOST {basis}/{id}/historyJSON
auf alte Revision zurücksetzenPOST {basis}/{id}/rollback/{revision}JSON mit response
Datei herunterladenGET {basis}/{id}/filekeiner

Die Endpunkt-Liste im Modell

Im Hub bekommt ein Modell eine Liste von Endpunkten. Jeder Eintrag hat einen Typ, und der Generator erzeugt daraus die Operationen:

Welcher Endpunkt-Typ erzeugt welche Operationen?
Typ in der ListeErzeugte Operationen
CREATEPOST /create (und /create/upload)
READPOST /read/{id} und GET /read/{id}, keine Suche
LIST, QUERY oder SEARCHPOST /query
UPDATEPUT /update/{id} und PATCH /update/{id} (jeweils auch /upload)
PATCHnur PATCH /update/{id}
DELETEDELETE /delete/{id}
HISTORY_READ, HISTORY_QUERYPOST /{id}/history, nur bei auditierten Modellen
HISTORY_ROLLBACKPOST /{id}/rollback/{revision}, nur bei auditierten Modellen
DOWNLOADGET /{id}/file, nur bei Datei-Modellen
UPLOADdie /upload-Varianten, nur für Datei-Modelle von Bedeutung
unbekannter Typnichts; der Build meldet eine Warnung

Dazu drei Regeln, die man leicht übersieht:

Leere Liste
das Modell nennt gar keine Endpunkte
  • create, read, update, patch, delete, query, upload und download werden erzeugt
  • Historie und Rollback nicht, die muss man ausdrücklich eintragen
Lesen ist nicht Suchen
READ und LIST sind getrennt
  • READ erzeugt nur das Lesen per id
  • Wer eine Liste braucht, trägt LIST (oder QUERY) ein
Historie braucht Auditing
das Modell muss auditiert sein
  • ohne auditing im Modell entstehen keine History- und Rollback-Endpunkte, egal was in der Liste steht

Jeder Eintrag der Liste kann außerdem sagen, wer den Endpunkt nutzen darf: eine eigene Rolle, die Grundrolle des Modells oder öffentlich ohne Anmeldung. Das steht unter Modellrollen.

Die Sonderformen

Endpunkte je Modellart

Wann: der Regelfall

Der vollständige Satz wie oben, gefiltert durch die Endpunkt-Liste. Jedes Objekt wird über seine id im Pfad angesprochen.

Wann: Das Modell ist als Singleton markiert: genau ein Objekt pro Scope.

Die Pfade haben keine id, der Server findet das eine Objekt selbst: POST /create, POST /read, GET /read, PUT /update, PATCH /update, DELETE /delete, GET /file, POST /history, POST /rollback/{revision}. Eine Suche gibt es nicht. Ein zweites create scheitert mit 400 object-already-exists|use-update, ein update ohne vorhandenes Objekt mit 404 no-data-exists|use-create. Siehe Singletons.

Wann: Das Modell hat Untertypen, z. B. kunde mit privatkunde und firmenkunde.

Das Modell bekommt eine Hub-API mit denselben Pfaden. Sie leitet jede Anfrage an die API des konkreten Untertyps weiter: beim Schreiben anhand von @type im Payload, beim Lesen und Löschen anhand des Typs, der zur id gespeichert ist. Siehe Abstrakte Modelle.

Wann: Das Modell speichert eine Datei.

Zusätzlich gibt es GET /{id}/file zum Herunterladen, sobald DOWNLOAD oder READ eingetragen ist. Die /upload-Varianten gibt es, sobald UPLOAD, CREATE oder UPDATE eingetragen ist: Ein Datei-Modell, das keine Datei annehmen kann, wäre nutzlos. Siehe Dateien.

Welche Endpunkte hat mein Modell?

In dieser Reihenfolge nachsehen
  1. 1
    Client
    OpenAPI-Beschreibung der Installation öffnen. Sie listet jeden erzeugten Endpunkt mit seinem Payload
    Sie ist die verbindliche Auskunft, weil sie aus dem erzeugten Code entsteht.
  2. 2
    Admin
    Modell im Hub ansehen: Welche Typen stehen in der Endpunkt-Liste? Ist das Modell auditiert, ein Singleton, abstrakt, ein Datei-Modell?
  3. 3
    Client
    Ausprobieren: Die Antwort verrät, woran es liegt
    Ergebnis: 404 → Endpunkt gibt es nicht. 403 → Endpunkt gibt es, die Rolle fehlt. 401 → Token fehlt oder ist abgelaufen.

Was es bewusst nicht gibt

ErwartungSo ist es
POST /save, das je nach id anlegt oder ändertgibt es nicht; der Client entscheidet anhand der id zwischen create und update
Feldauswahl per Query-Parameter (?fields=)die Feldauswahl steht im Körper, siehe Feldauswahl
Suche per GET mit Parametern in der URLSuche läuft über POST /query
Massenoperationen für viele Objekte in einem Requestnicht vorgesehen; verwandte Objekte lassen sich verschachtelt schreiben
ein Endpunkt, der alle Modelle auflistetdie OpenAPI-Beschreibung ist diese Übersicht

Fallen

Quellen im Code und in der Wissensdatenbank
  • CDMS/cdms-generator – api/ApiProcessor, ApiSingletonProcessor, ApiHubProcessor, AbstractProcessor (isUploadExposed, isDownloadExposed)
  • CDMS/cdms-generator – loader/CdmsYamlLoader.parseEndpoints
  • CDMS/cdms-rest-api – AbstractRestApi, AbstractRestSingletonApi, AbstractHubApi
  • documentation/20-api/01-endpunkte.md, 05-api-guide/03-was-geht.md
Suchen