SHAPTH
Use Case

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.

Rolle

Zugelassene Untersuchungsstelle

Endpoint

POST

/api/v1/xwasser/v100

Weitere 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:

Grundstruktur
<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:

EbeneBedeutung
TransportnachrichtTechnische XWasser-Nachricht, hier vorgang.transportieren.2010
NachrichtenkopfIdentifikation und Adressierung der Nachricht
Vorgang mit PrüfberichtFachlicher Inhalt der Nachricht

Wurzelelement: vorgang.transportieren.2010

Wurzelelement
<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:

AttributBedeutung
standardName des Standards, z. B. XWasser
versionverwendete XWasser-Version, z. B. 1.0.0
produkterzeugendes Softwareprodukt
produktherstellerHersteller des erzeugenden Softwareprodukts
produktversionVersion des erzeugenden Softwareprodukts
testKennzeichnung 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
<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:

BestandteilBedeutung
identifikation.nachrichteindeutige Identifikation der Nachricht
leserfachlicher Empfänger der Nachricht
autorfachlicher Absender der Nachricht
referenzUUIDoptionale Referenz auf eine vorherige Nachricht. Bestandteil von identifikation.nachricht
dvdvDienstkennungoptionale Dienstkennung im DVDV-/OSCI-Kontext

Der Nachrichtenkopf ist nicht der Prüfbericht. Er enthält Metadaten zur Nachricht und zur fachlichen Adressierung.

Identifikation der Nachricht

Innerhalb des Nachrichtenkopfs befindet sich die identifikation.nachricht:

Beispiel für Identifikation der 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:

ElementBedeutung
nachrichtenUUIDeindeutige Kennung der konkreten Nachricht
nachrichtentypTyp der Nachricht, bei Prüfberichtübermittlung 2010
erstellungszeitpunktZeitpunkt 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.

Autor und Leser

Im Nachrichtenkopf werden außerdem Autor und Leser angegeben.

Beispiel für Autor und Leser
<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:

ElementBedeutung
autorsendende Stelle, hier z. B. die Zugelassene Untersuchungsstelle bzw. das Labor
leserempfangende 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äfixBedeutung
labZugelassene Untersuchungsstelle
wspWasserversorger (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:

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:

IDEbeneBedeutung
nachrichtenUUIDNachrichtIdentifiziert die konkrete technische Nachricht
vorgangsIDVorgangIdentifiziert den fachlichen Vorgang
pruefberichtUUIDPrüfberichtIdentifiziert den fachlichen Prüfbericht

Ein Vorgang kann im weiteren Verlauf mehrere Nachrichten umfassen. Die Vorgangs-ID ist daher nicht mit der Nachrichten-UUID gleichzusetzen.

Vorgangstyp: xwas:vorgangType

Innerhalb des Vorgangs befindet sich der Vorgangstyp:

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.

Prüfbericht-Body: xwas:pruefbericht

Der Prüfbericht selbst befindet sich unterhalb von:

Prüfbericht-Body
<xwas:vorgang>
<xwas:vorgangType>
  <xwas:pruefbericht>
    ...
  </xwas:pruefbericht>
</xwas:vorgangType>
</xwas:vorgang>

Der Prüfbericht enthält die fachlichen Inhalte, insbesondere Angaben zu:

Prüfberichtidentifikation
Probennahmestellen
Proben
Analyseergebnissen
Auftraggeber
Beauftragte Untersuchungsstelle
Zuständige Behörde
Validierung und Freigabe
Ggf. Anhänge und ergänzende Angaben

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.

Anlage (vereinfacht)
<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:

Strukturebenen
<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.

Erzeugung

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.

Validierung

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.

BereichWas zu prüfen istWarum es wichtig ist
DownloadXML-Minimalbeispiel herunterladen und als Ausgangsdatei verwendenAlle weiteren Anpassungen beziehen sich auf diese Datei.
Nachrichten-UUIDnachrichtenUUID für jede Übermittlung neu setzenSHAPTH muss jede Nachricht eindeutig erkennen können.
Autor und Leserautor und leser mit dem richtigen Präfix statt psw adressierenDie fachliche Richtung der Nachricht muss eindeutig zum Sender und Empfänger passen.
AnhangAnhang-Referenz und Anlagenblock aus dem Minimalbeispiel entfernenDas Beispiel sollte zur Vereinfachung erster Tests ohne referenzierten Anhang gesendet werden.
IDszugelasseneUntersuchungsstelleID und auftraggeberID ergänzenZugelassene Untersuchungsstelle und Auftraggeber müssen fachlich zuordenbar sein.
PlatzhalterDUMMY-Werte durch Testdaten ersetzenPlatzhalterwerte führen zu fachlich unbrauchbaren oder abgelehnten Nachrichten.
UploadAccess Token abrufen und XML per POST an den REST-Endpunkt sendenErst der Upload übermittelt den vorbereiteten Prüfbericht an SHAPTH.

Schrittweise Herangehensweise zum Erstellen und Hochladen des Prüfbericht-Minimalbeispiels

Minimalbeispiel herunterladen

Laden Sie das XML-Minimalbeispiel für den Prüfbericht herunter und verwenden Sie es als Startpunkt für den Testfall.

Nachrichtenkopf eindeutig setzen

Vergeben Sie für jede neue Übermittlung eine neue nachrichtenUUID.

Nachrichten-UUID
<identifikation.nachricht>
<nachrichtenUUID>693c64d6-456f-4d14-abe7-fe9681c74abd</nachrichtenUUID>
...
</identifikation.nachricht>
Leser und Autor fachlich korrekt adressieren

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.

Adressierung Labor an 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>
Anhang entfernen

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.

1. Anhang-Referenz in der Probe entfernen
<xwas:anhang>anhang1</xwas:anhang>
2. Anlagenblock am Ende des Vorgangs entfernen
<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>
Untersuchungsstellen-ID und Auftraggeber-ID hinzufügen

Ergänzen Sie die ID der beauftragten Untersuchungsstelle und die ID des Auftraggebers in den jeweiligen fachlichen Blöcken.

Fachliche IDs
<xwas:auftraggeber>
<xwas:auftraggeberID><DUMMY-SHAPTH-ID></xwas:auftraggeberID>
...
</xwas:auftraggeber>

<xwas:beauftragteUntersuchungsstelle>
...
<xwas:zugelasseneUntersuchungsstelleID><DUMMY-SHAPTH-ID></xwas:zugelasseneUntersuchungsstelleID>
</xwas:beauftragteUntersuchungsstelle>
DUMMY-Werte ersetzen

Ersetzen Sie alle DUMMY-Platzhalter im XML durch konkrete Werte für den Testfall. Prüfen Sie besonders Namen, Kennungen und fachliche IDs.

Platzhalter ersetzen
<!-- Vor dem Versand keine DUMMY-Werte im XML belassen -->
<xwas:name>API Doku Lab</xwas:name>
<xwas:auftraggeberID><DUMMY-SHAPTH-ID></xwas:auftraggeberID>
Upload des Prüfberichts

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.

Tokenabfrage und Upload mit cURL
# 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.xml

Das folgende Rust-Beispiel zeigt Tokenabruf und XML-Upload in einer Anwendung.

Rust-Beispielclient für Tokenabruf und Upload
#[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üfungErwartung
Nachrichten-UUIDFür jeden erneuten Versand neu vergeben.
LeserEmpfangende Behörde mit richtigem Präfix, zum Beispiel ghb:<DUMMY-SHAPTH-ID>.
AutorSendende Untersuchungsstelle mit richtigem Präfix, zum Beispiel lab:<DUMMY-SHAPTH-ID>.
AnhangAnhang-Referenz und Anlagenblock entfernt.
UntersuchungsstellezugelasseneUntersuchungsstelleID ergänzt.
AuftraggeberauftraggeberID ergänzt.
DUMMYAlle DUMMY-Platzhalter ersetzt.
Prüfberichts-VersionDie 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.

On this page