Commit dbde1344 authored by Nane Kratzke's avatar Nane Kratzke
Browse files

Lab 08 prefinal

parent 2e705924
# Lab xy: Request-Response-basierte Interaktion mit REST # Lab 08: Request-Response-basierte Interaktion mit REST
[tutorial]: https://programminghistorian.org/en/lessons/creating-apis-with-python-and-flask [tutorial]: https://programminghistorian.org/en/lessons/creating-apis-with-python-and-flask
...@@ -10,12 +10,15 @@ Web-APIs sind Schnittstellen, um Informationen und Anwendungsfunktionen Nutzern ...@@ -10,12 +10,15 @@ Web-APIs sind Schnittstellen, um Informationen und Anwendungsfunktionen Nutzern
## Inhalt ## Inhalt
- [Lab xy: Request-Response-basierte Interaktion mit REST](#lab-xy-request-response-basierte-interaktion-mit-rest) - [Lab 08: Request-Response-basierte Interaktion mit REST](#lab-08-request-response-basierte-interaktion-mit-rest)
- [Inhalt](#inhalt) - [Inhalt](#inhalt)
- [Vorbereitung](#vorbereitung) - [Vorbereitung](#vorbereitung)
- [Übung 01: Bauen Sie einen einfachen REST-Service](#übung-01-bauen-sie-einen-einfachen-rest-service) - [Übung 01: Bauen Sie einen einfachen REST-Service](#übung-01-bauen-sie-einen-einfachen-rest-service)
- [Übung 02: Ergänzen Sie die Datenbank des Tutorials](#übung-02-ergänzen-sie-die-datenbank-des-tutorials) - [Übung 02: Ergänzen Sie die Datenbank des Tutorials](#übung-02-ergänzen-sie-die-datenbank-des-tutorials)
- [Übung 03: Ergänzen Sie nun eine grafische Auswertung](#übung-03-ergänzen-sie-nun-eine-grafische-auswertung) - [Übung 03: Ergänzen Sie nun eine grafische Auswertung](#übung-03-ergänzen-sie-nun-eine-grafische-auswertung)
- [Verständnis- und Transferfragen](#verständnis--und-transferfragen)
- [Links](#links)
- [Was sollten Sie mitnehmen](#was-sollten-sie-mitnehmen)
## Vorbereitung ## Vorbereitung
...@@ -113,5 +116,31 @@ in etwa folgende Darstellung im Browser erhalten. ...@@ -113,5 +116,31 @@ in etwa folgende Darstellung im Browser erhalten.
![TOP-10](top-10.svg) ![TOP-10](top-10.svg)
Danach scheinen die ersten Sätze in Science Fiction Romanen im Verlaufe der Jahrzehnte länger zu werden. Was immer das auch bedeuten mag.
> __Hinweis:__ > __Hinweis:__
> Wenn Sie gar nicht weiter wissen, können Sie mit `cp cheat/api-ue3.py api/api.py` ggf. etwas abkürzen. > Wenn Sie gar nicht weiter wissen, können Sie mit `cp cheat/api-ue3.py api/api.py` ggf. etwas abkürzen.
\ No newline at end of file
## Verständnis- und Transferfragen
- Für welche Einsatzzwecke würden Sie Request-Resonse basierte Interaktion einsetzen?
- Erklären Sie bitte was eine gute designte API ausmacht.
- Erklären Sie bitte in eigenen Worten den REST-Ansatz.
- Erklären Sie den Zusammenhang zwischen REST und CRUD.
- Wurde URL oder DNS-Versionierung in diesem Beispiel verwendet?
- Auf welcher RMM-Ebene (Richardsen Maturity Model) würden Sie dieses Beispiel einordnen?
## Links
- [Anatonomy of a URL](https://doepud.co.uk/blog/anatomy-of-a-url)
- [REST Paper](https://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm) (the orginal PhD Thesis by Roy Fielding)
- [REST](https://de.wikipedia.org/wiki/Representational_State_Transfer) (Wikipedia)
- [Flask](https://flask.palletsprojects.com/en/1.1.x/) (Microframework für Python)
## Was sollten Sie mitnehmen
- Bei REST handelt es sich um ein Programmierparadigma, welches mit verschiedenen Mechanismen und Programmiersprachen implementiert werden kann.
- Üblich ist dabei die Verwendung von HTTP-Methoden in Verbindung mit auszuführenden CRUD-Aktionen auf Ressourcen.
- Die relativ engen Vorgaben von REST helfen gut strukturierte Dienste zu bauen, und unterstützen die Verwendung von Clean URLs.
- Mit Hilfe von Microframeworks (wie bspw. Flask) lassen sich REST-APIs oft unkompliziert erstellen.
-
\ No newline at end of file
...@@ -6,4 +6,4 @@ COPY . /app/ ...@@ -6,4 +6,4 @@ COPY . /app/
WORKDIR /app WORKDIR /app
EXPOSE 5000 EXPOSE 5000
ENTRYPOINT ["python3", "-u", "api-ue3.py"] ENTRYPOINT ["python3", "-u", "api.py"]
import flask
from flask import request, jsonify
import sqlite3
import matplotlib.pyplot as plt
import numpy as np
import string, re
app = flask.Flask(__name__)
app.config["DEBUG"] = True
def dict_factory(cursor, row):
d = {}
for idx, col in enumerate(cursor.description):
d[col[0]] = row[idx]
return d
@app.route('/', methods=['GET'])
def home():
return '''<h1>Distant Reading Archive</h1>
<p>A prototype API for distant reading of science fiction novels.</p>'''
@app.route('/api/v1/resources/books/all', methods=['GET'])
def api_all():
conn = sqlite3.connect('books.db')
conn.row_factory = dict_factory
cur = conn.cursor()
all_books = cur.execute('SELECT * FROM books;').fetchall()
return jsonify(all_books)
@app.route('/api/v1/resources/books/plot', methods=['GET'])
def book_plot():
conn = sqlite3.connect('books.db')
conn.row_factory = dict_factory
cur = conn.cursor()
all_books = cur.execute('SELECT * FROM books;').fetchall()
ys = np.array([len(book['first_sentence']) for book in all_books])
xs = np.array([book['published'] for book in all_books])
m, b = np.polyfit(xs, ys, 1)
fig = plt.figure()
plt.scatter(xs, ys, color="red")
plt.plot(xs, m * xs + b, color="blue")
plt.xlabel("Date of Publication")
plt.ylabel("Length of First Sentence in Characters")
plt.savefig("top-10.svg")
return flask.Response(open("top-10.svg").read(), mimetype='image/svg+xml')
@app.errorhandler(404)
def page_not_found(e):
return "<h1>404</h1><p>The resource could not be found.</p>", 404
@app.route('/api/v1/resources/books', methods=['GET'])
def api_filter():
query_parameters = request.args
id = query_parameters.get('id')
published = query_parameters.get('published')
author = query_parameters.get('author')
query = "SELECT * FROM books WHERE"
to_filter = []
if id:
query += ' id=? AND'
to_filter.append(id)
if published:
query += ' published=? AND'
to_filter.append(published)
if author:
query += ' author=? AND'
to_filter.append(author)
if not (id or published or author):
return page_not_found(404)
query = query[:-4] + ';'
conn = sqlite3.connect('books.db')
conn.row_factory = dict_factory
cur = conn.cursor()
results = cur.execute(query, to_filter).fetchall()
return jsonify(results)
app.run(host="0.0.0.0")
\ No newline at end of file
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment