LU03c - Webservice mit Parametern

Viele Webservices benötigen beim Aufruf Parameter um die gewünschte Verarbeitung durchzuführen.

Nur wenige Webservices brauchen keine Angaben zur Verarbeitung. Viel häufiger muss der Aufrufer Parameter mitgeben, wie …

Dabei unterscheiden wir zwischen verschiedenen Möglichkeiten zur Übermittlung der Parameter.

Query-Parameter

Query-Parameter werden in der URI mitgegeben. Sie bestehen immer aus einem Schlüssel und dem entsprechenden Wert.

Die URI https://moodle.bzz.ch/mod/lesson/view.php?id=8990&pageid=2390 enthält zwei Parameter:

Umsetzung

Einerseits geben wir die Query-Parameter bei der Definition der Ressource in app.py an. Zum Beispiel benötigt die Ressource EventService eine event_uuid, um den gewünschten Event zu lesen:

api.add_resource(EventService, '/event/<event_uuid>')

Bei der Methode get geben wir diesen Query-Parameter ebenfalls an:

def get(self, event_uuid):

Formular-Parameter

Benutzereingaben in einem Formular können theoretisch auch in der URI übertragen werden. Allerdings sieht man dann im Browserverlauf, welche Eingaben gemacht wurden. Das ist spätestens bei Login-Formularen (Passwort!!) sehr schlecht. In der Regel übertragen wir die Benutzereingaben im Datenteil (Body) des Requests.

Umsetzung

Für dieses Beispiel verwende ich die Bibliothek [https://flask-restplus.readthedocs.io/en/stable/parsing.html|reqparse]] von Flask-RESTful.

Zunächst müssen wir die Formular-Parameter definieren. Dies geschieht in der Methode init(self): der Klasse.

from flask import make_response
from flask_restful import Resource, reqparse
 
class EventService(Resource):
    def __init__(self):
        self.parser = reqparse.RequestParser()
        self.parser.add_argument('event_name', location='form', default=None, help='name')
        self.parser.add_argument('start', location='form', default=None, help='start date/time')

In den einzelnen Methoden können wir dann die Parameter einlesen (parsen). Die Funktion parse_args() liefert einen Namespace (ähnlich wie ein Dictionary) mit allen Parametern. Anschliessend können wir mit den Schlüssel auf die Parameter zugreifen.

class EventService(Resource):
    ...
    def post(self):
        args = self.parser.parse_args()
        name = args.event_name
        start = datetime.strptime(args.start, '%Y%m%d %H%M')

Marcel Suter