REST · vorgang.transportieren.2010
Prüfbericht erstellen und hochladen
Dieser Use Case beschreibt, wie eine Zugelassene Untersuchungsstelle ein XWasser-Minimalbeispiel für einen Prüfbericht vorbereitet, korrekt adressiert und anschließend an SHAPTH übermittelt.
Zugelassene Untersuchungsstelle
POST
/api/v1/xwasser/v100Weitere Informationen zu Basis-URLs und Umgebungen stehen im
Kapitel Endpunkte.
XML-Minimalbeispiel herunterladen
Der Prüfbericht wird als XWasser-Nachricht des Typs 2010 über den versionierten REST-Endpunkt übertragen. Vor dem Versand müssen die technischen Kopfwerte und die fachlichen Angaben im XML zum konkreten Testfall passen.
Allgemeiner Aufbau einer XWasser-Nachricht (Prüfbericht)
Der folgende Teil erläutert den grundsätzlichen XML-Aufbau einer XWasser-konformen Nachricht, die einen Prüfbericht enthält. Sie richtet sich an Software-Hersteller, die Prüfberichte über die SHAPTH-Schnittstelle erzeugen und übermitteln möchten. Es werden nachfolgend nicht alle Attribute des Prüfberichts beschrieben. Maßgeblich hierfür bleiben die XWasser-Spezifikation, die XML-Schema-Dateien und die XWasser-Codelisten. Ziel dieser Seite ist es, die übergeordnete Nachrichtenstruktur verständlich zu machen und die wichtigsten Strukturebenen einer Nachricht, die einen Prüfbericht enthält, einzuordnen.
Grundprinzip
Ein Prüfbericht wird in XWasser nicht als isoliertes XML-Fragment übermittelt. Er ist Teil einer vollständigen XWasser-Nachricht.
Die Nachricht besteht vereinfacht aus:
<xwas:vorgang.transportieren.2010>
<nachrichtenkopf.g2g>
...
</nachrichtenkopf.g2g>
<xwas:vorgang>
...
<xwas:vorgangType>
<xwas:pruefbericht>
...
</xwas:pruefbericht>
</xwas:vorgangType>
</xwas:vorgang>
</xwas:vorgang.transportieren.2010>Die XWasser-Nachricht zur Übermittlung eines Prüfberichts lässt sich vereinfacht in drei zentrale Ebenen unterteilen:
| Ebene | Bedeutung |
|---|---|
| Transportnachricht | Technische XWasser-Nachricht, hier vorgang.transportieren.2010 |
| Nachrichtenkopf | Identifikation und Adressierung der Nachricht |
| Vorgang mit Prüfbericht | Fachlicher Inhalt der Nachricht |
Wurzelelement: vorgang.transportieren.2010
<xwas:vorgang.transportieren.2010
standard="XWasser"
version="1.0.0">
...
</xwas:vorgang.transportieren.2010>vorgang.transportieren.2010 wird verwendet, wenn ein neuer fachlicher Vorgang transportiert wird. Der eigentliche fachliche Inhalt kann dabei ein Prüfbericht, ein Untersuchungsplan oder ein OLB-Bericht sein. Bei einer Nachricht zur Übermittlung eines Prüfberichts befindet sich unterhalb des Vorgangs im Element xwas:vorgangType das Element xwas:pruefbericht. Die XWasser-Spezifikation beschreibt vorgangType entsprechend als Auswahlstruktur für Untersuchungsplan, Pruefbericht oder OLB-Bericht.
Wichtige Attribute am Wurzelelement sind insbesondere:
| Attribut | Bedeutung |
|---|---|
standard | Name des Standards, z. B. XWasser |
version | verwendete XWasser-Version, z. B. 1.0.0 |
produkt | erzeugendes Softwareprodukt |
produkthersteller | Hersteller des erzeugenden Softwareprodukts |
produktversion | Version des erzeugenden Softwareprodukts |
test | Kennzeichnung als Testnachricht, sofern vorgesehen |
Die XWasser-Version im XML muss zum verwendeten SHAPTH-Endpunkt passen.
Nachrichtenkopf: nachrichtenkopf.g2g
Direkt unterhalb des Wurzelelements steht der Nachrichtenkopf:
<nachrichtenkopf.g2g>
<identifikation.nachricht>
...
</identifikation.nachricht>
<leser>
...
</leser>
<autor>
...
</autor>
</nachrichtenkopf.g2g>Der Nachrichtenkopf beschreibt die Nachricht selbst. Er enthält insbesondere Informationen zur eindeutigen Identifikation der Nachricht, zum fachlichen Absender und Empfänger sowie optional weitere technische Angaben für den Transportkontext:
| Bestandteil | Bedeutung |
|---|---|
identifikation.nachricht | eindeutige Identifikation der Nachricht |
leser | fachlicher Empfänger der Nachricht |
autor | fachlicher Absender der Nachricht |
referenzUUID | optionale Referenz auf eine vorherige Nachricht. Bestandteil von identifikation.nachricht |
dvdvDienstkennung | optionale Dienstkennung im DVDV-/OSCI-Kontext |
Der Nachrichtenkopf ist nicht der Prüfbericht. Er enthält Metadaten zur Nachricht und zur fachlichen Adressierung.
Innerhalb des Nachrichtenkopfs befindet sich die identifikation.nachricht:
<identifikation.nachricht>
<nachrichtenUUID>c3312556-d42d-48e1-a66e-6a3a7a65e24f</nachrichtenUUID>
<nachrichtentyp>
<code>2010</code>
</nachrichtentyp>
<erstellungszeitpunkt>2026-03-01T15:00:00</erstellungszeitpunkt>
</identifikation.nachricht>Die drei zentralen Angaben sind:
| Element | Bedeutung |
|---|---|
nachrichtenUUID | eindeutige Kennung der konkreten Nachricht |
nachrichtentyp | Typ der Nachricht, bei Prüfberichtübermittlung 2010 |
erstellungszeitpunkt | Zeitpunkt der Erstellung der XML-Nachricht |
Die nachrichtenUUID ist für die Nachricht selbst vorgesehen. Sie ist nicht identisch mit der Vorgangs-ID und nicht identisch mit der Prüfbericht-UUID.
Im Nachrichtenkopf werden außerdem Autor und Leser angegeben.
<leser>
<verzeichnisdienst listVersionID="3" listURI="urn:xoev-de:kosit:codeliste:verzeichnisdienst">
<code>DVDV</code>
</verzeichnisdienst>
<kennung>ghb:<DUMMY-SHAPTH-ID></kennung>
<name>Beispiel Gesundheitsamt</name>
</leser>
<autor>
<verzeichnisdienst listVersionID="3" listURI="urn:xoev-de:kosit:codeliste:verzeichnisdienst">
<code>DVDV</code>
</verzeichnisdienst>
<kennung>lab:<DUMMY-SHAPTH-ID></kennung>
<name>Beispiel Labor</name>
</autor>Bei der Prüfberichtübermittlung gilt typischerweise:
| Element | Bedeutung |
|---|---|
autor | sendende Stelle, hier z. B. die Zugelassene Untersuchungsstelle bzw. das Labor |
leser | empfangende Stelle, hier z. B. die Zuständige Behörde, z. B. Gesundheitsamt. Kann auch der Betreiber sein. |
Für die Kennung wird das fachliche Präfix vor die jeweilige SHAPTH-ID gesetzt:
| Präfix | Bedeutung |
|---|---|
lab | Zugelassene Untersuchungsstelle |
wsp | Wasserversorger (Betreiber) |
Die Angaben im Nachrichtenkopf müssen zur fachlichen Situation passen. Insbesondere sollte der Autor im Nachrichtenkopf zur im Prüfbericht angegebenen Untersuchungsstelle passen.
Vorgang: xwas:vorgang
Nach dem Nachrichtenkopf folgt der fachliche Vorgang:
<xwas:vorgang>
<xwas:identifikationVorgang>
<xwas:vorgangsID>...</xwas:vorgangsID>
</xwas:identifikationVorgang>
<xwas:vorgangType>
<xwas:pruefbericht>
...
</xwas:pruefbericht>
</xwas:vorgangType>
</xwas:vorgang>Der Vorgang bildet die fachliche Klammer um den übermittelten Inhalt.
Wichtig ist die Unterscheidung zwischen Nachricht und Vorgang:
| ID | Ebene | Bedeutung |
|---|---|---|
nachrichtenUUID | Nachricht | Identifiziert die konkrete technische Nachricht |
vorgangsID | Vorgang | Identifiziert den fachlichen Vorgang |
pruefberichtUUID | Prüfbericht | Identifiziert den fachlichen Prüfbericht |
Ein Vorgang kann im weiteren Verlauf mehrere Nachrichten umfassen. Die Vorgangs-ID ist daher nicht mit der Nachrichten-UUID gleichzusetzen.
Innerhalb des Vorgangs befindet sich der Vorgangstyp:
<xwas:vorgangType>
<xwas:pruefbericht>
...
</xwas:pruefbericht>
</xwas:vorgangType>vorgangType ist die Stelle, an der der konkrete fachliche Inhalt der Vorgangsnachricht eingehängt wird.
Für Prüfberichte ist hier das Element xwas:pruefbericht zu verwenden.
Andere Vorgangstypen, z. B. Untersuchungsplan oder OLB-Bericht, werden an dieser Stelle nicht verwendet, wenn eine Nachricht zur Übermittlung eines Prüfberichts erzeugt werden soll.
Der Prüfbericht selbst befindet sich unterhalb von:
<xwas:vorgang>
<xwas:vorgangType>
<xwas:pruefbericht>
...
</xwas:pruefbericht>
</xwas:vorgangType>
</xwas:vorgang>Der Prüfbericht enthält die fachlichen Inhalte, insbesondere Angaben zu:
Hier werden die fachlichen Einzelfelder im Prüfbericht-Body nicht vollständig beschrieben. Für die konkrete Befüllung der einzelnen Prüfberichtfelder sind die XWasser-Spezifikation, die XSDs, Codelisten und Business Rules maßgeblich.
Für die strukturelle Einordnung ist entscheidend, dass der Prüfbericht nicht der Nachrichtenkopf, sondern der fachliche Inhalt des Vorgangs ist.
Optionale Anlagen
Anlagen werden nicht im Nachrichtenkopf, sondern im Vorgang abgebildet.
<xwas:vorgang>
...
<xwas:anlage dokumentID="anhang1">
...
</xwas:anlage>
</xwas:vorgang>Wenn im Prüfbericht oder in einer Probe auf einen Anhang verwiesen wird, muss ein dazu passender Anlagenblock mit entsprechender dokumentID vorhanden sein. Wenn kein Anhang übermittelt werden soll, sollten weder Anhangreferenzen noch verwaiste Anlagenblöcke enthalten sein.
Optionale Signatur
XWasser sieht die Möglichkeit vor, Nachrichten oder Nachrichtenteile zu signieren. Die Signatur ist strukturell von der fachlichen Prüfberichtbefüllung zu unterscheiden.
Die Signatur dient insbesondere dem Nachweis der Integrität und der Autorenschaft bzw. Zuordnung des signierten Inhalts. Ob und wie eine Signatur zu verwenden ist, richtet sich nach den Vorgaben der XWasser-Spezifikation und den SHAPTH-spezifischen Anforderungen. Nach der Signatur darf der signierte Inhalt nicht mehr verändert werden, da die Signatur sonst ungültig wird.
Strukturübersicht
Die folgende Übersicht fasst die zuvor beschriebenen Strukturebenen einer Nachricht zur Übermittlung eines Prüfberichts zusammen:
<xwas:vorgang.transportieren.2010>
|
+-- <nachrichtenkopf.g2g>
| |
| +-- <identifikation.nachricht>
| | +-- <nachrichtenUUID>
| | +-- <nachrichtentyp>
| | +-- <erstellungszeitpunkt>
| |
| +-- <leser>
| | +-- <verzeichnisdienst>
| | +-- <kennung>
| | +-- <name>
| |
| +-- <autor>
| +-- <verzeichnisdienst>
| +-- <kennung>
| +-- <name>
|
+-- <xwas:vorgang>
|
+-- <xwas:identifikationVorgang>
| +-- <xwas:vorgangsID>
|
+-- <xwas:vorgangType>
| +-- <xwas:pruefbericht>
| +-- fachlicher Prüfbericht-Body
|
+-- optional: <xwas:bemerkung>
+-- optional: <xwas:anlage>
+-- optional: <xwas:erweiterung>Diese Struktur sollte bei der Erzeugung einer Nachricht zur Übermittlung eines Prüfberichts immer vollständig betrachtet werden. Eine gültige Prüfberichtübermittlung besteht nicht nur aus dem Element xwas:pruefbericht, sondern aus der gesamten XWasser-Nachricht.
Für die Generierung des XML-Bodys ist jedes Tool für die Arbeit mit XSD verwendbar. SHAPTH bietet auch eine Implementierung in Form eines WebAssembly-Pakets und einer Rust-Bibliothek, die für UI oder Backend verwendet werden kann.
Für die Validierung mit dem XML-Schema kann jedes beliebige Tool verwendet werden. SHAPTH selbst bietet zusätzlich eine Validierungsmöglichkeit in der Benutzeroberfläche an.
Konkretes Minimalbeispiel
Praktische Anpassung der Ausgangsdatei
Überblick
Das verlinkte Minimalbeispiel ist eine Ausgangsdatei. Es zeigt die Struktur eines Prüfberichts unter xwas:vorgang > xwas:vorgangType > xwas:pruefbericht, enthält aber noch Werte, die vor dem Senden angepasst werden müssen.
| Bereich | Was zu prüfen ist | Warum es wichtig ist |
|---|---|---|
| Download | XML-Minimalbeispiel herunterladen und als Ausgangsdatei verwenden | Alle weiteren Anpassungen beziehen sich auf diese Datei. |
| Nachrichten-UUID | nachrichtenUUID für jede Übermittlung neu setzen | SHAPTH muss jede Nachricht eindeutig erkennen können. |
| Autor und Leser | autor und leser mit dem richtigen Präfix statt psw adressieren | Die fachliche Richtung der Nachricht muss eindeutig zum Sender und Empfänger passen. |
| Anhang | Anhang-Referenz und Anlagenblock aus dem Minimalbeispiel entfernen | Das Beispiel sollte zur Vereinfachung erster Tests ohne referenzierten Anhang gesendet werden. |
| IDs | zugelasseneUntersuchungsstelleID und auftraggeberID ergänzen | Zugelassene Untersuchungsstelle und Auftraggeber müssen fachlich zuordenbar sein. |
| Platzhalter | DUMMY-Werte durch Testdaten ersetzen | Platzhalterwerte führen zu fachlich unbrauchbaren oder abgelehnten Nachrichten. |
| Upload | Access Token abrufen und XML per POST an den REST-Endpunkt senden | Erst der Upload übermittelt den vorbereiteten Prüfbericht an SHAPTH. |
Schrittweise Herangehensweise zum Erstellen und Hochladen des Prüfbericht-Minimalbeispiels
Laden Sie das XML-Minimalbeispiel für den Prüfbericht herunter und verwenden Sie es als Startpunkt für den Testfall.
Vergeben Sie für jede neue Übermittlung eine neue nachrichtenUUID.
<identifikation.nachricht>
<nachrichtenUUID>693c64d6-456f-4d14-abe7-fe9681c74abd</nachrichtenUUID>
...
</identifikation.nachricht>Für einen Prüfbericht von Labor an Behörde ist autor die sendende zugelassene Untersuchungsstelle und leser die empfangende zuständige Behörde. Ersetzen Sie ein vorhandenes psw-Präfix durch das fachlich richtige Präfix, zum Beispiel lab für die Untersuchungsstelle und ghb für das Gesundheitsamt.
<leser>
<verzeichnisdienst listVersionID="">
<code></code>
</verzeichnisdienst>
<kennung>ghb:<DUMMY-SHAPTH-ID></kennung>
<name>Beispiel Gesundheitsamt</name>
</leser>
<autor>
<verzeichnisdienst listVersionID="">
<code></code>
</verzeichnisdienst>
<kennung>lab:<DUMMY-SHAPTH-ID></kennung>
<name>API Doku Lab</name>
</autor>Für das Minimalbeispiel ohne Anhang entfernen Sie die Referenz auf den Anhang in der Probe und den zugehörigen Anlagenblock am Ende des Vorgangs.
<xwas:anhang>anhang1</xwas:anhang><xwas:anlage dokumentID="anhang1">
<xwas:dokumentTyp listURI="urn:xoev-de:xwasser:codeliste:dokumenttyp" listVersionID="1">
<code>1010</code>
</xwas:dokumentTyp>
<xwas:name>Anlage 1</xwas:name>
<xwas:dokumentRepraesentation dokumentRepraesentationID="doc1">
<xwas:mimeType>application/pdf</xwas:mimeType>
<xwas:dateiname>Test.pdf</xwas:dateiname>
<xwas:inhaltTyp>pdf</xwas:inhaltTyp>
</xwas:dokumentRepraesentation>
</xwas:anlage>Ergänzen Sie die ID der beauftragten Untersuchungsstelle und die ID des Auftraggebers in den jeweiligen fachlichen Blöcken.
<xwas:auftraggeber>
<xwas:auftraggeberID><DUMMY-SHAPTH-ID></xwas:auftraggeberID>
...
</xwas:auftraggeber>
<xwas:beauftragteUntersuchungsstelle>
...
<xwas:zugelasseneUntersuchungsstelleID><DUMMY-SHAPTH-ID></xwas:zugelasseneUntersuchungsstelleID>
</xwas:beauftragteUntersuchungsstelle>Ersetzen Sie alle DUMMY-Platzhalter im XML durch konkrete Werte für den Testfall. Prüfen Sie besonders Namen, Kennungen und fachliche IDs.
<!-- Vor dem Versand keine DUMMY-Werte im XML belassen -->
<xwas:name>API Doku Lab</xwas:name>
<xwas:auftraggeberID><DUMMY-SHAPTH-ID></xwas:auftraggeberID>Der Upload per cURL ist die einfachste Möglichkeit, einen Prüfbericht zu übermitteln. Zuerst wird ein Access Token abgerufen, anschließend wird die vorbereitete XML-Datei an den REST-Endpunkt gesendet.
# 1) Access Token abrufen
TOKEN=$(curl -s \
-d "client_id=<CLIENT_ID>" \
-d "client_secret=<CLIENT_SECRET>" \
-d "grant_type=client_credentials" \
"https://pre.id.shapth.de/realms/shapth/protocol/openid-connect/token" | jq -r .access_token)
# 2) Prüfbericht (XML) hochladen
curl -i -X POST "https://pre.www.shapth.de/api/v1/xwasser/v100" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/xml;charset=utf-8" \
-H "Accept: application/xml" \
--data-binary @/Pfad/zu/pruefbericht.xmlDas folgende Rust-Beispiel zeigt Tokenabruf und XML-Upload in einer Anwendung.
#[derive(Parser)]
struct SendCommand {
/// Client id.
#[arg(long, env)]
client_id: String,
/// Client secret.
#[arg(long, env)]
client_secret: String,
/// Authorization endpoint.
#[arg(
long,
env,
default_value = "https://pre.id.shapth.de/realms/shapth/protocol/openid-connect/token"
)]
token_url: String,
/// xWasser endpoint (REST, XML).
#[arg(
long,
env,
default_value = "https://pre.www.shapth.de/api/v1/xwasser/v100"
)]
api_url: String,
/// Path to XML message.
#[arg(long, env)]
xml: std::path::PathBuf,
}
impl SendCommand {
fn run(&self) -> anyhow::Result<()> {
let client = reqwest::blocking::Client::new();
// 1) Access Token abrufen
let response = client
.post(&self.token_url)
.form(&[
("client_id", self.client_id.as_str()),
("client_secret", self.client_secret.as_str()),
("grant_type", "client_credentials"),
])
.send()?;
#[derive(serde::Deserialize)]
struct Bearer { access_token: String }
let bearer: Bearer = check_error(response)?.json()?;
// 2) XML-Datei laden und hochladen
let xml = std::fs::read_to_string(&self.xml)?;
let response = client
.post(&self.api_url)
.bearer_auth(bearer.access_token)Checkliste vor dem Versand
| Prüfung | Erwartung |
|---|---|
| Nachrichten-UUID | Für jeden erneuten Versand neu vergeben. |
| Leser | Empfangende Behörde mit richtigem Präfix, zum Beispiel ghb:<DUMMY-SHAPTH-ID>. |
| Autor | Sendende Untersuchungsstelle mit richtigem Präfix, zum Beispiel lab:<DUMMY-SHAPTH-ID>. |
| Anhang | Anhang-Referenz und Anlagenblock entfernt. |
| Untersuchungsstelle | zugelasseneUntersuchungsstelleID ergänzt. |
| Auftraggeber | auftraggeberID ergänzt. |
| DUMMY | Alle DUMMY-Platzhalter ersetzt. |
| Prüfberichts-Version | Die pruefberichtUUID identifiziert den konkreten Prüfbericht nachrichtenübergreifend. Bei Korrekturen oder Teilergebnissen zu demselben Prüfbericht ist dieselbe pruefberichtUUID weiterzuverwenden. In diesen Fällen ist stattdessen die versionsnummer entsprechend hochzuzählen. Bei Versand eines neuen Prüfberichts ist eine neue pruefberichtUUID zu vergeben. Die pruefberichtIDLabor ist die laborinterne Prüfberichts-ID und muss zur Identifikation im Laborsystem passen. |
Ein erfolgreicher HTTP-Aufruf bedeutet nicht automatisch, dass der fachliche Vorgang endgültig abgeschlossen ist. Die Einordnung von HTTP-Erfolg, XWasser-Quittungen und fachlicher Annahme ist im allgemeinen Teil unter HTTP-Statuscodes beschrieben.