Datensatzserie fortführen per API¶
Dieser Guide beschreibt, wie eine bestehende Datensatzserie (z. B. monatliche Berichte) um einen neuen Zeitraum-Eintrag erweitert wird.
Eine Datensatzserie fasst mehrere zeitlich aufeinander folgende Datensätze unter einer gemeinsamen Datensatzserien-Entität zusammen. Die bestehenden Metadaten (Katalog, Lizenz, Herausgeber, Kategorien) werden von der Serie übernommen – nur die neue CSV-Datei, der neue Zeitraum und die Referenz auf den vorherigen Datensatz müssen angegeben werden.
Das Fortführen setzt einen bereits vorhandenen Datensatz voraus, der über die API hochgeladen wurde. Ist dieser Datensatz bereits Teil einer Datensatzserie, wird die Serie um den neuen Eintrag erweitert. Ist er noch nicht Teil einer Serie, legt das Backend automatisch eine neue Datensatzserie an und fügt beide Datensätze ein.
Die vollständige API-Referenz ist in der Swagger-Dokumentation verfügbar: staging-backend.odi.schleswig-holstein.de/docs
Test-System verfügbar
Für die Entwicklung und Tests steht ein Staging-System bereit. Die Zugangsdaten (Keycloak-URL, Realm, Client-Credentials) sind auf Anfrage erhältlich. Bitte wende dich dazu an das ODI-Team.
Voraussetzungen¶
- Client-ID und Client-Secret des Service Accounts liegen vor
datasetIddes zuletzt veröffentlichten Datensatzes der Serie (previousDatasetId) ist bekannt- CSV-Datei ist lokal vorhanden, Encoding und Delimiter sind bekannt
- Optional: Schema-Version des Schemas ist bekannt (siehe Schema-Repository)
Was ist eine Datensatzserie?¶
Eine Datensatzserie ist eine logische Gruppierung von Datensätzen, die regelmäßig oder kontinuierlich aktualisiert werden –
z. B. monatliche Verkehrszählungen oder jährliche Schulstatistiken.
In den Metadatenstandards DCAT-AP (Europa) und DCAT-AP.de (Deutschland) wird dieses Konzept als dcat:DatasetSeries beschrieben.
Alle Einträge der Serie teilen dieselben Metadaten (Katalog, Lizenz, Herausgeber, Kategorien).
Jeder neue Eintrag referenziert über previousDatasetId den unmittelbar vorherigen Datensatz in der Serie –
dadurch entsteht eine nachvollziehbare chronologische Kette.
Token abrufen (Keycloak Service Account)¶
Alle schreibenden API-Requests erfordern ein gültiges JWT-Token, für das ein Service Account notwendig ist.
Tip
Der Service-Account wird vom Administrator angelegt. Eine ausführliche Anleitung zur Einrichtung findet sich unter Programmatischen API-Zugriff einrichten.
Die Zugangsdaten bestehen aus einer Client-ID und einem Client-Secret.
Request:
curl -X POST \
"https://keycloak.odi.schleswig-holstein.de/realms/open-data-infrastruktur/protocol/openid-connect/token" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=client_credentials" \
-d "client_id=<client-id>" \
-d "client_secret=<client-secret>"
Beispiel-Response:
{
"access_token": "eyJ...",
"expires_in": 300,
"token_type": "Bearer"
}
Den Wert von access_token im nächsten Schritt als Bearer-Token verwenden.
Warning
Client-Secrets niemals in Versionsverwaltungssystemen oder Logs speichern.
Tokens sind zeitlich begrenzt gültig (expires_in Sekunden); nach Ablauf muss ein neuer Token angefordert werden.
Datensatzserie fortführen¶
Endpunkt¶
POST https://staging-backend.odi.schleswig-holstein.de/upload/csv/append
Felder (Request Body)¶
| Feld | Pflicht | Typ | Beschreibung |
|---|---|---|---|
previousDatasetId |
Pflicht | string | ID des zuletzt veröffentlichten Datensatzes der Serie |
datasetId |
Pflicht | string | Frei wählbare ID des neuen Datensatzes |
startDate |
Pflicht | string | Startdatum des neuen Zeitraums (ISO 8601, z. B. 2024-02-01) |
endDate |
Optional | string | Enddatum des neuen Zeitraums (ISO 8601) |
schemaVersion |
Optional | string | Version des Schemas (z. B. 1.1.1) – wird von der bestehenden Serie übernommen |
delimiter |
Pflicht | string | Trennzeichen der CSV-Datei (z. B. ; oder ,) |
encoding |
Pflicht | string | Zeichenkodierung (z. B. UTF-8) |
quote |
Pflicht | string | Anführungszeichen-Zeichen (z. B. ") |
file |
Pflicht | binary | Die neue CSV-Datei |
datasetTitle |
Optional | string | Titel des neuen Datensatzes (wird von der Serie übernommen, falls leer) |
dataSeriesId |
Pflicht* | string | ID der Datensatzserie – nur erforderlich beim Erstellen einer neuen Serie |
datasetDescription |
Optional | string | Beschreibung des neuen Datensatzes – nur beim Erstellen einer neuen Serie |
dataSeriesTitle |
Optional | string | Titel der Serie – nur beim Erstellen einer neuen Serie |
dataSeriesDescription |
Optional | string | Beschreibung der Serie – nur beim Erstellen einer neuen Serie |
* dataSeriesId ist nur erforderlich, wenn das Backend eine neue Datensatzserie anlegen soll.
Info
Metadaten wie Katalog, Lizenz, Herausgeber, Kategorien und Raumbezug werden automatisch von der bestehenden Datensatzserie übernommen und müssen nicht erneut angegeben werden.
Beispiel-Request¶
curl -X POST \
"https://staging-backend.odi.schleswig-holstein.de/upload/csv/append" \
-H "Authorization: Bearer <access_token>" \
-F "previousDatasetId=<vorheriger-datensatz-id>" \
-F "datasetId=mein-datensatz-2024-02" \
-F "startDate=2024-02-01T00:00:00" \
-F "schemaVersion=1.1.1" \
-F "delimiter=;" \
-F "encoding=UTF-8" \
-F 'quote="' \
-F "file=@/pfad/zur/neuen-datei.csv"
Beispiel-Response (Erfolg)¶
{
"datasetId": "mein-datensatz-2024-02"
}
Beispiel-Response (Fehlerfall – Validierung fehlgeschlagen)¶
{
"status": "error",
"type": "invalid file",
"message": "Validation of Csv-File was not valid!",
"context": "CsvUploadService",
"errors": [
{
"description": "The cell \"Harburg\" in row at position \"2\" and field \"KREIS\" at position \"1\" does not conform to a constraint: constraint \"enum\" is \"['Dithmarschen', 'Kiel', 'Lübeck', ...]\"",
"index": 2,
"field": "KREIS"
}
]
}
Im Fehlerfall wird ein Validierungsbericht im frictionless-Report-Format zurückgeliefert.
Fehlercodes¶
| HTTP-Status | Bedeutung | Mögliche Ursache / Lösung |
|---|---|---|
| 400 | Ungültige Anfrage | Pflichtfeld fehlt, falsches Format oder CSV entspricht nicht dem Schema |
| 401 | Nicht authentifiziert | Token fehlt oder abgelaufen → neuen Token abrufen |
| 403 | Keine Berechtigung | Service Account hat nicht die erforderliche Rolle |
| 413 | Datei zu groß | Datei übersteigt das serverseitige Größenlimit |
| 500 | Interner Serverfehler | Kontakt zum ODI-Support aufnehmen |
Nächste Schritte¶
- Datensatz aktualisieren per API – eine bestehende CSV-Version ersetzen (
PUT /upload/csv/overwrite/{datasetId}) - Datensatz hochladen per API – einen neuen Datensatz (außerhalb einer Serie) anlegen