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. Über die Basisklasse verfügt das Service-Objekt self über folgende Methoden und Attribute: 

Methoden / Attribute  Beschreibung
self.http_method

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

self.path_parameters 

Ein Tupel, der die Pfadparameter der URL nach dem Methodennamen enthält:

URL: http://<host>/api/webservice/<webservicename>/<method-name>/additional/path/parameters

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

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

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

self.querystring
Der originale Query-String, mit dem der Webservice aufgerufen wird und das ohne führendes Fragezeichen.
self.body
Der originale Request Body als Zeichenkette, mit dem der Webservice aufgerufen wird.
self.response

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

self.response.status_code (Der Statuscode der Webresponse wird auf 200 OK gesetzt)

self.response.body (Der Body der Webresponse und standardmässig als <empty>)

self.response.headers["..."] (Ein Dictionary von Response Headers)

self.as_json(<some_object>)

Diese Methode serialisiert das übergebene Objekt als JSON-String und setzt es also Body auf self.response.body. Ausserdem wird self.response.statuscode = 200 und self.response.headers[“Content-Type”] = application/json gesetzt.

Ist some_object bereits ein String, wird davon ausgegangen, dass es sich um einen validen JSON String handelt. Er wird direkt auf self.response.body geschrieben.

self.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. Um diese Einträge in der Logdatei zu sehen, müssen Sie daher den Wert Vertec.Webservices in die DebugCategories 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.

 

Methoden / Attribute  Beschreibung Beispiel
self.parse_request_body(expected_attributes=None)

Die Methode vereinfacht die Arbeit mit Request Bodies. Der Request muss den Content-Type application/json oder x-www-form-urlencoded verwenden.

Für JSON Bodies wird der Body deserialisiert. Die Werte werden als Attribute auf ein Hilfsobjekt geschrieben und sind so direkt abrufbar. Der Typ der Werte entspricht dem Typ in JSON.


Beispiel:

Body: {
            “title“: “The Gunslinger“,
            “release_date“: “1982-07-10“,
            “amazon_rating“: 4.1,
            “pages“: 224
}

result = self.parse_request_body()
result.title = “The Gunslinger” # string
result.release_date = “1982-07-10” # string
result.amazon_rating = 4.1 # float
result.pages = 224 # int
 

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


Beispiel:

Body: {
            “title“: “The Gunslinger“,
            “$release_date“: “1982-07-10“,
            “1line”: “The man in black fled across the desert, and the gunslinger followed.”    
}

result = self.parse_request_body()
result.title = “The Gunslinger” # string

$release_date und 1line sind keine gültigen Bezeichner in Python und werden daher ignoriert.
 

Für x-www-form-urlencoded Bodies werden die Werte immer als String zurückgegeben.

Beispiel:

Body: title=The Gunslinger&release_date=1982-07-10&amazon_rating=4.1&pages=224

result = self.parse_request_body()
result.title = “The Gunslinger” # string
result.release_date = “1982-07-10” # string
result.amazon_rating = “4.1” # string
result.pages = “224” # string

expected_attributes

Mit diesem Attribut wird der Request Body der obigen Methode validiert und konvertiert. Dies funktioniert nur mit JSON-Bodies. Erwartet wird ein Dictionary, dessen Keys die Attribute im Body und die Values der Typ ist.

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. Das zurückgegebene Objekt enthält dann alle Attribute konvertiert in den erwarteten Typ.

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

Mögliche Typen sind:

  • str
  • int
  • float
  • bool
  • datetime
  • array

Der Typ array kann optional einen der anderen Typen als Objekttyp definieren, zum Beispiel array(int) für Arrays von Ganzzahlen.

Body: {
            “title“: “The Gunslinger“,
            “release_date“: “1982-07-10“,
            “amazon_rating“: 4.1,
            “pages“: 224,
            “buyable”: true,
            “editions”: [1982, 2003]
}

expected_attributes = {
            “title“: “str“,
            “release_date“: “datetime”,
            “amazon_rating”: “float”,
            “pages”: “int”,
            “buyable”: “bool”,
            “editions”: “array(int)”
}

result = self.parse_request_body()
result.title = “The Gunslinger” # string
result.release_date = datetime(1982, 7, 10) # datetime
result.amazon_rating = 4.1 # float
result.pages = 224 # int
result.buyable = True  # bool
result.editions = [1982, 2003] # list with int values
 

Hinweis:

Beachten Sie, dass die Werte nicht unbedingt dem angegebenen Typ entsprechen müssen. Sie müssen nur in diesen konvertiert werden können. So könnte als pages beispielsweise auch die Zeichenketten «224» geliefert werden, da diese in eine Ganzzahl konvertiert werden kann. Die Zeichenketten «200+» oder «200-250» würden hingegen in einem Fehler resultieren, da diese keine gültigen Ganzzahlen darstellen

Datumswerte müssen gemäss ISO-Norm 8601 geliefert werden, damit sie identifiziert und konvertiert werden können.

In den über WebRequests aufgerufenen Methoden können Webresponsen folgendermassen 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(response_object) Siehe oben.

Klasse WebException

Klasse Beschreibung
raise WebException(<statusCode>,<body>=None,<contentType>=None)

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. Ein Statuscode muss übergeben werden, Body und Content-Type sind optional. Wird ein Body aber kein Content-Type übergeben, wird als Fallback text/plain verwendet.

Netherlands

United Kingdom