# coding=UTF8 # ^^^^^^^^^^^ # Mit der ersten Zeile legen wir die Kodierung der Quelltextdatei fest. Dies # ist nötig, damit wir hier auch deutsche Umlaute benutzen können. # Die Anwendung wurde mit dem Bottle-Framework (http://bottlepy.org/) # erstellt. Dies ist ein einfaches Webframework für Python Anwendungen. Wir # importieren zunächst die notwendigen Methoden. from bottle import route, run, debug, request, response # In dem Dictionary zitate sollen Zitate gesammelt werden. Jedes Zitat ist # über eine ID erreichbar: {0: "Zitat 1", 1 : "Zitat 2", ...} zitate = {} # Mit route wird eine Ressource festgelegt. Dies ist der Teil, der hinter der # Adresse des Hostnamens folgt. Eine Anfrage wird normalerweise über ein # GET-request entgegen genommen. In diesem Fall wird eine Liste aller Zitate # ausgegeben. Es ist guter Stil, den Namen des Ressource jeweils im Plural zu # verwenden. @route('/zitate', method='GET') def zitate_liste(): # Über den Header können wir prüfen, welche Form der Ausgabe der Client # erwartet. Da wir bei REST nur von Repräsentationen ausgehen, können die # Inhalte unterschiedlich dargestellt und damit auch angefordert # werden. Wir unterstützen HTML und Json als Formate. if request.get_header('Accept') == "application/json": return zitate else: # Wenn kein besonderes Format angefordert wurde, wird HTML # ausgegeben. Wir stecken die Zitate in eine Tabelle und geben diese # zurück. html = "

Zitate

" html += "" for k in zitate: html += "" html += "" html += "" html += "
IdZitat
" + str(k) + "" + zitate[k] + "
" return html # Ein bestimmtes Zitat kann über seine Nummer angesprochen und einzeln # ausgegeben werden. Der Parameter in der URL wird an die Methode # übergeben. @route('/zitate/') def zitate_get(nr): zid = int(nr) if zid in zitate: return zitate[zid] else: # Die Nummer und damit das Zitat wurden nicht gefunden. # Über den Statuscode melden wir den Misserfolg an den Client. # Status 404: Not Found response.status = 404 return "Zitatnummer nicht vorhanden: " + nr # Damit wir etwas für die Anzeige haben, müssen auch neue Zitate eingetragen # werden können. Diese geschieht über die HTTP Post-Methode. Die Daten, also # der Text des Zitates, wird über den Body des requests übertragen. In der # Antwort wird der Client über die Adresse der neuen Ressource # informiert. Zusätzlich setzen wir die neue Adresse im Headerfeld Location. # Schließlich wird der Status der Antwort auf 201 (Created) gesetzt. Damit die # Methode nur auf POST reagiert, wird die route entsprechend konfiguriert. @route('/zitate', method='POST') def zitat_erstellen(): # Die ID für das nächste Zitat wird bestimmt. Wenn es noch keine Zitate # gibt, ist es die 0, ansonsten wird die größte ID um 1 erhöht. if len(zitate) == 0: neue_id = 0 else: neue_id = max(zitate.keys()) + 1 zitate[neue_id] = request.body.readline() response.set_header("Location", request.url + "/" + str(neue_id)) response.status = 201 # 201: Created # Als Ergebnis geben wir die komplette URI des neuen Zitates zurück return request.url + "/" + str(neue_id) # Anmerkung: Komplexe Einträge wie z.B. ein Zitat mit Informationen über den # Autor und das Jahr der Verwendung werden nicht als Text, sondern als Json- # oder XML-Inhalt übermittelt. Es sind aber auch binäre Daten wie Bilder oder # MP3-Dateien möglich. # # START des Webservers auf Port 8000. # debug(True) run(port=8000, reloader=True)