Vertec Python Modul "vtcweb"

Das Vertec Python Modul "vtcweb" für das Arbeiten mit Webservices

Ab Version 6.8.0.17 gibt es das Python Modul vtcweb mit der Basisklasse vtcweb.WebService.

Alle Webservice Klassen müssen von dieser Klasse abgeleitet sein:

from vtcweb import WebService

class myService(WebService):
    ...

Über die Basisklasse verfügt das Service-Objekt self über folgende Methoden und Attribute: 

Methode / Attribut Beschreibung
http_method

Enthält die HTTP-Methode, mit der der Webservice aufgerufen wurde. Mögliche Werte sind GET, POST, PUT und DELETE.

path_parameters 

Enthält die Liste der Pfadparameter der URL nach dem Methodennamen. 

Beim Aufruf von http://<host>/api/webservice/<webservicename>/<method-name>/additional/path/parameters beispielsweise:

self.path_parameters=("additional", "path", "parameters")
headers

Ein Dictionary, welches die Header des WebRequests in der Form "Header-Name": "Header-Value" enthält. Der Header Authorization wird nicht geliefert. Für doppelte Header wird nur der erste Wert geliefert.

query

Ein Dictionary, welches die Query-Parameter des WebRequests in der Form "Query-Name": "Query-Value" enthält. Der Parameter apiToken wird nicht geliefert. Für doppelte Query-Parameter wird nur der erste Wert geliefert.

querystring
Der Query-String, mit dem der Webservice aufgerufen wurde (ohne führendes Fragezeichen).
body
Der originale Request Body als Zeichenkette, mit dem der Webservice aufgerufen wird.
parse_request_body ([expected_attributes=None])

Handelt es sich beim Request um JSON oder HTML (Content-Type application/json oder x-www-form-urlencoded), kann der Request Body mit dieser Methode deserialisiert und die Werte als Attribute auf ein Hilfsobjekt geschrieben werden, wo sie direkt abgerufen werden können. 

Der Typ der Werte entspricht bei JSON dem Typ. Bei HTML werden alle Werte als String zurückgegeben. 

{
  "abbreviation": "AD",  
  "level": 5270,    
}

result = self.parse_request_body()
result.abbreviation = "AD" # string
result.level = 5270 # int

Keys, die keine gültigen Python Identifier sind, werden ignoriert und es wird ein entsprechender Hinweis geloggt.

expected_attributes

Mit dem optionalen Parameter expected_attributes kann der Request Body validiert und aufbereitet werden. Dies funktioniert nur mit JSON Bodies.

Als expected_attributes wird ein Dictionary übergeben, dessen Keys die erwarteten Attribute im Body und die Values deren Typ sind.

 expected_attributes = {
    "abbreviation": "str",
    "level": "int"
    }

Mögliche Typen sind:

  • str
  • int
  • float
  • bool
  • datetime
  • array(typ): Falls eine Liste erwartet wird, kann mit array einer der anderen Typen als Objekttyp angegeben werden, zum Beispiel array(int) für eine Liste von Ganzzahlen. 

Beim Aufruf von parse_request_body(expected_attributes) wird sichergestellt, dass alle angegeben Attribute vorhanden sind und in den angegeben Typ konvertiert werden können. Ansonsten wird der WebRequest mit dem Statuscode 400 Bad Request und einer entsprechenden Meldung beantwortet.

Die Werte müssen dabei nicht unbedingt dem angegebenen Typ entsprechen, sie müssen nur in diesen konvertiert werden können. So könnte als "level" beispielsweise auch die Zeichenkette "5270" geliefert werden, da diese in eine Ganzzahl konvertiert werden kann. Datumswerte müssen gemäss ISO-Norm 8601 geliefert werden, damit sie identifiziert und konvertiert werden können. 

Das zurückgegebene Objekt enthält dann alle Attribute konvertiert in den erwarteten Typ.

Attribute, die nicht in expected_attributes enthalten sind, werden wie oben beschrieben verarbeitet.

response

Ein Response Objekt, dass automatisch zur Beantwortung des WebRequests verwendet wird, wenn die Methode nicht selbst einen Rückgabewert hat. Es können darauf folgende Werte gesetzt werden:

  • status_code: Statuscode (Integer) der Webresponse, z.B. 200 für OK.
  • body: Der Body der Webresponse, standardmässig <empty>.
  • headers: Ein Dictionary von Response Headers.
as_json(content): response

Diese Methode serialisiert den übergebenen Content als JSON-String und gibt ein Response Objekt mit folgenden Parametern zurück:

  • status_code = 200
  • body = Content als JSON-String. Ist der übergebene Content bereits ein String, wird davon ausgegangen, dass es sich um einen validen JSON String handelt, welcher direkt in den body geschrieben wird.
  • headers["Content-Type"] = "application/json"
log(log_object)

Schreibt das übergebene Objekt ins Log. Kann mit Zeichenketten, aber auch mit anderen Objekten umgehen.

Das Objekt wird einerseits in das Vertec Session Log geschrieben. Dabei wird die Category Webservices und das Loglevel Debug / 10 verwendet (siehe auch Debug Categories). Um diese Einträge in der Logdatei zu sehen, müssen Sie daher Parameter DebugCategories=Vertec.Webservices unter [Log] in der Konfigurationsdatei Vertec.ini aufnehmen.

Zudem wird das Objekt auch mit print in die Ausgabe geschrieben. Sie sehen diese Ausgabe im Webservice-Eintrag im Feld Anfrageprotokoll, sofern der Haken auf Protokollieren gesetzt ist.

Innerhalb der Webservice Klasse kann ganz normaler Vertec Python Code geschrieben werden. 

Methoden, die von aussen aufrufbar sein sollen, müssen mit einem der fünf Python Decorators versehen werden, welche vom Modul importiert werden:

from vtcweb import get, put, post, delete, http

Sie werden wie folgt deklariert:

  • @get("<alias>")
  • @post("<alias>")
  • @put("<alias>")
  • @delete("<alias>")
  • @http("<alias>")

und entsprechen jeweils der HTTP Methode, mit welcher sie aufgerufen werden können. Hat eine Methode den @http Decorator, ist sie mit allen HTTP-Methoden verfügbar.

Es muss immer ein Alias (String) angegeben werden, über welchen die Methode aufgerufen werden kann, z.B.

    @get("objects")
    def objects_get(self):
        ...

Damit kann via http://<host>/api/webservice/<webservicename>/objects die Methode objects_get aufgerufen werden.

Der Alias kann auch eine Route / ein Pfad sein:

    @get("project/search")
    def search_project(self):
        ...

Das reagiert auf die Route project/search und ruft dann die Methode search_project auf. Der Pfad wird trotzdem wie immer in self.path_parameters geliefert. 

Als Rückgabewerte der so aufgerufenen Methoden können Webresponses wie folgt erzeugt werden:

Antworten Beschreibung
return <Integer>

Eine Ganzzahl wird als Statuscode interpretiert. Die Response enthält keine weiteren Werte.

return "String"
Die zurückgegebene Zeichenkette wird als Response Body interpretiert mit dem Statuscode 200 OK. Zudem wird der Header Content-Type auf text/plain gesetzt.
return self.response
Das Response Objekt (siehe oben) wird zurückgegeben und interpretiert. Dies passiert auch, wenn die Methode ohne Rückgabewert endet.
return self.as_json(content)
Siehe oben.

Klasse WebException

Mit dem Auslösen einer WebException kann an beliebiger Stelle die Ausführung des aktuellen Aufrufs unterbrochen werden. Die WebException wird entsprechend der übergebenen Werte in eine Webresponse umgewandelt.

raise WebException(<statuscode>,<body>=None,<contenttype>=None)

Ein Statuscode (Integer) muss übergeben werden, Body (String) und Content-Type (String) sind optional. Wird ein Body, aber kein Content-Type übergeben, wird als Fallback text/plain verwendet.

Netherlands

United Kingdom