XML Schnittstelle

Produktlinien: Expert
Module: Leistung & CRM
Erstellt: 23.01.2004, Änderung:
Beispiel aus einem VB Script bei Authentisierung hinzugefügt.
Mehr ansehen

Dieser Artikel beschreibt die XML Schnittstelle von Vertec. Diese wird vom Vertec XML Server bereitgestellt.

Die Kommunikation basiert auf dem Request / Response Schema. Ein Client schickt via HTTP POST eine in XML formulierte Anfrage und erhält als Ergebnis eine Antwort in XML.

Das Format der dabei verwendeten XML Messages basiert auf der SOAP Spezifikation. Vollständige SOAP Kompatibilität ist nicht umgesetzt, insbesondere die Behandlung von XML Namespaces fehlt. Namespaces können in Requests verwendet werden, finden aber keine Beachtung. Die Response Messages verwenden keine Namespace Informationen.

Der Aufbau der XML Messages ist grundsätzlich immer gleich. So enthält jede Message, ob Request oder Response, immer das Grundelement Envelope und als Unterelement 'Body':

<Envelope>
   <Body>
   </Body>
 </Envelope>

XML Request

Der XML Request enthält einen Header, in welchem die Authentisierungs-Informationen übertragen werden. Der Body enthält dann die Abfrage mit OCL Expression.

<Envelope>
  <Header>
  </Header>
  <Body>
  </Body>
 </Envelope>

Authentisierung

Die Authentisierung erfolgt in zwei Schritten:

  1. Authentisierung: Der Client muss einen Authentisierungs-Request mit Angabe von Username/Password an den Cloud-Server senden.
    • Senden von HTTP POST Request mit Parametern vertec_username und password an /auth/xml.
    • Als Antwort wird ein Authentisierungs-Token (ein langer String) gesendet.
    • Beispiel aus einem Python Script:
      import requests
      
      authurl = 'http://localhost/auth/xml'
      xmlurl = 'http://localhost/xml
      params = {'vertec_username':'keller', 'password':'UXhfn6P.'}
      r = requests.post(authurl, params)
      token = r.text

      Dafür muss das requests-Modul vorhanden sein, siehe z.B. http://docs.python-requests.org/en/master/.

    • Beispiel aus einem VB Script:
      Set XML = CreateObject("MSXML2.XMLHTTP")
      XML.Open "POST", "http://localhost:8081/auth/xml", False
      XML.send "&vertec_username=administrator&password="
      token = XML.responsetext
  2. XML Requests: Der Client muss das Authentisierungs-Token bei jedem Request im XML Request einsetzen, damit dieser akzeptiert wird. Das Token wird als <Token> Element unter <BasicAuth> eingesetzt. Beispiel:
    <Envelope>
      <Header>
        <BasicAuth><Token>.....token ......</Token></BasicAuth>
      </Header>
      <Body>
        <Query>
          <Selection>
            <ocl>projektbearbeiter</ocl>
          </Selection>
        </Query>
      </Body>
    </Envelope>
    

Weitere Informationen dazu finden Sie im Artikel über den XML Server.

Authentisierung bei Verwendung des XML Servers via Vertec Service (Legacy)

Wird der XML Server über den Vertec Service betrieben, ist die Authentisierung Bestandteil jeder Request Message. Das dabei verwendete Format entspricht weitgehend der SOAP Extension Basic Authentication. Nicht implementiert ist der in dieser Spezifikation vorgesehene Challenge Mechanismus.

Zur Authentifizierung muss das SOAP Header Element ein Subelement folgender Form enthalten:

<Header>
  <BasicAuth>
    <Name>Administrator</Name>
    <Password></Password>
  </BasicAuth>
</Header>

Encoding

Der XML Server arbeitet mit UTF-8 encoding. Normalerweise funktioniert das ohne Probleme, jedenfalls mit den üblichen westeuropäischen Sonderzeichen. Manchmal jedoch wird das Encoding nur zuverlässig erkannt, wenn die XML Daten, die an den XML Server geschickt werden, mit einer XML Deklaration beginnen:

<?xml version="1.0" encoding="utf-8" ?>

Objekte abfragen (Query)

Query Element

Um Objekte mittels XML Message abzufragen, wird der Abfrage-Block in ein Query-Element verpackt. Dieses Element enthält wiederum die Elemente Selection und Resultdef.

Selection Element

Im Selection-Element wird die eigentliche Abfrage zusammengestellt. Folgende Unterelemente können verwendet werden:

  • ocl: Hier wird eine OCL-Expression angegeben:
    <ocl>projekt->select(aktiv)</ocl>
  • objref: Gibt die Objekt-ID eines Objekts in Vertec an (Normalerweise wird die Objekt-ID über eine vorhergehende XML Abfrage eruiert). Es können auch mehrere Objekte ausgewählt werden:
    <objref>4019</objref>
    <objref>5129</objref>
  • sqlwhere: Hier kann ein SQL-Filter angegeben werden:
    <sqlwhere>datum between '01.01.2016' and '30.05.2016'</sqlwhere>

    Der ausführende Benutzer muss über Administratorenrechte oder über das SQL Query Recht verfügen.

  • sqlorder: Die Einträge können sortiert werden:
    <sqlorder>bold_id</sqlorder>

Als Beispiel könnte man statt <ocl>projekt->select(aktiv)</ocl> auch die Variante via SQL wählen. Folgender Code ergibt das gleiche Resultat:

<Selection>
    <ocl>Projekt</ocl>
    <sqlwhere>aktiv = 1</sqlwhere>
</Selection>

Resultdef Element

Das Resultdef-Element gibt an, welche Informationen angefordert werden. Es können folgende Unterelemente verwendet werden:

  • member: Hier wird in OCL ein Member des Resultat-Objekts angegeben.Handelt es sich beim angegebenen Member um ein eigenständiges Objekt, wird davon die Vertec Objekt-ID zurückgeliefert (im Beispiel für das Member projekt).Es können beliebig viele Members aufgelistet werden.
  • alias-expression: Möchte man ein member um if-else-Bedingungen oder Berechnungen erweitern, wird ein Alias in einer Expression verwendet. In dieser können OCL-Expressions eingesetzt werden. Der Aufbau ist wie folgt:
    <expression>
     <alias>abgeschrieben</alias>
     <ocl>wertint-wertext</ocl>
     </expression>

    Im <ocl>-Bereich sind sämtliche OCL-Expressions möglich.

Es muss nicht unbedingt ein Resultdef Element angegeben werden. Wird nur ein einzelner Wert angefordert (und nicht, wie oben beschrieben, eine Liste von Objekten), kann dieses Element einfach weggelassen werden. Z.B. liefert die Selection <ocl>projektbearbeiter->size</ocl> die Anzahl Bearbeiter zurück. Die Response liefert dann einen <Value>Anzahl</Value> zurück.

Beispielabfrage

Eine Abfrage (Query) könnte wie folgt aussehen:

<Query>
  <Selection>
    <objref>676</objref>
    <ocl>offeneleistungen</ocl>
    <sqlwhere>datum between '01.10.2016' and '31.12.2016'</sqlwhere>
    <sqlorder>bold_id</sqlorder>
  </Selection>
  <Resultdef>
    <member>datum</member>
    <member>projekt</member>
    <member>text</member>
    <member>wertext</member>
  </Resultdef>
</Query>

QueryResponse Element

Das Resultat wird in einem QueryResponse-Element zurückgeliefert. Dieses enthält immer eine Auflistung von Objekten.

  • objid: Jedes zurückgelieferte Objekt wird als eigenständiges Element geliefert. Bei jedem dieser Result-Objekten wird eine objid mitgeliefert, welche die Vertec Objekt-ID enthält:
    <objid>7822</objid>

Des weiteren werden alle unter Resultdef angegebenen Members aufgelistet. Falls es sich dabei um eigenständige Objekte handelt, wird von diesen die Objektreferenz (Objekt-ID) mitgeliefert:

<Envelope>
  <Body>
    <QueryResponse>
      <OffeneLeistung>
        <objid>7822</objid>
        <datum>2006-04-28</datum>
        <projekt><objref>4164</objref></projekt>
        <text>Brief an Hr. Meier<text/>
        <wertExt>120.00</wertExt>
      </OffeneLeistung>
      ...

Anmerkung: Das Datumsformat ist ISO 8601.

Objekte erzeugen (Create)

Um ein Objekt zu erzeugen wird ein Create-Element verwendet. Dieses enthält eine Liste von zu erzeugenden Objekten. Als zu erzeugendes Objekt wird jeweils der entsprechende Klassenname angegeben. Die einzelnen Members enthalten entweder eine Objektreferenz (Objekt-ID) eines bestehenden Objektes in Vertec oder den beim Member einzutragenden Wert.

Als Beispiel wird eine offene Leistung erzeugt. Dieser wird ein bereits bestehender Bearbeiter und ein bereits bestehendes Projekt mittels Objekt-ID zugewisen. Als Aufwand wird im Attribut minutenint 45 Minuten eingetragen:

<Body>
  <Create>
    <OffeneLeistung>
      <bearbeiter><objref>4036</objref></bearbeiter>
      <projekt><objref>4132</objref></projekt>
      <minutenint>45</minutenint>
    </OffeneLeistung>
    ...
  </Create>
</Body>

CreateResponse Element

Zurückgeliefert wird ein CreateResponse Element. Dieses enthält eine Liste der erzeugten Objekten, die jeweils den Klassennamen des erzeugten Objektes angibt. Diese wiederum enthalten folgende Unterelemente:

  • objid: Gibt die Objekt-ID des neu erzeugten Objektes an.
  • isValid: Gibt an, ob das erzeugte Objekt in Vertec gültig ist (1) oder nicht (0).
<Envelope>
  <Body>
    <CreateResponse>
      <OffeneLeistung>
        <objid>12019</objid>
        <isValid>1</isValid>
      </OffeneLeistung>
      ...
    </CreateResponse>
  </Body>
</Envelope>

Objekte ändern (Update)

Das Ändern von Objekten funktioniert ähnlich wie das Erzeugen, einfach wird dafür ein Update-Element verwendet. Dieses enthält eine Liste von zu ändernden Elementen. Angegeben wird jeweils der Klassenname des zu ändernden Objekts als Unterelement.

  • objref: Für jedes zu ändernde Element muss die Objektreferenz (Objekt-ID) angegeben werden. Wichtig ist, dass diese zuoberst angegeben wird, also vor den anderen Attributen, sonst wird die Änderung nicht durchgeführt.
  • Weiter müssen die zu ändernden Attribute angegeben werden. Im Beispiel wird bei einem Projektbearbeiter mit der Objekt-ID 4019 als Kürzel CKE eingetragen:
<Body>
  <Update>
    <Projektbearbeiter>
      <objref>4019</objref>
      <kuerzel>CKE</kuerzel>
    </Projektbearbeiter>
    ...
  </Update>
</Body>

Ändern von Zusatzfeldern

Das Ändern von Zusatzfeldern funktioniert gleich wie oben, als Membernamen wird einfach der Name des Zusatzfeldes eingesetzt. Im Beispiel wird im Zusatzfeld Projektstand auf einer Projektphase mit der ID 5491 der Text Angefangen eingetragen:

<Update>
  <Projektphase>
    <objref>5491</objref>
    <Projektstand>Angefangen</Projektstand>
  </Projektphase>
</Update>

UpdateResponse Element

Zurückgeliefert wird ein UpdateResponse Element mit folgendem Unterelement:

  • text: Gibt an, wieviele Objekte geändert wurden.
    <Envelope>
      <Body>
        <UpdateResponse>
          <text>Updated 1 Objects</text>
        </UpdateResponse>
      </Body>
    </Envelope>

Objekte löschen (Delete)

Um ein Objekt zu löschen, wird ein Delete Element verwendet. Dieses enthält eine Liste der zu löschenden Objekte:

  • objref: Für jedes zu löschende Element wird die entsprechende Objektreferenz (Objekt-ID) angegeben.
    <Body>
      <Delete>
        <objref>11764</objref>
        ...
      </Delete>
    </Body>

DeleteResponse Element

Zurückgeliefert wird ein DeleteResponse Element mit folgendem Unterelement:

  • text: Gibt an, wie viele Objekte gelöscht wurden.
    <Envelope>
      <Body>
        <DeleteResponse>
          <text>Deleted 1 Objects</text>
        </DeleteResponse>
      </Body>
    </Envelope>