====== 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 ... * ... den eindeutigen Schlüssel der gewünschten Ressource * ... welche Daten in einer Ressource zu speichern sind 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: * id=8990 * pageid=2390 === 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/') Bei der Methode ''get'' geben wir diesen Query-Parameter ebenfalls an: def get(self, event_uuid): * Bei der Definition der Ressource wird der Parameter zwischen spitzen Klammern (<...>) geschrieben. * Der Bezeichner muss bei der Definition und in der Methode identisch sein. ==== 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') ---- {{tag>M321-LU03}} [[https://creativecommons.org/licenses/by-nc-sa/4.0/|{{https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png}}]] Marcel Suter