Transkript: REST

· Zurück zur Episode

Vollständiges Transkript der Episode. Zeitstempel beziehen sich auf die Audiowiedergabe.

Dominik

Ja, hallo liebe Hörerinnen und Hörer, willkommen beim Python Podcast.

Dominik

Heute in der 29.

Dominik

Episode.

Dominik

Wir machen heute Reste, äh, Rest, ähm, Representational State Transfer.

Dominik

Was ist das eigentlich?

Dominik

Und hier ist der Dominik und ich bin da mit dem Jochen und heute wieder mit dem Johannes.

Hallo Dominik.

Jochen

Hallo Johannes, hallo.

Dominik

Ihr kennt uns ja vielleicht schon, wenn ihr gehört habt.

Dominik

Wir waren öfter schon mal in dieser Konstellation.

Dominik

Das heißt, wir stellen uns heute nicht vor.

Dominik

Aber wie gesagt, wir machen Rest, Representational State Transfer.

Dominik

Und ja, wen frage ich denn zuerst?

Was ist denn das?

Jochen

Ja, ich dachte, wollen wir nicht vielleicht zuerst den News machen, weil ich habe da auch noch so ein Tür.

Dominik

Nein, nein, nein, wir wollen erstmal kurz das Topic erklären und dann machen wir News.

Jochen

Da kommen wir nicht mehr zu den News.

Dominik

Doch, wir kommen noch zu den News.

Jochen

Na gut, okay, machen wir sicher nicht.

Johannes

Erklär mal ganz kurz, was REST ist.

Erklär mal, aber nur ganz kurz.

Ja, Elevator-Fischung.

Jochen

Also, man stellt sich vor, man hätte da so eine Dampfmaschine.

Jochen

Naja, warte mal, das war es das andere.

Jochen

Also Rest ist, also ich glaube, das beste Beispiel für, wie kann man sich das vorstellen, was das eigentlich ist, ist, man nimmt halt irgendwie das Web.

Das ist ja mal krass.

Jochen

Man hat, genau, das ist das Web und dann hat man dann so einen Browser und das ist eigentlich Rest.

Jochen

Also das Web ist schon Rest.

Okay.

Dominik

Okay, News.

Johannes

Ich erkläre das immer anders.

Johannes

Ich erkläre das immer im Unterschied zu dem, was es nicht ist.

Johannes

Und was man früher gemacht hat, um APIs zu machen, war LPC, Remote Procedure Call, wo man halt Funktionen hatte, die man aufgerufen hat mit irgendwelchen Daten.

Johannes

Und REST ist jetzt eben nicht Funktionen, die man aufruft, sondern Objekte, die man abruft und verändert.

Johannes

Und das ist für mich so der Knackpunkt, was REST zu REST macht.

Johannes

Dass man nicht Funktionen aufruft, sondern Objekte abruft und verändert.

Dominik

Okay, jetzt rufen wir jetzt Objekt-News ab.

Jetzt machen wir News.

Ja, jetzt machen wir News.

Jochen

Gut, okay, machen wir News.

Johannes

Pattern Matching.

Pattern.

Jochen

Genau, Pattern Matching ist auch tatsächlich der erste Punkt, den ich ja auf der Liste habe.

Alle anderen Punkte sind unwichtig.

Johannes

Pattern Matching.

Jochen

Hast du da eigentlich dir schon mal Gedanken gemacht über Pattern Matching?

Johannes

Nur ganz am Rande, ich habe sogar, ich fand das so gut, dass ich direkt einen Blogartikel auf meinen selten benutztes Blog geschrieben habe, weil es so wichtig ist und so toll, dass ich, ja klar, kriegt ihr natürlich einen Link dazu, dass ich das sofort schreiben musste.

Johannes

Und Patternmatching ist so ein Feature, was es in anderen Sprachen, in vielen funktionalen Sprachen gibt, was man auch da kennt.

Johannes

Und wenn man das einmal gesehen hat, dann kann man nicht mehr ohne.

Johannes

Und ich habe früher an der Uni funktionales Programmieren gelernt und gemacht und war dann etwas schockiert, als ich zu Python kam und die hatten das nicht.

Johannes

Und hab's aber irgendwann vergessen, dass es das in Python nicht gibt.

Johannes

Und jetzt ist es.

Also jetzt das erste

Dominik

Anbieter so gewesen, ja, aber es gibt auch if-else, warum brauche ich denn dann ein Switch Case?

Johannes

Ja, das ist prinzipiell richtig.

Johannes

Man kann das alles mit IF-Ls machen.

Johannes

Man kann auch prinzipiell jede Schleife aus While-Loops machen, man kann prinzipiell auch alles aus Goto zusammenbauen.

Johannes

Man macht es nicht, weil das nicht gut ist.

Johannes

Und weil es bequemere Dinge gibt.

Johannes

Und gerade jetzt das Pattern Matching, was in Python reinkommt, ist meiner Meinung nach ein sehr mächtiges Pattern Matching.

Johannes

Die können matchen auf Typen und auf Werte und die können Variable Capture machen, wo eben so ganz komplizierte Fälle, die ein sehr langes IF wären, dann auf einmal sehr einfach abzuschreiben.

Dominik

Was ist ein Variable Capture?

Capture.

Johannes

Was Pattern Matching macht, ist im Wesentlichen ein If, wo ich nicht hinschreibe, dass eine Bedingung wahr oder falsch ist, sondern ich schreibe eine Datenstruktur hin.

Johannes

Und wenn diese Datenstruktur vorgefunden wird, dann trifft dieses Pattern zu.

Johannes

Die erste coole Sache, die da passiert, ist, dass man nicht mehr irgendwelche Dictionaries.get machen muss oder irgendwelche Listen gucken muss, ob die Länge größer 0 ist und dann das erste Element rausholen, sondern man schreibt einfach hin, aus der Liste das erste Element soll ein Attribut haben x und das soll den Wert Y haben.

Johannes

Und wenn diese Struktur zutrifft, dann ist dieses Pattern gematcht.

Johannes

Ich habe in dem eben genannten Blockartikel ein Beispiel, wo es sehr eindeutig wird.

Johannes

Variable Capture heißt, dass ich in dieses Muster, was ich hinschreibe, in diese Datenstruktur, nicht nur konkrete Werte reinschreiben darf, sondern ich darf auch Variablen Namen reinschreiben.

Johannes

Und wenn diese Variablen-Namen gefüllt werden können, dann stehen die mir in dem Branch, der dann aufgerufen wird, zur Verfügung.

Johannes

Das heißt, wenn ich zum Beispiel sage, das Pattern, was ich schreiben möchte, ist, das erste Element der Liste ist der Float X.

Johannes

Dann kann ich in dem Branch, der dann zutrifft, auf die Variable X zugreifen und es ist automatisch sichergestellt, dass das ein Float ist.

Johannes

Also es ist schon gecastet.

Johannes

Und das heißt Variable Capture, weil eben diese Variable sozusagen aus diesem Muster raus eingefangen wird.

Dominik

Das klingt sehr nützlich.

Dominik

Und wenn man das auch mit Typen und so machen kann,

Johannes

das klingt, das ist super nützlich.

Johannes

Gerade das erste Beispiel, was man da sieht, ist eben diese Typen.

Johannes

Wenn ich eine Funktion schreibe, die vier verschiedene Typen annehmen kann, dann schreibe ich jetzt einfach Match Type von X, CaseInt und dann ist es ein Int.

Johannes

Oder CaseStill, dann ist es ein Stir.

Johannes

Das ist so viel einfacher, als das mit Ifs zu machen, das ist sehr, sehr schön.

Ja, fand ich auch.

Dominik

Es gab aber viel Gegenstimmen, muss ich sagen.

Jochen

Ja, es gab ganz schön Gegenwind.

Jochen

Es gibt ja schon seit einiger Zeit irgendwie Leute, denen das alles kompliziert wird.

Jochen

Und ich meine, da gab es ja auch diese große Kontroverse irgendwie beim Walros-Operator.

Johannes

Auch bei den Typen, bei diesem, bei dem.

Jochen

Ja, aber die

Dominik

sind immer 3.10 ist doch irgendwie so eine Muss-Version, oder?

Dominik

Das ist nicht so eine Kann-Version, was da alles kommt.

Dominik

Also die Type-Annotations, die dabei sind, dass man einfach hinterschreiben kann, die Klasse beispielsweise, die das sein soll oder deren Instanz das sein soll, ohne dass man da groß Typer importiert und dann kann man so einen Union Operator dahinter setzen, also diesen, ne?

Dominik

Und dann kann man da zwei verschiedene Typen haben und so, dass es sieht alles total schick aus.

Dominik

Also ich finde, so wollte ich das schon immer lesen.

Jochen

Ja, also ich weiß nicht so genau.

Jochen

Ich meine, bei denen ich finde, diese Type-Annotations, die sind halt an manchen Stellen total nett.

Jochen

Ob ich das jetzt an allen Stellen im Code gerne hätte, weiß ich jetzt auch nicht durch.

Jochen

Genau, genau.

Jochen

Ja, man kann es dann, genau.

Jochen

Und da, wo man es, da wo es halt Sinn macht, irgendwie, da kann man es dann halt dazutun und dann ist es auch nett.

Jochen

Ich finde auch tatsächlich, das mache ich in letzter Zeit häufiger, irgendwie entweder Data Classes Atris oder Pydentic verwenden.

Jochen

Und tatsächlich Klassen so hinzuschreiben, ist deutlich angenehmer, als das irgendwie.

Dominik

Hatten wir Pydentic schon mal?

Jochen

Ich habe erfinden,

Jochen

ich weiß nicht genau, ob ich es mal gepickt hatte oder so.

Jochen

Kann sein.

Was macht Pydentic?

Johannes

Du hattest es auf jeden Fall mal erwähnt, glaube ich.

Johannes

Verlinke es auf jeden Fall nochmal, das ist ziemlich cool.

Ja.

Jochen

Genau.

Jochen

Ja, und also ich finde, diese Art, sozusagen, Klassen hinzuschreiben ist sowieso irgendwie, macht irgendwie nett.

Dominik

Ich sehe, ich habe auch schon irgendwie hier ein Pydentic in der Dokuma rumgewühlt.

Dominik

Also eigentlich wollte ich wissen, was das ist, aber

Johannes

ja, das ist so eine Art Mischung aus MyPy und Data Classes, oder Jochen?

Johannes

Man kann leicht Datentypen definieren mit bestimmten Typen und der prüft die dann auch noch.

Jochen

Genau, also es prüft es halt auch zur Laufzeit.

Jochen

Und es ist halt auch so, dass man dann halt so eine eingebaute Serialisierung nach JSON oder so auch mitkriegt, weswegen man es eigentlich auch super für so Rest-Geschichten verwenden kann.

Rest man gleich mal.

Was ist das denn, Jörn?

Jochen

Ja, Moment.

Dominik

Erstmal die Reste der News, bitte.

Jochen

Was haben wir denn da noch?

Jochen

Ja, so ein Pattern Matching, ja, coole Sache, da sind wir uns alle einig.

Jochen

Irgendwie komisch.

Jochen

Naja.

Jochen

Es gibt neue Releases von UV-Loop und Async PG und so.

Jochen

Aber da war jetzt auch nichts Weltbewegendes dabei irgendwie.

Jochen

Aber Async PG ist auch so ein Ding, was man sich unbedingt mal angucken kann.

Dominik

Ich wollte gerade sagen, wovon hast du gerade gesprochen?

Jochen

Ja, UV-Loop ist halt so eine schnelle, also ist die Python-Version oder Abstraktion ein Drapper um LibUV und das ist eine super schnelle Abstraktion über den ganzen betriebssystemspezifischen Schnittstellen, sowas wie EPOL oder KQ oder was ich nicht, was das sonst so, TCP-Completion Ports oder I.O.

Jochen

Completion, nee, I.O.

Jochen

Completion Ports hat.

Dominik

Ich glaube, das ist ein mehr Stuff für die Web-Server-Folge, die wir

mal machen.

Jochen

Ja, ja, genau, aber auf jeden Fall, man kann damit schnell I.O.

Jochen

machen und das Ganze halt in der Event Loop und das ist auch das, was unter Node.js zum Beispiel drunter liegt.

Jochen

Und genau, davon gab es jetzt gerade eine neue Version und Async PG ist halt eine Async-Library, um halt auf Postgres zuzugreifen und das ist halt auch sehr praktisch, weil also das normale Psycho-PG, das man so verwendet, kann das halt nicht.

Jochen

Und eigentlich wäre das ja auch saucool, wenn man das Async machen könnte.

Jochen

Und Async PG ist auch richtig schnell.

Dominik

Async auf Datenbanken stelle ich mir schwierig vor mit Transaktionen und so, weil.

Jochen

Nö, das ist alles, eigentlich ist das überhaupt kein Problem.

Dominik

Es gibt halt nur einen wahren Zustand dann immer, und das ist egal.

Jochen

Ja, aber das ist ja okay.

Jochen

Ist ja okay.

Jochen

Du hast ja auch sonst auch, du kannst ja schon mehrere Sachen gleichzeitig machen.

Jochen

Nur ist es ist halt so, dass du normalerweise dann halt warten musst.

Jochen

Du schickst halt irgendwie ein Settlement an die Datenbank und dann blockierst du halt einen Code.

Jochen

Du machst du es halt synchron.

Johannes

Das ändert nicht die Datenbank, Dominik, sondern es ändert nur, wie du die Verbindung der Datenbank hältst.

Johannes

Aber wo wir gerade bei Psycho Begesian Psycho PG3 ist angekündigt und gerade unterwegs.

Johannes

Die koordinieren sich gerade mit den Django-Leuten, dass die Datenbankverbindungen da cooler sind.

Johannes

Die haben zum Beispiel Connection Pooling im Adapter drin.

Jochen

Das ist auch eine sehr schöne, da hatte ich jetzt letztens so ein Problem tatsächlich auch, dass irgendwie die Connections rausgelegt sind.

Jochen

Bei Django gibt es, glaube ich, im Grunde zwei Arten.

Jochen

Entweder man macht halt eine Verbindung pro Request oder man setzt halt das auf irgendeine Zeit oder so und dann wird die Connection so lange aufgehalten.

Jochen

Aber, und das haben wir halt nicht so klar, oder ich dachte, das passiert irgendwie magisch automatisch und das passierte nicht, wenn man einen Thread aufmacht, dann macht das eine Seite-Connection auf.

Jochen

Und wenn man sich dann nicht weiter um den Thread kümmert, oder wenn der weggeht, dann geht der Thread weg, aber die Connection nicht.

Jochen

Und wenn man das häufig macht, dann ruft irgendwann der, dann kriegt man Ärger von dem Datenbank-Admin, weil der sagt, die waren die ganzen Connections dazu.

Jochen

Was zur Hölle macht ihr denn da?

Ja.

Jochen

Ups.

Jochen

Ups, genau.

Jochen

Ja, ja, aber Pulling wäre auf jeden Fall eine schöne Geschichte, weil manchmal ist ja auch eine Verbindung nicht genug.

Johannes

Ja, und generell ist es ja gut, wenn da ein paar Verbindungen offen sind, weil man braucht die halt doch häufig.

Jochen

Ja, ansonsten, was hatte ich noch gelesen?

Jochen

Es gibt irgendwie, es gab irgendwie einen Artikel zu Security-Geschichten.

Jochen

Dependency Confusion.

Jochen

Ich weiß nicht, ob ihr dafür habt.

Johannes

Da gab es einen Artikel zu.

Jochen

Es gab da schon ein paar Artikel zu das.

Dependency Confusion.

Jochen

Ja, sehr deprimierendes Problem, ehrlich gesagt.

Dominik

Das muss sogar der Kern, das ist Dependency Confusion.

Johannes

Ja, da gab es doch so ein, da hat doch eine 3.500 Sachen bei PiPi hochgeladen, oder?

Ja.

Jochen

Und genau, das ist halt so, oft, wenn da Leute die Versionen, die sie haben wollen, nicht explizit festlegen, dann muss man halt nur eine Version haben, die ein bisschen höher ist.

Oder wenn sie sich vertippen.

Jochen

Oder wenn sie sich vertippen, genau.

Jochen

Dann kann man das sozusagen hijacken und dann kann man denen Software installieren.

Jochen

Die auch im Großen und Ganzen das tut, was die erwartet haben, was sie sich installieren wollten, aber halt auch vielleicht ein bisschen mehr oder so.

Johannes

Also ein Beispiel wäre, wenn zum Beispiel jemand eine Bibliothek hochlädt, die Django heißt, nur ohne D vorne dran.

Johannes

Und wenn jemand halt dann Django installiert, das geht auch.

Johannes

Hat auch die gleichen Versionen, aber macht halt gleichzeitig was weiß ich, Bitcoin-Mining oder sonst irgendwas oder Backdoors auf oder sonst irgendwas.

Johannes

Man weiß es nicht genau.

Johannes

Und da gab es eben so einen Vorfall, dass jemand dreieinhalbtausend solche Bibliotheken auf PiPI hochgeladen hat, die sehr suspicious waren und die dann auch wieder gelöscht wurden.

Jochen

Ja, also der Artikel, den ich da gelesen hatte, derjenige, der das gemacht hat, der hat das tatsächlich quasi auch im Auftrag von größeren Firmen gemacht.

Jochen

Und der hat damit quasi alle großen Firmen aufgemacht.

Also und hat da auch überall irgendwie quasi das habe ich auch gehört.

Jochen

Diese Preisgelder für gekriegt, die man halt für es schafft.

Jochen

Ja.

Jochen

Also das war, das hat sich gelohnt.

Jochen

Und das ist auch wirklich ein fieses Problem und es gibt eigentlich nicht so, es ist so ein bisschen doof.

Dominik

Poetry könnte doch da helfen, oder?

Dominik

Wenn ich jetzt irgendwie die Hashes von den Dependencies da mit speicher?

Dominik

Nee, nein, nein.

Johannes

Nee, weil du ja immer noch den Namen eingeben musst, irgendwann.

Dominik

Ja, aber wenn das in bei einer Pi-Project Hummelton gepinnt ist, richtig.

Johannes

Dann hoffe ich mal, dass du die richtige, dass du die richtige

Dominik

gepinnt hast.

Dominik

Wenn ich das eintrage.

Johannes

Ja, und jemand muss aufpassen.

Dominik

Was meinst du mit jemand?

Johannes

Ja, du siehst es ja nicht, du merkst es ja nicht, das geht ja.

Johannes

Das funktioniert ja, das macht ja genau das, was es soll.

Nur halt irgendwann auch noch was anderes.

Johannes

Und wenn du nicht gerade dann drauf guckst,

Dominik

das ist ja immer das Problem mit irgendwelchen Dependencies.

Dominik

Also wenn man irgendwie sich sowas wie Kai auf den Redner holt oder Node.js oder was auch immer und irgendwelche Pakete von irgendwo installiert, ohne zu genau zu wissen, was für ein Source-Code denn da drin steckt oder jedes Mal nachzugucken, ob denn da in der neuen Version vielleicht was Falsches drin ist, dann ja.

Jochen

Ja, das Problem haben wir an vielen Stellen, das haben wir natürlich auch bei Docker zum Beispiel, wenn man sich da irgendwelche Images zieht, wo man nicht weiß, wo da drin ist.

Jochen

Das Problem haben wir auch bei Distributionen, aber jetzt, wenn man jetzt eine Distribution nimmt und man installiert per abt irgendwas bei Debian oder so, dann kann man ja davon ausgehen, wenn man jetzt nicht, was natürlich auch viele Leute machen, was natürlich auch wieder so ein Ding ist, wo man sich sagen kann, aus Sicherheitsperspektive ist das ganz übel, wenn man da halt irgendwelche Dritt-Repositories reinholt, die kann ja auch alles installieren.

Jochen

Das ist den meisten Leuten vielleicht auch nicht so ganz klar.

Jochen

Aber wenn man jetzt nur die Debian-Repositories drin hat, dann kann man ja davon ausgehen, okay, das hat irgendeiner, der das maintained, hat sich das angeguckt, hat geguckt, ob das die richtige Software ist, hat draußen ein Paket gebaut, hat das Ganze signiert und so und dann kann man sich schon relativ sicher sein, okay, das, was da landet, ist tatsächlich nicht irgendeine Malware oder so.

Johannes

Aber welche Python-Versionen haben die gerade?

Jochen

Genau, das ist also das ist das Problem.

Jochen

Ja, so funktioniert.

Johannes

Und diese ganzen Bibliotheken musst ja dann auch.

Johannes

Du kannst ja dann nicht mit Pip irgendwas installieren, sondern musst ja dann eigentlich.

Johannes

Und ich kenne solche Firmen, ich habe Kunden gehabt, die das gesagt haben.

Johannes

Wir wollen keine Dependencies reinholen von irgendwo her, sondern wir wollen die Betriebssystempakete haben und dann hast du dann echt das Problem.

Dominik

Ja, dann haben die doch keine Software mehr.

Johannes

Viele, viele Sachen.

Johannes

Ja, bist halt bei Django 2.irgendwas.

Dominik

Eins.

Dominik

2.0.

Dominik

Ja, aber ist doch Quatsch.

Dominik

Also dann mache ich doch lieber irgendeinen Server, auf der vielleicht kompromittiert werden kann und mach dann andere Sachen sicher.

Dominik

Mach dann Singles Point of Cruise oder sowas und dann habe ich halt die Daten abgesichert über eine Authentifizierung.

Weiß nicht.

Johannes

Ja, an irgendeiner Stelle musst du irgendjemandem vertrauen und das ist ein Problem.

Johannes

Und selbst wenn es nur derselbe ist, und das ist meistens der größte Fehler.

Johannes

Ja, aber zum Thema Sicherheit habe ich auch noch was sehr Interessantes gelernt.

Johannes

Ihr wisst ja sicherlich, alle, die zuhören, wissen sicherlich, was Course ist.

Johannes

Cross-Origin Request Safety?

Security?

Jochen

Oh, das ist eine gute Frage, weiß ich jetzt gar nicht.

Johannes

Ich weiß es auch nicht, aber ich weiß, dass es das gibt.

Johannes

Ich weiß, dass es es gibt und ich weiß, dass das sehr gut ist, weil das bedeutet, dass man nicht einfach irgendwoher Ressourcen abrufen kann.

Resource Sharing?

Jochen

Ah, okay.

Johannes

Ah, Cross-Origin Resource Sharing, okay.

Johannes

Das gibt es nicht für Websockets.

Johannes

Websockets haben keinen Kurs.

Johannes

Wenn ich einen Websocket irgendwo hin aufmache, dann kann ich darüber alles abrufen.

Oh.

Und das ist.

Johannes

Ja, genauso habe ich auch reagiert.

Jochen

Das war mir jetzt nicht klar.

Jochen

Oh shit.

Aha.

Genau.

Johannes

Also die Annahme ist, dass der, dass der Server das macht, dass der den Origin-Header überprüft und das dann halt ablehnt.

Johannes

Aber prinzipiell muss er das nicht.

Johannes

Prinzipiell kannst du eine Verbindung irgendwo hin aufmachen und sagen, hier, ich bin der Websocket von so und so.

Johannes

Und ja.

Dominik

Also das ist doch so eine Sache, wenn das im Header drin stehen müsste, mach dann nicht sowas wie Django Channels, sowas in den Headers mit, ähm, wie nennt man das?

Johannes

Das weiß ich nicht.

Johannes

Und das ist genau das Problem.

Johannes

Und es ist auch, glaube ich, nicht die Aufgabe von Channels, sondern es wäre eigentlich die Aufgabe von dem terminierenden Webserver.

Johannes

Und auch da weiß ich es nicht.

Johannes

Und weiß ich nicht, ist in der Sicherheitswelt so viel gemeint.

Jochen

Das ist, wenn es ist immer, wenn es so ganz überraschend und komisch ist und man es nicht, dann ist es kein gutes Zeichen.

Nein.

Johannes

Auch da habe ich einen Link gefunden, der das alles erklärt und wie man damit umgeht und so weiter.

Damit verlinken wir einfach.

Dominik

Aber ich habe zum Kurs was gelesen, in Django Rest Framework, weil die nämlich inklusive Sockets das integrieren wollen mit Kurs.

Dominik

Steht zumindest in einem Feature.

Johannes

Ja gut, dann überprüfen die das halt.

Johannes

Das ist ja sehr gut.

Dominik

Was uns zu unserem Topic zurückbringen konnte, wenn ihr denn mit den News schon soweit seid.

Jochen

Ja, das ist nicht mehr viel.

Jochen

Tatsächlich jetzt hatten wir auch schon mal, da waren wir ein bisschen voreilig, irgendwie hatten wir ja schon 30 Jahre Python gefeiert.

Jochen

So der offizielle 30 Jahre-Dings, das war irgendwann vorletzte Woche oder sowas.

Jochen

Letzte, ich weiß nicht mehr genau.

Da müssen wir jetzt ein Glas Sekt aufmachen.

Jochen

Ja, müsste man jetzt eigentlich.

Jochen

Ja, ist jetzt Python 30 Jahre draußen.

Hurra!

Dann ist

Johannes

es ja älter als ich.

Ich wollte sagen.

Genau.

Dominik

Ich hatte mir mein Geld geklaut.

Entschuldigung, Dominik.

Dann ist es ja älter als Dominik und ich.

Jochen

Ja, es gibt noch ein zweites.

Jochen

Ich habe noch einen Versuch für den Witz.

Jochen

Es gibt ja noch ein zweites Jubiläum.

Jochen

Die Python Software Foundation ist 20 Jahre alt geworden.

Jochen

Und die ist dann ja älter als ich.

Jochen

Okay, verdammt.

Jochen

Das funktioniert nicht beliebig nach unten.

Johannes

Wir nehmen dir alle ab, dass du erst 19 bist, Jochen.

Johannes

Die ganzen Geschichten, wo du über Computerspiele aus den 90ern erzählst, ist es alles nur, was du gehört hast, was du gelesen hast.

Jochen

Genau.

Jochen

So eine Tarnung.

Dominik

Ja, wenn man letzten Montag in einem Schaltjahr geboren worden wäre, dann hätte man tatsächlich das Problem gehabt, dass man wahrscheinlich in seiner, zumindest der Zahl, seine Geburtstage, die man bisher gehabt hätte, deutlich unter diesen Damen gewesen wäre.

Johannes

Das ist gut, dass du es so formuliert hast, weil sonst hätte ich jetzt direkt meine Mathematiker auspacken müssen.

Dominik

Mit welcher Formierung habe ich mich gerettet?

Johannes

Ja, die Zahl der gefeierten Geburtstage, das ist leider.

Johannes

Meine Goldwaage sagt ja.

Ja.

Jochen

Ja, gut.

Jochen

Genau, aber dann.

Jochen

Achso, ach doch, eine Geschichte habe ich noch.

Jochen

Oh, das, äh, genau, du hattest es mir, äh, Johannes, du hattest mir, glaube ich, mal so einen Link geschickt auf so einen Benchmark.

Johannes

Da arbeiten wir jetzt auch schon eine Weile dran, Jochen.

Ja.

Jochen

Und genau, da ging auch über Hacker News und dann war der auch bei Python Bytes drin und so und da ging es darum, da hat er ja jemand irgendwie, ich weiß nicht genau, was da.

Jochen

Also da ging es irgendwie.

Jemand hatte etwas gebenchmarkt.

Jochen

Man hat irgendwas gebenchmarkt, genau.

Jochen

Und das Einzige, was ich dazu im Grunde nur anmerken wollte, also so ein Körnchen Salz sollte man da vielleicht schon mit dazu tun, sonst.

Also du sagst, man müsste das mal selber machen, ja.

Johannes

Das ist das, was ich da raushöre.

Jochen

Genau, also ich meine, ich könnte das ja auch, ich könnte das bestimmt fortsetzen, ne?

Jochen

Lügen, dreiste Lügen.

Johannes

Haben kurz.

Johannes

Nee, halt, warte.

Benchmarks.

Johannes

Nee, aber ich glaube, das ist mal eine eigene Episode, oder?

Johannes

Wenn wir mal über diesen Benchmark sprechen, den wir jetzt schon seit drei Monaten in der Mache haben.

Jochen

Achso, ja, ja.

Johannes

Der noch keine eindeutigen Ergebnisse gibt.

Dominik

Du meinst, wir wollen beweisen, dass Python die schnellste Sprache ist unter der Sonne?

Jochen

Nee, aber vielleicht schnell genug.

Johannes

Wir beweisen, wie die schnellste, wie man damit schnell sein kann.

Jochen

Oh, das ist ein

Johannes

Thema für eine eigene, ich glaube, da brauchen wir wirklich.

Jochen

Da machen wir eine eigene Geschichte zu.

Jochen

Okay, ich wollte nur sagen, also wenn man sich jetzt diesen Artikel sich anguckt, vielleicht nochmal nochmal, also wenn man es wirklich wissen will, muss man es selber messen.

Jochen

Und ja, also es ist nicht so ganz einfach.

Jochen

Also zum Beispiel eben bei dem Artikel sich dann so anguckt, irgendwie wenn da so HTTP-Todels oder bei CDC ist das dann installiert und dem anderen nicht und HTTP-Parsing kann ja dann das Nadel überwinden.

Jochen

Also ich will gar nicht gar nicht anfangen davon, stimmt.

Jochen

Da machen wir irgendwann, wenn wir Ergebnisse haben.

Jochen

Aber ja, Benchmark ist alles nicht so einfach.

Johannes

Man kann nur so viel verraten.

Johannes

Wir haben extra VMs bei einem Hoster gekauft, um genügend Bandbreite und alles zu haben und wir haben sie bisher nicht gebraucht.

Jochen

Ja.

Johannes

Gut.

Jochen

Ja, alles klar.

Dominik

Ja, jetzt dacht ihr, Entschuldigung, jetzt müsst ihr mir das erzählen, jetzt bin ich sonst die ganze Zeit neugierig.

Johannes

Der Jochen hat einfach schon sehr viele Dinge ausprobiert und wir haben es bisher nicht geschafft, so viel Bandbreite zu verbrauchen, dass man mehr Bandbreite, also dass wir dass wir ein Netzwerk sinnvoll benutzen hätten können.

Dominik

Also das war das mit dem Gabit, was du nicht kriegst an ausgelastet.

Johannes

Was war die erste Zahl, Jochen, die du hattest?

Johannes

Was war dein erstes Ergebnis?

Johannes

Wie viele Kilobit hast du.

Jochen

Ne, nö, das ist schon so schon ein paar Megabyte pro Sekunde, aber halt neu.

Johannes

Weit entfernt.

Jochen

Ja, ist noch nicht da, wo es hin muss.

Dominik

Ja, also es geht darum, dass er halt die Konkurrenz von Python-Web-Applikationen.

Jochen

Nee, also das Ziel dabei ist eigentlich rauszukriegen, braucht man sowas wie ein Nginx eigentlich noch davor?

Jochen

Oder kann man das nicht einfach alles jetzt, wo in der schönen neuen Async-Welt, ne, so alle gut, ich meine, das ist halt irgendwie so eine Tradition geworden, dass man da halt irgendwie fürs File-Serving irgendwie ein Nginx davor hat oder das halt über einen CDN macht?

Jochen

Ja, oder das halt irgendwie von Amazon machen lässt oder so.

Jochen

Das ist halt irgendwie so, das macht man halt so.

Jochen

Die Frage ist, gibt es dafür eigentlich jetzt noch so einen Grund?

Jochen

Weil tatsächlich kann man ja mit Async und der ganzen Syntax und den ganzen schönen Dingen, die es jetzt alles gibt, also man könnte das ja eigentlich auch selber machen.

Jochen

Die Frage ist halt nur, ist das schnell genug?

Jochen

Ja, also wenn ich jetzt 100 Gigabit saturieren möchte, okay, dann nehme ich vielleicht doch was anderes, aber wenn ich jetzt sowieso eine relativ, wenn ich jetzt sagen wir mal so, nur so ein Gigabit habe oder so an einem Server, dann kann es ja sein, dass es völlig egal ist, ob ich NGX nehme oder irgendwie Python, weil es ist schnell genug.

Jochen

Und Gigabit ist ja heutzutage eigentlich gar nicht mehr so wahnsinnig viel.

Jochen

Vielleicht reicht es ja.

Dominik

Und das töt ihr weiter in unserer Website.

Jochen

Genau, dann haben wir das ein bisschen angezeasert, aber genau.

In der Benchmark-Episode.

Dominik

Wir wollten nämlich noch so eine Datentypen-Folge machen, die haben wir auch noch aufgeschoben, nur für alle, die sich dann nehmen wollten.

Jochen

Ja.

Im Pennsylvanier.

Johannes

Ja, ist eine spannende Sache.

Gibt es viele schöne Dinge.

Johannes

Ich habe noch was zum Thema Webserver, habe ich kürzlich gefunden, Fly.io.

Johannes

Hab's noch nicht selber ausprobiert, aber das scheint so ein bisschen wie das developerfreundliche HeroCode zu sein.

Johannes

Mit einfachem Deployment überall.

Nice.

Johannes

Und wo man quasi einfach Docker-Container hinschickt und die lassen die dann laufen, wo man sie haben möchte.

Johannes

Und das sah sehr gut aus auf den ersten Blick und der hat auch sehr viele schöne technische Artikel geschrieben.

Johannes

Also es hat mir gut gefallen.

Johannes

Ich habe es noch nicht, ich habe noch keine Gelegenheit gehabt, das auszuprobieren, aber ich werde, hat mir vorgenommen, das auszuprobieren.

Jochen

Ah, sehr cool, weil da gab es nämlich, das habe ich heute irgendwann gehört, glaube ich, auch eine neue Episode vom Django Chat Podcast, wo Peter Baumgartner von Linkel Roop, der auch dieses High-Performance-Django-Buch, der hat das, glaube ich, geschrieben.

Jochen

Und der hat auch so ein Ding gebaut.

Jochen

Achso, ich meine, Heroku ist ja auch immer so die Empfehlung für, wenn man sich keine Gedanken machen möchte, aber Heroku ist halt auch echt.

Jochen

Und viel Geld ist halt recht teuer.

Jochen

Und es ist halt auch so, dass deren, ja, so ist es doch eher so ein Ruby und Rails-Ding und deren Django-Support erfährt jetzt nicht immer unbedingt die Liebe, die man jetzt sich erhoffen würde, vielleicht von so einem Hoster.

Jochen

Und um es mal so vorsichtig zu formulieren.

Jochen

Und der hat halt halt jetzt auch sowas gebaut, nämlich, das nennt sich Uppack.io und ist halt auch im Grunde sowas wie Heroku, also sozusagen, du kannst deinen Kram auf AWS hosten, nur halt mehr so auf Django optimiert und so.

Jochen

Aber cool, ja, es ist schön zu sehen, dass es da mehr Optionen gibt.

Jochen

Das ist eigentlich wunderschön.

Johannes

Es ist spannend, dass es so viele Firmen im Indischen Ozean gibt.

Johannes

Das ist schon sehr cool.

I.O.

Johannes

ist indische Ozean.

Jochen

Achso.

Jochen

Ja, hat der indische Ozean mal ausnahmsweise mal was richtig gemacht mit der Wahl des Top-Level-Main-Hounts.

Johannes

Naja, Glück gehabt.

Johannes

Glück gehabt.

Ja.

Johannes

Pack-I.O.

Johannes

sagst du.

Johannes

Du abtürstest den Link ja sicherlich.

Jochen

Genau, ab Pack mit 3P.

Jochen

Das ist ein bisschen schlecht vielleicht, ich weiß nicht genau.

Jochen

Naja, aber genau, ich tue den Link in die Shownotes, kann man sich das angucken.

Jochen

Ja.

Dominik

Jetzt haben wir nur noch Reste übrig, oder?

Jochen

Ja, jetzt haben wir nur noch Rest übrig.

Jochen

Es ist nur der Rest.

Johannes

Da müssen wir jetzt über die Reste reden.

Dominik

Also, wo waren wir eben stehen geblieben, Johannes?

Dominik

Representation ist Technik.

Johannes

Als im Vergleich zu Remote Procedure Call.

Johannes

Weil, also ich meine, Remote Procedure Call, das ist so die Technologie, die man kennt und das ist so ein bisschen so die Sache, die man halt machen möchte, wenn man sagt, okay, ich habe jetzt hier ein Programm geschrieben und das ist lokal, aber es wäre doch viel cooler, wenn das irgendwo anders laufen würde.

Johannes

Und dann macht man sich halt irgendwie so einen Endpoint, wie auch immer, der geartet ist, ja.

Johannes

Mit einem Java XML, RPC.

Johannes

Klein, das ist das Erste, was mir jetzt in den Gedanken kommt.

Jochen

Ja, das hatten wir, aber sprich es ruhig aus, wie es früher war.

Jochen

Da Soap zum Beispiel oder so.

Ja, das hat man

Johannes

früher einfach so gemacht.

Johannes

Und das ist dann im Wesentlichen halt eine Java-Bibliothek, die man sich einbindet, die Funktionen anbietet, die aber nicht lokal ausgeführt werden, sondern remote.

Johannes

Und das können alle möglichen Funktionen sein.

Johannes

Die können was berechnen oder die können eine Datenbank abrufen oder die können, was weiß ich, einen Roboter starten oder die können die Kamera oder keine Ahnung, irgendwas können die machen, ja.

Johannes

Und das siehst du denen aber erstmal nicht an, weil die eben so gepackt sind.

Johannes

Eben gerade diese Java XML-LPC, die macht dann eine Java-Klasse.

Johannes

Und wenn ich da alle Verbindungsdaten reingegeben habe, richtig, und mich korrekt verbunden habe, dann funktioniert die wie eine lokale Funktion.

Johannes

Und das ist ja auch so ein bisschen das, was im Namen steckt.

Johannes

Remote Procedure Call heißt einfach, es gibt normale Funktionen, also normale Prozeduren und es gibt Prozeduren, die sind auf einem anderen Rechner.

Johannes

Und das ist das, was man früher gemacht hatte.

Johannes

Und es war ganz, ganz schlimm.

Johannes

Das war ganz, ganz schrecklich.

Warum?

Johannes

Weil es hat nicht funktioniert und man wusste nie, was dann das Ergebnis ist und wie lange das dauert.

Johannes

Und man hatte quasi gar keine Garantien über gar nichts.

Johannes

Und diese Interfaces bauen war auch ganz schrecklich.

Johannes

Da musste man dann so eine Webservice.xml haben und die hat auch nur die Hälfte der Zeit funktioniert und dann gab es Versionierung, ja.

Johannes

Wenn dann nicht die richtige Version von dieser API lief, dann und und also es gibt ganz viele Stellen, an denen das einfach zerbricht.

Johannes

Soap ist prinzipiell eine sehr coole Idee, aber praktisch habe ich nie erlebt, dass es angenehm gewesen wäre oder zuverlässig.

Johannes

Und ich denke, also ich weiß es natürlich nicht, ja, ich war nicht dabei, aber ich denke, dass das eben der Grund war, warum man zu REST APIs, oder einer der Gründe, warum man zu REST APIs gegangen ist, wo es eben nicht darum geht, Prozeduren aufzurufen.

Johannes

Also wo man nicht sagt, mach irgendwas, sondern wo man im Endeffekt nur sagt, entweder gib mir ein Objekt oder nimm dieses Objekt.

Jochen

Könnte man ja vielleicht auch so formulieren, dass man sagt, man versucht einfach die Dinge, die im HTTP-Protokoll eingebaut sind, auch tatsächlich zu benutzen, so wie sie halt schon da sind und nicht, weil das ist halt eigentlich, glaube ich, auch der Vorwurf sozusagen von Restseite, die man an so Sachen wie Saub oder auch Sachen, wo dann andere Leute versucht haben, Korba irgendwie zu retten in der neue Webwelt, macht, dass man sagt, ja, ihr habt ja so ein altes, überholtes Architekturmodell, von dem, wie eure verteilte Anwendung funktionieren soll.

Jochen

Und das versucht ihr jetzt, jetzt versucht ihr das Web dazu zu degradieren, dass das nur ein Transportlayer ist für eure Idee, die auch schon vorher eigentlich nicht funktioniert hat.

Dominik

Was für ein Korba?

Dominik

Die Webpage?

Jochen

Was war's das?

Jochen

Da gibt es eine schöne Organisation mit dem Kürzel OMG.

Oh mein Gott.

Johannes

Common Object Request Broker Architecture.

Jochen

Ja, genau, und die hat sich das, die hat das standardisiert.

Jochen

Das ist die Object Management Group.

Jochen

Und genau, ich hatte auch, ich hatte viel Spaß mit Koba schon.

Jochen

Und ja, das war das war auch alles nicht schön.

Jochen

Das klang alles nach einer guten Idee.

Jochen

Und dann hat man es versucht zu verwenden und dann sind schreckliche Dinge passiert.

Jochen

Ich meine, vielleicht haben Leute das auch verwendet und es war voll cool, aber ich erinnere mich dann große Schmerzen.

Dominik

Okay, und in HTTP selbst ist dann sowas eingebaut wie gib mir ein Objekt oder bekomme ein Objekt.

Johannes

Genau, HTTP selbst hat ja erstmal nicht so viele verschiedene Dinge, die es garantiert, aber es garantiert im Wesentlichen einen Pfad und ein Verb.

Und diese Verben sind sehr streng limitiert.

Johannes

Also prinzipiell kann man da jedes Verb mitschicken, aber der Standard hat nur so eine Handvall.

Johannes

Und da gibt es insbesondere Get und Post und Get heißt halt gib mir und Post heißt nimm das.

Johannes

Es gibt noch ein, zwei andere, die da wichtig sind.

Johannes

Es gibt noch Put und Delete, die immer wieder notwendig sind.

Johannes

Ja, aber gerade da fängt es dann schon so an.

Johannes

Was ist eigentlich der Unterschied zwischen Put, Post und Patch?

Jochen

So spontan, ich weiß es nicht, ich würde sagen, spontan wäre es so put, da updatest du ein komplettes Objekt und Patch nur ein Teil davon.

Jochen

Also wenn du sozusagen nur ein Attribut an einem Objekt änderst, dann machst du es per Patch.

Jochen

Wenn du das Objekt eine Version änderst, dann putest du das komplett.

Dominik

Und Post?

Jochen

Post ist hinzufügen.

Johannes

Ja, aber das ist ja auch nicht so.

Johannes

Das ist ja bei REST auch nochmal anders geregelt.

Johannes

Ist ja, wenn du auf eine ID postest, putest, dann ist es ein neues Objekt.

Johannes

Wenn es die noch nicht gibt, dann ist es Neues.

Johannes

Und wenn du auf eine.

Jochen

Ja, so ganz klar ist es.

Jochen

Okay.

Jochen

Ja, ehrlich gesagt, weiß ich auch nicht.

Dominik

Dann braucht man nur noch zwei.

Get und Post.

Jochen

Ja, das ist halt das, was viele Leute mitmachen.

Mit denen kommt man zurecht.

Jochen

Mit denen kommt man schon zurecht, aber das ist natürlich.

Johannes

Delete brauchst du noch, Dominik.

Johannes

Delete brauchst du auf jeden Fall.

Dominik

Na gut.

Dominik

Man kann nicht posten und sagen, dass das Objekt bitte entfernen.

Johannes

Du kannst, ähm nee, weil du kannst auch, du kannst posten.

Johannes

Das kommt jetzt drauf an.

Johannes

Und da fangen schon so ein bisschen die Probleme bei REST an.

Johannes

REST besteht ja aus mehreren Teilen und ein Teil ist eben, benutze nur diese HTTP-Verben.

Johannes

Und da fängt eben das eins der Probleme schon an.

Johannes

Eine der Konventionen ist, wenn du auf den Pfad eines Objektes postest und nur eine gewisse Menge von Attributen mitgibst, dann heißt es, ändere bitte diese Attribute.

Johannes

Wenn du jetzt sagen würdest, wenn ich darauf poste, ohne ein Attribut zu geben, dann hat es schon zwei Bedeutungen.

Johannes

Hat es entweder die Bedeutung, die du jetzt sagst, nämlich lösche dieses Objekt, also entferne alle Attribute, oder es hat die Bedeutung, ändere keinen Attribut.

Johannes

Und weil das nicht offensichtlich ist, ist es einfacher, Delete zu nehmen.

Delete ist eindeutig.

Johannes

Und Delete ist auch, Delete ist eine von den Sachen bei REST, die völlig unstrittig sind, ja.

Johannes

Wenn ich eine URL habe, wenn ich einen Pfad habe, die hat zu einem Objekt gehört und ich mache da Delete drauf und ich darf das und da kommt der richtige Status zurück, dann ist es gelöscht.

Johannes

Das ist völlig unstrittig.

Johannes

Und das ist auch eine super Sache, weil ab jetzt brauche ich mir ums Löschen von Objekten keine Sorgen mehr machen.

Johannes

Das ist jetzt geregelt.

Johannes

Das geht immer.

Dominik

Was dafür sprechen würde, dass man Post nicht löscht.

Jochen

Nein, eigentlich nicht.

Johannes

Genau, mit Post löscht du nie.

Johannes

Post ist immer nur, Post und Put und Patch sind immer nur additiv.

Dominik

Okay, also, aber okay, den Unterschied da genau zu verwenden, ist wahrscheinlich, wie man gerade schon rausgehört hat, eher vielleicht gar nicht so viel zu tun.

Jochen

Ja, man findet auch ganz viel tatsächlich in freier Wildbahn dann halt Leute, die irgendwie das halt anders machen, als man das vielleicht tun sollte.

Ja, und

Johannes

wir werden sich jetzt auch hier ganz viele Kommentare kriegen, dass wir alle Idioten sind und dass es nur eine wahre Lösung gibt.

Ja, der kommt dann.

Johannes

Nee, 201 kommt dann zurück.

Johannes

201 heißt Objekt erzeugt.

Jochen

Ja, und ich meine, ich sehe immer, wenn ich irgendwie, also es gibt, wenn ich mit anderen Apis rede, ist es ganz oft, dass ich irgendwie was erzeuge und dann kommt halt 200 zurück zum Beispiel, ne?

Jochen

Was halt falsch ist oder so.

Dominik

Ja, aber kann auch sein.

Nee, kann auch sein.

Dominik

API nicht reingekraft.

Johannes

Weil 200 bedeutet ja nur okay.

Johannes

200 bedeutet ja nur in Ordnung.

Johannes

Und es kann ja tatsächlich sein, und ich halte das tatsächlich für sinnvoll, 200 zurückzugeben in vielen Fällen und nicht 201, weil das Objekt, was erzeugt wurde, ja erstens andere Attribute haben kann, die du nicht mit erzeugt hast, zum Beispiel seine eigene Identität oder Verweise auf irgendwas oder Counts von irgendwas.

Johannes

Und zum anderen kann es ja auch sein, dass du, dass nicht alle Attribute angenommen wurden, die du geschickt hast.

Johannes

Weil sie halt falsch waren oder weil sie, keine Ahnung, weil du nicht die Berechtigung hast oder sowas.

Jochen

Ja, aber nicht Berechtigung, sondern wieder was anderes.

Jochen

Aber gut.

Jochen

Nee, weil

Johannes

du, weil du, ja, okay, weil sie halt verworfen wurden.

Johannes

Und dann ist es absolut richtig, meiner Meinung nach, mit 200 das erzeugte Objekt zurückzugeben.

Jochen

Tja, das kommt ja normalerweise auch beim 201 kommt ja auch das erzeugte Objekt zurück.

Johannes

Nee, 201 hat keinen Inhalt.

Nein?

Johannes

Nee, 201 hat normalerweise sollte keinen Inhalt haben.

Jochen

Ah, okay, okay, okay.

Jochen

Gut, ja.

Jochen

Also es ist.

Auch das ist so ein Problem.

Johannes

Auch das ist so ein Problem, wenn man auf 201 wartet und erwartet, dass das Objekt zurückgegeben wird, dann kommt ganz oft gar nichts zurück und dann schlägt quasi diese Abfrage fehl, weil du, weil kein Content kommt.

Johannes

Auch damit habe ich mich schon abgeplagt.

Ja, ja.

Jochen

Na gut, also.

Dominik

Ich plag mich immer mit dem 4.02 ab.

Jochen

Was war das nochmal?

Payment required.

Payment required, ja.

Reserve for Future Reviews.

Johannes

Nee, der wichtigste ist doch 418.

Dominik

Ja, T-Pot war das, oder?

Johannes

Arme T-Pot, ja.

Jochen

Ja, genau.

Jochen

Also ich meine, tatsächlich in der Praxis funktioniert es meistens eigentlich ganz gut.

Jochen

Man kann sich da irgendwie durchwurscheln und dann geht es schon.

Jochen

Und genau.

Jochen

Tatsächlich ist aber auch, da gibt es ja so, dann, wie nennt sich das dann immer, Maturity-Level irgendwie, Rest, also hinter diesem ganzen Kram ist ja so ein Konzept.

Jochen

Irgendwie einer der Leute, die halt ja auch so, so eine der Hauptverantwortlichen hinter dem Web hat, hat das halt, steckt halt auch hinter dieser Rest-Idee.

Jochen

Rolf Hilding hat er seine Dissertation drüber geschrieben, ja genau, 2005 ist sie, glaube ich, erschienen.

Jochen

Und da kann man sich angucken, gibt es online, auch als Webseite.

Jochen

Sehr schön.

Jochen

Oh, auch sehr interessant.

Link, please.

Jochen

Ja, genau, Link kommt in den Show Nutz.

Jochen

Auch sehr interessant, die Dissertation fängt an und endet jeweils mit einem Zitat von, na, wie heißt das noch?

Jochen

Der Architekt mit den Entwurfsmustern.

Mit den Entwurfsmustern, aber.

Jochen

Der, der mit den diesen Patterns angefangen hat, genau.

Jochen

Christopher Alexander, glaube ich.

Jochen

Und genau.

Jochen

Naja, also es gibt da interessante Verbindungen.

Jochen

Und der also in dieser Dissertation beschreibt er halt sozusagen, was so ein bisschen die Idee hinter dem Ganzen ist und dass eigentlich er sich wünscht, dass halt sozusagen, das hat halt etwas komische Abkürzungen.

Jochen

Dass sozusagen Hypermedia as the engine of State.

Genau.

Jochen

Moment, wie war das?

Jochen

Hate to us.

Jochen

Hate to us, genau.

Jochen

Application State, genau.

Jochen

Hypermedia is the Engine of Application State, genau, richtig.

Jochen

Es ist lang und kompliziert und komisch.

Dominik

Und was heißt das?

Dominik

Was ist das?

Was macht das?

Naja.

Johannes

Das würde ich jetzt auch gerne mal wissen.

Jochen

Wenn man das wirklich genau wissen will, sollte man sich nochmal diese Disession.

Jochen

Also tatsächlich finde ich das beste Beispiel dafür, wie das funktionieren kann, ist halt das Web.

Jochen

Dass man sagt, also da ist das Hypermedia, was man halt sieht, ist das HTML.

Jochen

Und du kannst da halt dann Links folgen.

Jochen

Und siehst dann halt neue Sachen, neue Webseiten und so und kannst dann Dinge machen und sozusagen, wie deine Applikation, also deine Webseite, aussieht, bestimmt das Hypermedia hat da drin.

Jochen

Das ist jetzt aber nicht so, wie die meisten Leute Rest-Schnittstellen verwenden, sondern die meisten verwenden das halt zum Beispiel, jetzt weiß ich nicht, was halt viele machen, als Datenlieferant für ihre Singlepage-App.

Jochen

Aber die Singlepage-Apps, die es so gibt, die sind eigentlich so gar nicht Rest.

Jochen

Und die sind auch, was das Hyper-Media-Ding angeht, eigentlich ist das auch wieder so ein Ding, was sich aus einer alten Welt rübergerettet hat.

Jochen

Insofern, ich bin mal gespannt, wie es ausgeht.

Jochen

Es kann ja auch sein, dass sich das dann durchsetzt.

Jochen

Aber tatsächlich, also ich finde ein wichtiger Punkt, so bei dem, diese Single Page-App ist eigentlich voll cool und so, man kann damit tatsächlich ja Applikationen bauen, die so ein bisschen wirken, als wären sie Desktop-Applikationen so wie früher.

Jochen

Aber wenn man sich jetzt vorstellt, man will ein Web draus bauen und jetzt hinter jedem Link liegt so eine Single Page-App, wo erstmal ein paar MB Zeug kommen, dann ist das ja eigentlich gar nicht so gut.

Also, das Stau, Stau, Stau auf der Datenautobahn.

Jochen

Das macht das Web halt irgendwie kaputt.

Jochen

Das macht es halt, es ist halt nicht so, also so eine Single Page-App, ich meine, Single Page-App ist eigentlich auch ein falscher Name, aber so diese JavaScript-Applikationen, die halt nur RPC quasi zu einem Server machen, die sind halt eine in sich abgeschlossene Applikation.

Jochen

Und wenn man da, wenn alle Webseiten nur noch so etwas wäre, dann würden Links

Johannes

sehr viel Arbeit macht, meinst du?

Johannes

Weil gute SPAs haben natürlich.

Jochen

Ja, ja klar, Server-Side-Rendering und

wie den internen Zustand, wo du auch Deep Links machen kannst auf SPAs.

Johannes

Weil das ist nicht so gängig, um es mal so zu sagen.

Dominik

Ja, aber was ist jetzt ein Deep Link wieder?

Ja, wenn

Johannes

du so eine SPA aufrufst, dann bist du ja, jetzt sagen wir mal auf, keine Ahnung, spa.io, ja.

Johannes

Und dann gehst du da in deine Daten rein und in die Tabelle und dann gehst du da in Zelle A17.

Johannes

Und ein Deep Link wäre, wenn es eine Möglichkeit gäbe, eine URL anzugeben, die auf diese Zelle verweist.

Johannes

Damit du deinem Kollegen sagen kannst, hier, schau dir mal diese Zelle an.

Johannes

Und ganz viele SPAs machen das aber nicht.

Johannes

Du kannst nicht sozusagen dahin navigieren und dann aus der Adresszeile den Link rauskopieren.

Johannes

Weil du immer noch bei spa.io bist und sonst nirgends, weil der Zustand, den du erreicht hast, nur innerhalb der Anwendung ist und nicht in eben diesem Hypertext.

Johannes

Das heißt, du kannst da nicht darauf verlinken.

Johannes

Und das ist genau das, was sozusagen das Problem an dieser Stelle ist, du kannst nicht darauf verlinken.

Johannes

Du kannst nicht sagen, das hier und jeder, der es abruft, sieht es dann, wenn er es sehen darf.

Johannes

Immer modulo dieser Berechtigungen und der Sichtbarkeit und so weiter.

Johannes

Und das ist ja aber eigentlich eine Sache, die in REST APIs schon so drin sein sollte, ja, dass du zum einen Links machen kannst auf Objekte, also API slash Spreadsheet slash Spreadsheet ID slash table slash cell A slash row 17, irgendwie sowas, ja, solltest du prinzipiell machen können.

Johannes

Und auch innerhalb dieser API solltest du eigentlich nie irgendwie nur IDs angeben.

Johannes

Das ist jetzt dann hier, da ist der Inhalt 23 drin, sondern eigentlich solltest du angeben, da ist der Inhalt drin, der unter folgender URL erreichbar ist.

Johannes

Und wenn man das sauber macht, dann ist das eine ganz, ganz mächtige Sache.

Johannes

Ich versuche das bei meinen APIs immer zu machen, weil das die Entwicklung mit der API wesentlich vereinfacht, weil ich eben nicht wissen muss, was das bedeutet, wenn da drin steht ID 17, sondern ich muss nur einen Link aufrufen können.

Johannes

Und einen Link aufrufen, das kann ich.

Jochen

Das geht, genau.

Jochen

Und dann kriegst du das Objekt und weißt, was da drin ist.

Genau.

Johannes

Und dann kannst du auch weitergucken.

Jochen

Ja, aber tatsächlich eben, genau, und das ist halt so der Unterschied, wenn man jetzt RPC machen würde oder so, wenn du jetzt da irgendein Objekt kriegst mit bestimmten Parametern oder so, da kannst du halt auch nicht drauf verlinken.

Jochen

Das ist halt schon, genau, das ist halt irgendwie so eine der wesentlichen Geschichten, wobei man halt auch sagen muss, also die Idee ist nett und das Web funktioniert ja auch so, aber tatsächlich alle anderen Beispiele, die ich gehört habe, oder die versuchen, Leute dann zu konstruieren für, wo das noch eine gute Idee wäre, die sind alle ziemlich konstruiert.

Jochen

Also in diesem Web-Fall hat es einmal geklappt.

Jochen

Aber ansonsten, also irgendwelche Applikationen, die ihr UI dadurch aufbauen, dass sie irgendwie aus einer API irgendwie ihre Formulare bekommen und das, wo sie, wo sie so.

Johannes

Ja, das hört sich ja grauenhaft an.

Jochen

Genau.

Jochen

Das hört sich schon ziemlich grauenhaft an, ja.

Jochen

Das klingt so ein bisschen nach SAP, irgendwie alle Sachen sehen irgendwie gleich aus und so.

Johannes

Also alles zur Laufzeit wird es zusammengebaut.

Jochen

Ja, also ich meine, es wäre natürlich schön, also der Vorteil, den du halt hast, wenn du das so machst, ist halt, dass auch ältere Browser funktionieren können.

Jochen

Du musst halt nicht immer irgendwie den Client austauschen und gerade wenn du jetzt App Stores hast oder so, wäre es natürlich auch nett, wenn du, wenn Leute mit alten Client-Anwendungen halt auch deine neue Geschichten benutzen können und du sozusagen mal so ein bisschen Progressive Enhancement machst und die neuen Geräte können dann halt den neuen Kram machen und die alten sehen aber immer noch die alte Seite sozusagen.

Jochen

Tatsächlich glaube ich aber, dass das praktisch niemand so macht.

Johannes

Das ist ja auch ungeheuer schwierig, das zu machen, weil die Interner verändern sich ja auch.

Johannes

Also ich meine, wir könnten auch gerne mal noch ein Stündchen über API-Versionierung sprechen, weil auch API von uns eine Meinung dazu.

Johannes

Und ich weiß auch mindestens drei verschiedene Wege, wie man das machen kann.

Johannes

Aber ja, ich kenne quasi keinen Fall, wo es sich lohnen würde, verschiedene API-Versionen gleichzeitig laufen zu haben, was ja sehr teuer ist erstmal.

Johannes

Und deshalb, das mag ein heroisches Ideal sein, aber es ist vielleicht schwierig, das in der echten Welt.

Jochen

Na gut, du müsstest.

Jochen

Nein, nein, nein.

Jochen

Also du müsstest nicht unbedingt unterschiedliche API Versionen, sondern du würdest es halt so machen wie bei HTML auch.

Jochen

Du würdest halt sagen, okay, hier ist halt ein Attribut und da steht halt an dem Attribut noch dran, weil wenn du das in JSON machst, nicht in HTML, so ab hier nur für Clients, aber mit der Version oder so, keine Ahnung.

Jochen

Die anderen müssen ja gar nicht gucken, die können das nicht.

Johannes

Ja, okay, aber dann hast du ja unterschiedliche API-Versionen, die halt additiv sind.

Jochen

Ja, aber du würdest auch dem alten Client das Neue ausliefern und der würde das dann einfach ignorieren, wenn er sagt, oh, das ist für mich nicht interessant.

Jochen

Also wie bei HTML ist es ja auch so, genau, wenn du ein neues Tag hast, die Browser ignorieren das einfach, die es nicht können.

Johannes

Ja, oder auch Header generell.

Johannes

Das ist generell eine gute Idee, so additive, nur die Sachen verarbeiten, die man versteht.

Johannes

Also nicht generell, aber in vielen Fällen ist das eine gute Idee.

Johannes

Weil man dann eben diese automatische Backwards-Compatibility hat oder automatische Forwards-Compatibility, je nachdem, wie man das sehen möchte.

Jochen

Ja.

Jochen

Also irgendwie, also das ist die Idee, ist irgendwie voll cool, aber ehrlich gesagt, ich weiß nicht so richtig.

Jochen

Ich bin mal gespannt.

Jochen

Also bei dem bei jetzt HTML und Web hat es ja eigentlich mal geklappt, aber ob das, äh, wie sich das so in Zukunft entwickelt, keine Ahnung.

Jochen

Ja, und andere Dinge sozusagen sind auch nicht mehr so richtig gut gealtert, fürchte ich.

Jochen

Also sowas wie zum Beispiel, also eigentlich sind das sind schon nette Ideen.

Jochen

Also das HTTP-Stateless ist ja eigentlich cool, das hat diverse coole Vorteile.

Jochen

Dass GET halt immer nur irgendwas an Daten liefert und nichts ändert, ist auch super cool, weil das bedeutet halt, du kannst super cachen.

Johannes

Ja.

Johannes

Und kannst da auch so oft machen, wie

du willst.

Jochen

Kannst du oft machen, wie du willst, voll gut.

Jochen

Das Problem ist nur, so inzwischen ist es halt TLS, HTTPS ist halt überall.

Jochen

Sollte man auch nicht mehr ohne machen.

Jochen

Ja.

Jochen

Ja, genau.

Jochen

Und damit wird das mit der Cachbarkeit und so, das ist halt dann alles so ein bisschen für die Tonne, weil, ja gut, der Browser selber kann es auch cachen, aber so, dass da irgendwo.

Der Software kann es cachen.

Jochen

Der Software kann es cachen, der Clean kann es cachen, aber dazwischen kannst du nichts.

Jochen

Und ja, damit hat das nicht mehr so eine riesig große Relevanz.

Jochen

Und das war ja auch im, ja das sieht man jetzt auch heute ja, die ganzen, so ja, Phoenix Live View, bei Rupert und Mails gibt es das, ne, mit Stimulus und diese ganzen Hotwire-Geschichten in anderen Frameworks kommt das jetzt auch irgendwie, dass man wieder HTML über Websockets schickt oder so.

Jochen

Und einer der Gründe, warum man das anfängt zu machen oder so, ist halt auch, dass es einfach, wenn man sich anguckt, was auf der Leitung passiert, der totale Wahnsinn ist.

Jochen

Weil es eben, weil HTTP stateless ist, muss da halt immer irgendwie alles mitgeschickt werden, weil, naja, ist ja stateless.

Johannes

Ja, klar, weißt du nicht, was der schon hat, oder nicht.

Jochen

Genau.

Jochen

Und das ist eigentlich total ineffizient, auch ehrlich gesagt.

Jochen

Und deswegen gehen halt dann viele Richtungen, naja, nehmen wir doch einfach Websockets oder so, da haben wir dann, das ist halt dann nicht mehr status.

Johannes

Ja, das ist aber auch so eine der, jetzt sind wir schon so weit, dass wir über die Nachteile von REST-APIs sprechen.

Johannes

Dass diese Objekte so ein bisschen in sich geschlossen sind und auch nicht auf den Anwendungsfall eingehen können.

Johannes

Das ist ja eine der Vorteile von RPC, ja, dass du halt sagst, ich möchte, dass folgende Operation passiert und dafür sind die folgenden drei Werte notwendig und dann kriegst du eben die Ergebnisse der Operationen, das sind dann genau sieben Werte oder irgendwie sowas.

Johannes

Oder genau dieses Objekt und genau dieses Objekt.

Johannes

Und das hast du jetzt mit REST ja nicht mehr so einfach.

Johannes

Mit REST greifst du dir immer quasi auf ganze Ressourcen zu.

Johannes

Oder eben auf Teilressourcen, die dann vom Server auf eine gewisse Art und Weise zur Verfügung gestellt werden, die aber eventuell gar nichts mit deinem Use Case zu tun haben.

Johannes

Also wenn ich jetzt meine gesamte Freundesliste abrufen möchte, dann müsste ich prinzipiell alle Links zu meinen Freundesobjekten abrufen und dann allen Links folgen und jedes Freundesobjekt einzeln abrufen.

Johannes

Damit ich meine Freundesliste anzeigen kann.

Johannes

Was ja absurd ist, weil meine Freundesliste ist ja einfach nur eine Liste von den Namen der Freunde und fertig.

Ja, ja.

Jochen

Ja, und man würde sich dann halt vielleicht wünschen, eben, auch gerade wenn man dann jetzt unterschiedliche Clients hat, die unterschiedliche Sachen darstellen, dass man als Client kontrollieren kann, was denn dann da kommt und das je nachdem, was man halt braucht, ja, aber dann hat man im Grunde hat man dann eben keine Restschnittstelle, sondern hält man irgendwie sowas wie eine Datenbankschnittstelle.

Ja, genau, und das ist ja auch der Grund, warum es diese Weiterentwicklungen gibt, die du jetzt gleich erklärst.

Genau, wo der Client eben, wo der Client eben kontrollieren kann, welche Attribute geschickt werden und welche Objekte geschickt werden.

Johannes

Weil es eben Use Cases gibt, in denen nicht das ganze Objekt interessant ist und oder sehr viele verschiedene Objekte interessant sind.

Jochen

Ja.

Jochen

Nur dann würde, also aus der Sicht eines Restpuristen würde ich jetzt sagen, ja gut, aber das ist ja, da macht der Client ja schon viel zu viel.

Jochen

Das hat den Client alles nichts anzugehen, das muss alles der Server machen.

Jochen

Das ist ja nicht, da hat der Client viel zu viel State und für ein weiß, der ist ja, ja, und das geht ja alles gar nicht.

Ja, aber das ist ja, also ich meine, das

gegen Regen argumentieren.

Es ist schlecht,

Johannes

dass es den gibt und der fällt aus dem Himmel runter und der macht alles nass, aber es ist halt so.

Jochen

Ja.

Johannes

Das gibt halt, also ich meine, es ist nicht schwer, sich vorzustellen, dass es Leute gibt, die ihren Freunden Nachrichten schicken wollen.

Johannes

Und schon brauche ich eine Liste der Leute, denen ich Nachrichten schicken kann.

Johannes

Und da hilft mir aller Rest Purismus nichts, weil das muss dann irgendwie abdecken.

Johannes

Es gibt auch Fälle, sagen wir mal so, um es positiv zu formulieren, für manche Anwendungsfälle muss man sich braucht es ein bisschen Umdenken von diesem Prozeduralenken.

Johannes

Wir als Programmierer haben ja oft so ein prozedurales Denken.

Johannes

Ich möchte, dass jetzt irgendwas passiert und deshalb schreibe ich diese, rufe ich diese Funktion auf.

Johannes

In Python ist ja im Wesentlichen alles, was man macht, irgendwelche Funktionen aufrufen und innerhalb der Funktionen passiert dann irgendwas anderes.

Johannes

Und das ist jetzt bei REST ganz anders.

Johannes

Bei REST sage ich ja einfach nur, es soll dieses Objekt geben.

Johannes

Mehr kann ich ja nicht sagen.

Johannes

Und wenn ich jetzt eben möchte, dass was passiert, zum Beispiel, dass eine Nachricht geschickt wird, dann sage ich nicht, schicke diese Nachricht an.

Johannes

Sondern es soll eine Nachricht geben, die an deren Empfänger folgende Empfänger ist und deren Text folgende Text ist und deren Absendedatum gerade jetzt ist.

Und das erfordert ein gewisses Umdenken, wenn es eben was inhärent Aktives ist, was passiert.

Johannes

Bei Nachrichten schicken ist es schon, könnte ich schon mal sagen, könnte man schon sagen, okay, das ist jetzt nicht was, was passiert, sondern es ist halt ein Eintrag in der Datenbank und ich sage, füge dieses Nachrichtenobjekt hinzu.

Johannes

Aber wenn das irgendwas ist, was was steuert, ja, wenn ich eine Schnittstelle habe für irgendwelche Geräte oder für irgendwelche Prozesse, dann finde ich das schon schwieriger, zu sagen, es soll jetzt dieses Objekt geben.

Jochen

Ja, ja.

Johannes

Wenn ich ein Licht anmache über eine Rescue-Stelle, dann heißt es, ich bearbeite das Lichtaktivierungsobjekt und setze das Attribut an auf, ja, anstatt dass sie sagt, mach das Licht an.

Jochen

Ja.

Jochen

Ja, ja, das ist so ein bisschen, ja.

Es erfordert ein gewisses Umdenken.

Ja.

Jochen

Ja, ja, ja, ja.

Jochen

Ja, ich überlege gerade, ob man sagen könnte, man erzeugt einfach ein Event oder so, dann, aber.

Johannes

Ja, das ist ja dann auch das, was man sich dann macht.

Dominik

Ein Kontrollvorgang steht Licht an oder Licht aus.

Johannes

Ja, genau, wo du dann eben sagst, wo man sich so ein bisschen behilft, wo man sich sagt, ich erzeuge jetzt nicht, ich verändere jetzt nicht das Lichtzustandobjekt, sondern ich erzeuge ein Lichtanschalten-Wunschobjekt oder irgendwie sowas, ja, dass du sozusagen Funktionen als Objekte siehst und dann eben ein neues Funktionsobjekt erzeugst.

Aber das ist ja schon ein bisschen beschummelt, oder, Jochen?

Johannes

Fühlst du dich da gut dabei, wenn du sowas machst?

Jochen

Nee, auf der anderen Seite würde ich sagen, ich meine, worauf es hinausläuft, die grundsätzlichen Operationen, die man tun kann, sind halt, ja, das ist mal, ich weiß nicht, das hatten wir bestimmt auch schon mal ein paar Mal erwähnt oder so, ist halt CRUD.

Jochen

So, Create, Read, Update, Delete.

Jochen

Und ich finde es immer wieder erstaunlich, was sich alles darauf mappen lässt, weil tatsächlich.

Ja, alles, du kannst alles darauf mappen.

Jochen

Ja, ja, gut, aber alles, was in dem Computer drin ist, kannst du ja darauf mappen.

Jochen

Es geht sogar halbwegs elegant.

Jochen

Also oft ist es tatsächlich so, dass es auf den tatsächlichen Anwendungsfall eigentlich ganz gut ist.

Jochen

Also oft passt es einfach ganz gut.

Jochen

Und man ist eigentlich dann zufrieden.

Jochen

Dann natürlich, in manchen Spezialfällen muss man halt dann überlegen und tricksen, weil es dann so nicht einfach geht.

Jochen

Aber prinzipiell, ja, das ist auch immer etwas, was man dann.

Johannes

Es gibt schon so Sachen, Jochen, wo ich mir da sehr schwer tue.

Johannes

Wo eben was passieren soll, wo mein gedankliches Modell nicht ist, da wird ein Datensatz erzeugt oder bearbeitet, sondern da soll jetzt etwas passieren.

Johannes

Da soll jetzt ein.

Johannes

Ich schicke ein Bild an eine Bilderkennungs-API.

Johannes

Dann ist es für mich nicht, ich möchte, dass es dieses Bilderkennungsobjekt gibt, sondern dann sage ich im Wesentlichen, ich möchte, dass jetzt dieses Bild ausgeführt wird.

Johannes

Ich möchte, dass jetzt mit diesem Bild irgendwas ausgeführt wird.

Johannes

Und trotz allem, es gibt ja die vorgenannten Puristen, die sagen, alles muss eine Rest-Schnittstelle sein und du musst alles 100% Restv machen.

Johannes

Und die dann auch so eine Schnittstelle eben als Restschnittstelle machen würden, die mir auch meine Schnittstellen oftmals um die Ohren hauen würden, weil ich eben so prozedurale Endpunkte habe, so prozedurale ein Funktionsobjekt mit folgenden Parametern wurde angelegt.

Jochen

Ja, das ist natürlich irgendwie.

Jochen

Also ja, nee, also ich meine, es gibt Dinge, die da nicht so gut reinpassen, wo man dann auch.

Jochen

Ich meine, gerade weil sowas wie, wenn man Splobs hat, eben Bilder oder sowas, da ist es sowieso schwierig, da irgendwie, genau.

Jochen

Ist ja auch dann ganz schwierig, das kriegst ja auch nicht per Get so, also das natürlich.

Jochen

Du kriegst auf jeden Fall nicht mehr per JSON.

Jochen

Du musst dann halt, wenn du Byterange testst auf irgendwelche Blobs machst, dann.

Dominik

Moment, wenn man Byterange denkt, irgendwelche Blobs, also ein Blob ist irgendwie eine Art Dateiobjekt oder sowas

erstmal ja.

Jochen

Also zum Beispiel sowas in einem Podcast-Episode.

Jochen

So eine Podcast-Episode und du willst jetzt an Minute 30 anfangen zu hören, weil da beginnt der interessante Teil über Rest.

Johannes

Aber das ist ja tatsächlich bei REST nicht vorgegeben, welche Datenstrukturen du verwendest, sondern ganz im Gegenteil.

Johannes

Naja, stimmt.

Johannes

Jeder Request soll ja immer einen Media-Type haben und dann halt kannst du es in verschiedenen Sachen abrufen.

Dominik

Also gar nicht was nur JSON, ne?

Jochen

Nee, nee, das kann auch von uns anderem.

Johannes

Kann auch XML sein, wenn du willst.

Dominik

Hurra!

Johannes

Nee, nee, aber das ist ja eine der Eigenschaften vom Web, dass das Web eben nicht nur JSON übertragen kann, sondern es kann alles übertragen.

Johannes

Und das soll hier eben auch mit reingehen.

Johannes

Und das ist auch eine der großen Stärken, die zum Beispiel in Django hat man ja diese wunderbare Bibliothek Django Rest Framework.

Johannes

Ich erinnere mich noch, als ich die zum ersten Mal gefunden habe und es war so eine Offenbarung, dass sowas geht und dann so schöne Schnittstellen macht.

Johannes

Und die einen ganz einfachen Trick verwenden.

Johannes

Browser senden als Media Type oder als Preferred Media-Type immer Application HTML mit.

Johannes

Und so Schnittstellen haben ja normalerweise Application JSON.

Johannes

Und wenn du aber Application HTML abrufst von dieser mit Django Rest Framework erzeugten Schnittstelle, dann kriegst du das Ergebnis als Webseite.

Mit allen Bells und Whistles, die es so gibt.

Johannes

Also mit Formularen und mit Login-Anzeige und mit Dokumentation automatisch angezeigt.

Und das ist eine super Sache, ja.

Johannes

Du kannst verschiedene Media-Types anfordern.

Johannes

Und auch Django Rest Framework stellt ja durch diese Serializer, die man normalerweise hat.

Dominik

Das ist wie das Formular, was man sonst so kennt, ja.

Johannes

Genau, der stellt dieses Formular zur Verfügung, der stellt auch den JSON-Datentyp zur Verfügung, der gibt dir, also es gibt auch die Möglichkeit, da XML einzustellen.

Johannes

Dann kriegst du halt XML-Objekte, die auf irgendeine Art und Weise formatiert sind.

Johannes

Du kannst auch selber einen schreiben, der halt irgendwas anderes macht.

Und das ist auch eine der Stärken.

Johannes

Das bedeutet ja aber nicht, dass jede Antwort auf Get immer ein JSON sein muss.

Johannes

Das bedeutet halt nur, dass es Media-Types gibt, die von verschiedenen Branches unterstützt werden und andere werden halt nicht unterstützt.

Johannes

Und gerade bei so einem Blow-Projekt wäre es halt dann Application.

Dominik

Irgendwie ein binärer Stream.

Jochen

Weiß ich nicht.

Jochen

Octet-Stream, ja.

Jochen

Ja, ja, ja.

Nee, stimmt schon.

Jochen

Also insofern würde das da auch reinpassen.

Dominik

Also ganz kurz nochmal, OctetStream, was ist das denn?

Ja, Octet ist ein cooler, ist der coolere Name für Bayte.

Johannes

Also es sind einfach Binärdaten, die übertragen werden.

Dominik

Also zwei hoch.

Johannes

Nee, das ist so der Fallback-Type.

Johannes

Für, wenn ich nicht weiß, was es ist, dann sind es halt irgendwie Binärdaten.

Johannes

Und das heißt halt als MIME-Typ oder als Datentyp heißt es application slash octet-Stream.

Johannes

Heißt einfach nur irgendwelche Daten, keine Ahnung.

Okay, Octet-Stream.

Dominik

Auch gerade wieder zum ersten Mal drüber gestolpert, das ist der Wahnsinn.

Dominik

Wie lange machen wir das eigentlich hier schon?

Dominik

Ich weiß nicht.

Zu lange.

Zu lange.

Dominik

Also ja, okay, Dummy REST-Framework haben wir jetzt gerade, dann sind wir ja schon wieder bei Python angekommen.

Dominik

Wir hatten aber die Methoden gerade alle so einmal durch.

Dominik

Hatten wir alle?

Dominik

Also Options gibt es, glaube ich, noch.

Dominik

Was ist das denn?

Dominik

Gibt es das?

Dominik

Auch Rest?

Johannes

Options ist we get nur ohne Inhalt.

Johannes

Das ist nur, wenn man sozusagen die Header abrufen möchte, um zum Beispiel den Datentypen rauszufinden oder die verfügbaren Datentypen rauszufinden.

Dominik

Ja, das heißt, man kann quasi nach Options fragen, dann bekommt man alle Optionen, die Datentypen.

Genau, das ist so wie ein Get.

Johannes

Das ist genauso wie ein Get, nur dass der den Inhalt nicht mitschickt.

Johannes

Das wäre zum Beispiel, wenn der Jochen jetzt seine Podcast-Episode abrufen möchte und weiß, dass das eine Zwei-Stunden-Episode ist, also eine von den kurzen, dann.

Jochen

Geradezu mickrig kurzen.

Johannes

Meine Frau hat sich vorhin darüber lustig gemacht, dass wir eben so lange Episode aufnehmen.

Johannes

Aber ich habe gesagt, das ist halt so.

Dann möchte ich eben nicht sofort

Dominik

die gesamte,

Johannes

möchte ich nicht diese ganze Episode auf einmal abrufen, sondern ich möchte erstmal sehen, ob ich die überhaupt verwenden kann.

Johannes

Und dann schicke ich da einen Options-Request hin und dann sagt mir der Server halt, ja, der hat so und so viele Bytes und der Content-Type ist so und so.

Johannes

Und dann kann ich sozusagen ausprobieren, ob diese Anfrage sinnvoll ist.

Dominik

Ja, okay.

Dominik

Interessant.

Dominik

Aber um jetzt wieder zu APIs und REST-APies zurückzukommen in Python.

Dominik

Also Django REST-Framework haben wir gerade erwähnt, also da wir alle gerne Django machen, ist das, glaube ich, einer der Ways to go.

Jochen

Das ist tatsächlich auch ziemlich großartig mit da, habe ich auch viel.

Jochen

Das ist auch so ein Ding.

Jochen

Ich weiß nicht, ich glaube, das ist auch so ein wiederkehrendes Thema, das habe ich jetzt auch von anderen schon gehört.

Jochen

Und das war bei mir so und vielleicht auch bei anderen noch.

Jochen

Also oft sind so die ersten gut funktionierenden Projekte irgendwas mit Jungle Rest Framework bei vielen Leuten gewesen.

Jochen

Ich weiß nicht so genau, woran das liegt.

Jochen

Aber tatsächlich würde ich jetzt mal so, okay, keine Ahnung, also ich habe ja Wirtschaft.

Jochen

Markt daran liegen, dass es super ist, aber auch, dass es halt einfach, dass man da dann anfängt, in einem etwas interessanteren Markt zu sein, weil das, ähm, was man sonst so sieht, also wenn du irgendwie, keine Ahnung, also das, was halt so, gibt es ja viele, viele, die so WordPress-Seiten machen oder so, keine Ahnung, Zeugs.

Jochen

Und da bist du halt in einem sehr unglücklichen Quadranten aus meiner Perspektive.

Jochen

Es ist halt irgendwie Low Budget, ja.

Jochen

Die Kunden sind üblicherweise nicht bereit, da so wahnsinnig viel Geld auszugeben, weil es gibt so Wahnsinn.

Früher ein besserer Markt.

Jochen

Ja, kann auch sein, dass das mal gut war, aber ich glaube, mittlerweile ist es nicht mehr so richtig toll.

Jochen

Dann ist es auch Low Value, weil irgendwie einfach nicht so geil.

Jochen

Also es sind meistens irgendwelche, naja, doch eher so technisch herausgefordert.

Kommt dann über die Hoster.

Johannes

Kommt dann über die Add-ons, glaube ich.

Johannes

Wenn du dann noch ein Magento drin machen kannst, dann bist du wieder.

Jochen

Genau, da kannst du natürlich irgendwie so lange Plugins installieren, bis es dann vielleicht doch funktioniert.

Jochen

Das Problem dabei ist, dann bist du aber auch bei einem anderen unangenehmen Attribut, nämlich ist es dann kompliziert und schwierig, das irgendwie richtig hinzukriegen.

Jochen

Das heißt, es ist schlecht bezahlt, du kriegst nicht so richtig viel Wert hin und es ist auch noch schwierig.

Jochen

Das ist einfach ein unangenehmer Ort, während, würde ich jetzt mal so sagen, ja.

Jochen

Während, wenn du halt dann sowas machst wie Jugo Rest Framework oder so, da ist plötzlich irgendwie, da ist richtig Wert drin, wenn da irgendwie die Apps von Leuten richtig gut funktionieren.

Jochen

Das da suchen Leute händeringend, ja, da sind dann die Preise irgendwie anders und es generiert halt auch irgendwie ordentlich Mehrwert, wenn das halt gut funktioniert und man ein nettes Interface hat, wo man die API irgendwie sich angucken kann und so.

Jochen

Und ja, das funktioniert dann plötzlich irgendwie, würde ich mal so sagen.

Jochen

Irgendwie.

Dominik

Ja, mit Django ist das echt tatsächlich ganz nett.

Dominik

Also ich habe mal so ein bisschen geguckt, was tatsächlich in der Zukunft noch so geplant ist.

Dominik

Und da stehen tatsächlich relativ nette Dinge drin.

Dominik

Zum Beispiel Real-Time-API-Support using WebSockets.

Dominik

Ja, dann mit Django Channels in Zusammenhang.

Dominik

Better Authentication by Default, also die wollen vielleicht sogar Dot und Core-Support in das Core-Package reinbringen.

Dominik

Wo wir ja eben schon kurz sprachen.

Dominik

Das klingt doch ganz interessant.

Jochen

Was ist das?

Dominik

Django Rashmanbock.

Johannes

Ne, Dominika Zemmer, ich habe gleich noch eine kleine Randnotiz.

Ja, was war denn das?

Jochen

Genau, was war das für eine Authentifizierung?

Dominik

JWDT.

Ah.

Johannes

Java JSON Web Tokens.

Johannes

Aber da gibt es ja Bibliotheken.

Johannes

Also ich meine, es ist ja nur ein PIP-installed entfernt.

Dominik

Ja, aber da gibt es halt verschiedene.

Entschuldigung.

Dominik

Verschiedene nicht so gute Varianten irgendwie.

Dominik

Die sind alle so ein bisschen.

Jochen

Ja, aber das Problem ist halt irgendwie, dass der Standard wohl nicht okay ist und dann ist es halt schwierig.

Dominik

Die Frage ist, warum der Standard nicht okay ist, wenn ich es richtig verstanden habe, weil es verschiedene Möglichkeiten gibt, diese Schlüssel zu erzeugen oder überall diese Token zu erzeugen.

Johannes

Weil es wirklich Konfigurationen gibt.

Jochen

Weil du sozusagen so Downgrade-Angriffe machen kannst.

Jochen

Du kannst dem Server sagen, ja, schön, dass du diese ganzen sicheren Methoden hast.

Jochen

Ich bin ein kleiner, dummer Client, ich kann das leider alles nicht.

Ich unterstütze die alle nicht.

Jochen

Ich unterstütze nur etwas, was halt im Protokoll, was halt im Standard definiert ist, was aber super unsicher ist.

Jochen

Und dann nutze ich aus, dass es unsicher ist.

Jochen

Und das ist natürlich kacke, wenn das im Standard steht.

Jochen

Kannst du machen?

Jochen

Ja, also das ist halt so.

Johannes

Du musst dann deinen Server so konfigurieren, dass der die Sachen nicht annimmt, aber es ist relativ schwierig rauszufinden, was jetzt gerade alles schon unsicher ist.

Dominik

Also das heißt, es geht auch nicht einen Algorithmen, der nehmen kann zum Bereitstellen dieser Token, dass man den nicht zurückrechnen kann.

Johannes

Ja, zum einen das und zum anderen auch die Token-Art.

Johannes

Es gibt ja signierte Token und unsignierte Token und wenn der Client halt sagt, ich kann nur die Unsignierten.

Ja.

Johannes

Und der Server ist so eingestellt, dass er auch die Unsignierten annimmt, dann nimmt er halt auch die Unsignierten.

Dominik

Und dann irgendwie so einen kleinen Verschlüsselungsalgorithmus nimmt, den man irgendwie in der Rainbow-Table nachgucken kann oder sowas.

Dominik

Ja, okay.

Ja, oder halt auch gar keinen.

Johannes

Wenn du sagst, na, naja, Verschlüsselung, naja, kann ich nicht.

Johannes

Das ist eben wirklich so die Frage, was ist jetzt der gerade der aktuelle Zustand der Sicherheit?

Johannes

Und eigentlich müsste man sich da sehr gut drum kümmern.

Jochen

Ja.

Jochen

Und also ich weiß nur immer, so ganz on detail kann ich es nicht.

Jochen

Ich weiß nur, dass Leute immer sagen, oh mein Gott, das ist alles schrecklich.

Jochen

Und JVT, also von im Post auf der Django Mailingliste von James Bennett, glaube ich, wo der mehr oder weniger klipp und klar gesagt, JVT machen wir, werden wir in Django niemals machen.

Das ist irgendwie.

Jot?

Dot?

Was ist das Django?

Ich hab dort.

Johannes

Dominik, du bist der Einzige der Einzige, der Job sagt.

Dominik

Okay, ich habe im Blogpost gelesen von Toni, der das schrieb.

Jochen

Ah, okay.

Jochen

Ja, vielleicht ist das richtig, ich weiß es nicht.

Ich sage immer Jason Web Turken.

Jochen

Jason Web Turken.

Ich sage immer Jason Web Turken.

Jochen

Genau, jedenfalls ist da die Ansage so, nee, das ist das Protokoll ist scheiße, das machen wir nicht.

Johannes

Was ist denn die Alternative, ja?

Jochen

Das ist halt die offizielle Alternative, sozusagen jedenfalls, so wie es in dem offiziellen Django-Podcast Django-Chat von Carlton Gibson, einem der offiziellen Django-Antainer.

Johannes

Der übrigens ein total netter Kerl.

Jochen

Der ist total netter, ja.

Johannes

Sometimes pronounced J sagt Wikipedia.

Johannes

Sometimes pronounced.

Sometimes.

Jochen

Ich versuche es dann mal jedes dritte Mal zu machen.

Jochen

Genau, der sagt halt.

Johannes

Hier im Rheinland sagt man doch JWT.

Jochen

JWD, JWD.

Jochen

Egal.

Jochen

Es ist noch immer Junge oder so.

Johannes

Es gibt noch so andere Token-Typen auch noch, oder?

Ich vergesse immer wieder.

Jochen

Paseto zum Beispiel das.

Johannes

Paseto, genau, danke.

Johannes

Aber das ist ja genau das gleiche.

Aber du wolltest

Dominik

gerade immer sicher den Django Tet Talk erzählen.

Jochen

Genau, genau.

Jochen

Also da war halt sozusagen die Ansage, na, nimm doch einfach die normale Session Authentication.

Jochen

Die ist halt so ein bisschen unkomfortabel und so, aber.

Johannes

Aber auch nicht so arg, ganz ehrlich.

Nicht so arg unkomfortabel.

Dominik

Ja, aber wenn man doch, also ja, wenn man da irgendwie kann, das, was man in Python dann macht, kann die Dort-Bibliothek nicht einfach sagen, nee, ich bin nicht downgradebar, als ist das nicht da schon mit drin?

Dominik

Also das muss ja dann.

Dominik

Standard kann das vielleicht, aber wenn jetzt mein Bibliothek

Jochen

das verbietet, dann ist das.

Jochen

Das Problem ist, du weißt ja nicht, mit welchen Clients du redest.

Dominik

Ja, aber wenn der Client das gar nicht sagen kann, weil meine Bibliothek das gar nicht zulässt.

Jochen

Ja, dann bist du inkompatibel.

Jochen

Dann sagen die Clients, mit der API kann ich nicht reden, kaputt.

Dominik

Ja, gut, kann ja sein.

Dominik

Aber den Client, den kann ich ja quasi selber sagen, was er

reden soll.

Kannst du ja machen, Dominik.

Kannst du machen.

Dominik

Dann kann man es mit Job machen.

Dominik

Dann kann man dabei bleiben, da muss man nicht sagen.

Oh nein.

Dominik

Ja, aber wenn ich den Client selber ausliefere, also das JavaScript beispielsweise, was dann mit meinem Backend reden soll und ich selber bestimmen kann, was da drin steht, dann kann doch nicht einfach irgendwer sagen, dass er jetzt einen anderen Standard dafür nehmen will.

Johannes

Dann kannst du aber auch die Session-Authentifizierung nehmen, weil da hast ja nicht viel gewonnen.

Johannes

Außer, dass du jetzt selber immer die Authentifizierung in jeden Request reintun musst, weil der Browser es nicht automatisch macht.

Dominik

Ja, und weil ich dann, aber bei Session habe ich ja noch andere Probleme, glaube ich.

Ja.

Ja, ja.

Dominik

Dann kann ja jemand zu tun, als wer ja meine Session klauen will oder sowas und dann.

Ja, keine Ahnung.

Johannes

Aber da, ja, das macht der, das verhindert der Browser.

Dominik

Ja, aber ja, egal.

Jochen

Es ist kompliziert.

Jochen

Das mit der Authentifizierung ist auch noch nicht so richtig abschließend.

Jochen

Ich bin überrascht, immer, ich habe mich da schon ein paar Mal Gedanken gemacht und ich war immer überrascht, dass es da keine einfache fertige Arbeit gelöst ist.

Jochen

Sondern dass man immer denkt, so, oh, ich habe die Antwort gefunden und dann irgendwie ein paar Monate, Jahre später kommt einer um die Ecke und sagt, was passt du denn da?

Jochen

Das ist doch totaler Quatsch.

Ich bin schon seit Jahren nicht mehr.

Johannes

Seit Jahren machen wir das nicht mehr.

Genau.

Jochen

Und dann denkt man sich immer so, oh, okay, ich glaube, ich brauche Hilfe.

Okay, ja, okay.

Authentifizierung überhaupt.

Es ist erstaunlich ungelöst.

Johannes

Es ist erstaunlich ungelöst.

Johannes

Ja, REST ist ja erstmal keine, ist ja erstmal nur eine ganz normale HTTP-Webseite.

Johannes

Also du kannst Authentifizierung machen mit allen Mechanismen, die du da halt auch kennst.

Johannes

Ich meine, wir haben auch, wir haben alle die Webseiten gesehen, die die PHP-Session-Id als Get-Parameter drin hatten.

Johannes

Dürfte man halt nicht kopieren.

Dominik

Dann dürfte man halt die Links nicht verschicken, ne?

Ja.

Dominik

Wie macht man denn sonst noch Rest-Apis mit Python?

Jochen

Genau, also ja, also General Rest Framework, schöne Sache.

Jochen

Ich glaube, in der Flask, ich weiß, weiß ich gar nicht, wenn man das ausspricht, vielleicht spricht man das auch J aus.

Jochen

Nein?

Jochen

Flask, Freeze.

Ich weiß es nicht, genau.

Jochen

Ich spreche alle Sachen immer falsch aus, sonst hat bisher noch nie niemand.

Flaskke.

Jochen

Flask.

Jochen

JSON.

Jason, ja.

Jochen

Genau, da verwendet man eher Marshmallow, das gibt es auch für Django, aber da verwendet man Django Rest Framebook, ja.

Dominik

Was ist das jetzt wie der Marshmallow?

Jochen

Ja, das ist auch eine Bibliothek.

Jochen

So ähnlich wie Django Rest Framebook, aber im Grunde, ja.

Dominik

Endpunkte.

Dominik

Benutzt man ja noch Flask Jochen.

Jochen

Ja, aber genau, da will Hot Take, ich würde ja sagen.

Jochen

So, jetzt habe ich ja was ganz Gemeines.

Johannes

Oh Joch, jetzt machst du die Tore für Flame Wars auf.

Hallo Adpython.

Jochen

Der einzige Grund, Flask noch zu verwenden, ist ja so im Grunde, aus meiner Perspektive, ich kenne mich auch nicht wirklich mit Fass aus, aber wenn man alte Python-Versionen hat, weil ja, das geht mit Flask und vielleicht mit anderen Sachen nicht.

Jochen

Aber wenn man jetzt größer Python 3.6 unterwegs ist, warum Flask?

Jochen

Warum nimmt man da nicht sowas wie Farce API?

Dominik

Also Meinung, wenn ich nicht nur eine API schreiben will.

Dominik

Hallo.pythonpodcast.de, da könnt ihr gerne einen Kommentar und hast den an Jochen uns Kommentar jederzeit erwünscht hinterlassen.

Johannes

Machen wir mal so eine Episode, wo wir die vorlesen einfach.

Die Mail?

Jochen

Ja, das Problem ist, die ist dann aber keine zwei Stunden lang.

Dominik

Ja, außerdem wollen wir ja nicht immer viele nette Nachrichten da.

Johannes

Es gibt ein sehr schönes Buch von einem Science-Fiction-Autoren, das heißt Your Hate Mail Will Be Graded.

Johannes

Wo er einfach Post, Fanpost, sagen wir es mal, in Anführungszeichen, die an ihn geschickt wurde, diskutiert.

Jochen

Ja.

Johannes

Und sowas, sowas, äh.

Johannes

Jochen, du wirst jetzt sicherlich.

Johannes

Ihr werdet jetzt, jetzt wurde es gesagt hast, dass Flask.

Johannes

Das umfasst ja auch alle anderen alternativen APIs.

Johannes

Alle anderen alternativen Systeme.

Johannes

CherryPie, Pyramid, Reboze.

Jochen

Nee, oh, Pyramid, oh, das hat man.

Jochen

Es gab ja eine neue neue Version.

Jochen

Pyramid 2.0, voll gut.

Jochen

Nee, ich weiß es ehrlich gesagt gar nicht so genau, was passt.

Jochen

Pyramid.

Jochen

Ich weiß, die gibt es alle und so.

Jochen

Manche davon können bestimmt auch voll coole Sachen.

Jochen

Bei Soap, ja.

Jochen

Ja, das war mal voll groß und so, aber ja, vielleicht ist es auch voll cool.

Dominik

Es gibt noch Bottle oder sowas, heißt das nicht auch?

Jochen

Aber das ist super, ja.

Jochen

Bottle gibt es, ist super klein.

Johannes

Ja, das ist kleiner als Flask, das ist ja, deshalb heißt es ja so.

Jochen

Aber ich meine, tatsächlich Fast API würde ich jetzt aus meiner Perspektive, es macht im Grunde, dass das Fast macht, mehr oder weniger.

Dominik

Hat auch, also nicht, ich weiß jetzt nicht im Vergleich der Flask, aber man hat mehr als das bei GitHub.

Auf jeden Fall als Bottle.

Jochen

Na super.

Johannes

Ja, aber das ist doch, also Fast API ist doch wirklich nur für APIs gedacht, oder?

Jochen

Nee, du kannst, also ich habe damit auch schon Webseiten, du kannst das Problem, so ja, ist gedacht, aber es geht auch anders.

Jochen

Du kannst da einfach Ginger 2 Templates verwenden und die Dinge ausliefern, gar kein Problem geht.

Jochen

Und genau, du musst halt alles.

Jochen

Starlet?

Jochen

Genau, Starlet ist halt sozusagen das Ding darunter als, ähm, ja.

Dominik

Die Werbung ist on par with Note.js and Go.

Ja.

Johannes

Ja, das ist das besprechen wir in der Benchmark-Effice.

Dominik

War das wieder ein Benchmark, der illegal war?

Jochen

Aber du hast halt, aber ja, ich meine, ich mache in letzter Zeit schon auch so Dinge mit FastAPI und ich finde das super.

Jochen

Ich finde gerade auch die Integration mit Pydentic echt nett.

Johannes

Alle Leute, die sich damit nicht abfinden wollen, können auch bitte an welche Mailadresse schreiben.

Dominik

Hallo at Python Podcast.

Jochen

Def0 at Feinwall.

Naja.

Jochen

Aber die Syntax ist halt besser.

Jochen

Du hast halt da, das ist halt nativ ersynkt, direkt alles.

Jochen

Die ganzen Geschichten sind halt, du könntest ja auch quasi in Django oder halt in den Serializern Sachen mit Hype-Annotationen halt sozusagen da die Typen festlegen oder so.

Jochen

Geht nur nicht, weil das ist halt älter als Hype-Annotation, deswegen musste man sich da schon was anderes überlegen, ja, in Django mit den Dreptoren.

Jochen

Aber in Fast API ist halt erst ab 3.6, das heißt, da kann man das halt so machen und dann hat man halt das in relativ eleganter Syntax ausgedrückt, wo man sonst eine Menge schreiben muss.

Jochen

Ob es jetzt so schlimm ist, weiß ich auch nicht, aber es ist auf jeden Fall irgendwie so ein bisschen erfrischend.

Jochen

Und was man halt auch geschenkt kriegt, ist, ja, das sind wir auch schon eher beim Restthema, ein Frontend, das aber nicht so wie bei Jungle Rest Framework so ein eingebautes, gerendertes Ding ist, sondern dass es halt sozusagen Swagger oder halt Open API heißt das jetzt irgendwie, dass sich aus dem Schema quasi das Frontend generiert.

Jochen

Es ist ja quasi komplett JavaScript, aber ja, dem sagt man halt hier, so ist das Schema, dann macht es halt ein Frontend dazu, das tatsächlich auch so ähnlich ist wie jetzt bei Django Rest Framework.

Jochen

Und das funktioniert eigentlich sehr gut.

Ja, sieht echt gut aus.

Dominik

Und ist übrigens auch von Sebastian Ramirez, der auch Typer gemacht hat.

Dominik

Und den hatten wir auch schon mal kurz ein, zweimal erwähnt.

Dominik

Das ist schon interessante Sachen.

Johannes

Da gab es doch noch was von dem einen, der Django Rest Framework gemacht hat.

Johannes

Wie hieß es denn gleich noch?

Jochen

Ja, das ist ja Tom, na, wie heißt er noch?

Christie.

Jochen

Tom Christie, genau.

Jochen

Ja, der hat auch Starlet gemacht.

Johannes

Ah, ist das Starlet.

Johannes

Wie hieß dieses, das hieß Star API oder irgendwie sowas?

Jochen

Äh, Fast API, meinst du?

Johannes

Nee, äh, dieser Standard, den er da sich ausgedacht hat.

Ach, ich weiß es jetzt nicht mehr.

Jochen

Ah ja, das gab's auch.

Jochen

Er hat auch ein API-Ding gemacht.

Jochen

Ja, ja.

Jochen

Aber ja, ob das.

Johannes

Das war nur sehr kurzlebig, oder?

Jochen

Ja, also jedenfalls habe ich davon dann irgendwann nichts mehr gehört.

Jochen

Da waren auch coole Ideen dabei.

Jochen

Da war zum Beispiel sowas dabei, wie, dass du dann halt auch gleich Kommandozeilen-Interface kriegst und so.

Aber irgendwie.

Was ist denn jetzt da?

LetterTöpfung wieder.

Das wären wir auch schon wieder so überschwung.

Das ist das, was unter, was Fast API darunter verwendet.

Dominik

Ach gerade, das ist quasi von einem Blame-Entwickler, der Dung Rest-Framework gemacht hat und das hat dann Fast API benutzt.

Okay, mm.

Verstehe.

Jochen

Cool, ADP.

Jochen

Also Tom Christie macht eine Menge coole Sachen.

Jochen

Der hat ja einen Nachfolger von Requests, also die Requests-Bibliothek hat so ein.

ATTP-X?

Jochen

Genau, hat so ein bisschen ein Problem.

Jochen

Und zwar einmal ist sie so slightly unmaintained, okay, so ein bisschen.

Jochen

Und sie ist auch nicht Async.

Jochen

Und zwar auch so gar nicht.

Jochen

Und das ist ja heutzutage auch so ein bisschen doof, weil wenn schon alles Async wird, dann will man vielleicht auch so Async HTTP-Requests machen.

Jochen

Und das geht halt mit Requests nicht.

Jochen

Oder es geht schon, aber da muss man halt irgendwie sehr unheilige Dinge tun und irgendwie das in Threads machen und so.

Jochen

Es geht halt nicht mit Async-IO oder so einfach.

Jochen

Ja, und HTTP-X ist aber dann Async-fähig und hat halt quasi fast die gleiche API wie Requests.

Jochen

Also bemüht sich auch quasi die gleiche API zu haben, sodass man das halt einfach quasi.

Dominik

Man kann verwenden halt, wie man es gewohnt ist.

Jochen

Genau, man kann es so verwenden, wie man es gewohnt ist.

Jochen

Man verwendet einfach HTTPX anstelle von Requests.

Jochen

Auch sehr nett.

Jochen

Aber tatsächlich irgendwie ein bisschen langsam manchmal.

Jochen

Ich weiß nicht so genau.

Jochen

Naja.

Johannes

Ich verwechsle es immer mit HTMX.

Johannes

Das ist eine JavaScript-Bibliothek, die Elemente interaktiv macht.

Jochen

Ja, das ist auch so.

Johannes

Aber ich verwechsle es immer.

Jochen

Ja, genau, also ja, das sind so, ich weiß nicht, ob ihr jetzt noch, also das ist eben Marshmallow, Jungle Rest Framework, Fast API mit Swagger Pylentic, man kann dieses Swagger Interface auch bei anderen APIs, man kann das auch mit Jungle Rest Framework verwenden.

Jochen

Das machen ja auch viele.

Jochen

Bei Marshmallow geht das bestimmt auch.

Jochen

Ich weiß nicht, gibt es da sonst noch.

Ja, das ist doch das, was jetzt OpenAI ist, also dieses OpenA-API-Shape.

Ja, was dann zu einem Swagger-File.

Johannes

Das ist da verlinkt.

Johannes

Ja, aber jetzt, um sozusagen mal noch einen Schritt weiter zu gehen, Jochen, du hast es ja schon angekündigt oder angedeutet, wenn ich jetzt eben nicht mehr so ein Interface habe, was gut auf diese Einzelobjekte passt, um es jetzt mal so zu sagen, sondern wenn ich mehr Kontrolle darüber brauche, was ich genau abrufe und welche Attribute ich abrufe, wie könnte ich das denn machen?

Jochen

Ja, genau, da kann man dann natürlich sowas nehmen wie GraphQL.

Johannes

Das ist von Facebook, oder?

Johannes

Das Facebook-Chaps entwickelt, im Wesentlichen, um genau diesen Use Case abzudecken, dass man eben Sachen aus diesem Social Graph abrufen kann, der sich nicht an die Standard-Objekt-Konventionen hält.

Jochen

Ja, sie haben halt im Grunde genau das Problem, dass sie halt sehr viele unterschiedliche, in sehr vielen unterschiedlichen Kontexten halt diese Daten, so graffförmige Daten ja auch gerade, ich meine, da passt halt auch normales SQL.

Jochen

Man könnte ja sonst auch normales SQL nehmen, ist auch, aber da passt das halt gar nicht so super drauf und dann GraphQL passt da besser und ja, gut, okay, ist auch wieder.

Johannes

Ja, ist da immer bei SQL, was du

immer sicherheiten.

Dominik

Wenn es lacht, ich hab das kurz übersehen, weil was war jetzt gerade der Joke dahinter?

Dominik

Da war ein bisschen tieferer Joke hinter der

Johannes

Jeder Softwareentwickler hat sich schon mal gedacht, wisst ihr was, ich mache meine Schnittstelle einfach so, dass ich SQL-Strings hinschicke und dann das Ergebnis zurückschicke.

Johannes

Und das ist super genial, ja, weil das ist für die Entwickler genau das, was die Entwickler haben wollen.

Johannes

Nur hast du damit halt, kannst du Sicherheit vergessen.

Johannes

Kannst du keine Sicherheitsabfragen.

Johannes

Kannst du mit SQL kannst du alles machen.

Jochen

Ja, ja.

Johannes

Und deshalb macht man das dann doch nicht, sondern denkt sich eben so Sprachen aus, wie zum Beispiel REST oder GraphQL.

Ja, genau.

Jochen

Ich weiß gerade nicht, ob die HDB-Leute noch eine eigene Sprache da haben oder ob die auch GraphQL dann haben.

Was ist denn HDB?

Jochen

Das sind auch, das sind eigentlich im Grunde die Leute hinter Python, äh, dieser ganzen Python-Async-Geschichte, hinter Async.io und so, da ja, die machen ein Ding namens HDB und ja, ist auch alles Async und so und eigentlich ziemlich cool.

Jochen

Basiert auf Postgres auch.

Jochen

Aber ich glaube, die hatten auch eine eigene Abfragesprache.

Jochen

Also ich dachte nur so, das ist vielleicht eventuell eine Konkurrenz zu GraphQL oder so, ich weiß nicht so genau.

Dominik

Also vielleicht nochmal ganz kurz zu dem Unterschied.

Dominik

Also was REST jetzt macht, ist Objekte und damit kann man so dabei Quad machen und das eignet sich super für normales SQL.

Dominik

Und GraphQL, nein, falsch.

Jochen

Nee, da gibt es sowas gar nicht.

Jochen

Du kannst bei REST kannst du halt nicht sagen, was du gerne hättest, oder du kriegst halt.

Johannes

Genau, es sind immer einzelne Objekte und immer ganze Objekte.

Dominik

Oder Listen von Objekten oder sowas.

Jochen

Ja gut, du kannst halt natürlich unterschiedliche URLs machen, die dann unterschiedliche Sachen liefern, aber du kannst halt jetzt nicht, das wäre halt nicht Rest-Kompost.

Eigentlich.

Johannes

Eigentlich, genau, hat jedes Objekt in REST seine eigene URL.

Johannes

Und das Höchste der Gefühle ist, dass du halt Listen haben kannst, die bestimmte Eigenschaften haben.

Johannes

Zum Beispiel entweder alle oder die, die in X verlinkt sind.

Johannes

Dass du so Sublisten hast.

Johannes

Dann kannst du natürlich noch Filter machen, aber das geht dann schon raus.

Johannes

Weil dann hast du schon so Listen abgerufen, die eigentlich, die es eigentlich gar nicht gibt und das ist schon so.

Dominik

Gar nicht Rest.

Johannes

Eigentlich sollte es

nicht so.

Dominik

Also ich sollte alle Abfragen einzeln machen, um zu gucken dann, ob die da drin sind und dann alle wieder wegschmeißen, die es nicht sind.

Johannes

Nee, das ist nicht, aber diese Liste selber ist nicht, die wird nicht von REST beschrieben, weil diese Liste selber kein Objekt ist.

Johannes

Das heißt, um diese Liste zu finden, musst du schon wieder mehr wissen, als in Hater was drin ist.

Johannes

Weil die nirgendwo verlinkt sein kann.

Dominik

Jetzt musst du nochmal kurz erklären, was Haterwas ist, das hat nämlich eben niemand verstanden.

Johannes

Das sind diese Hypertext, also dass alles über einen Hyperlink erreichbar ist.

Dominik

Deswegen nimmt man auch Hyper-Serializer beim Dungo Rest Framework.

Jochen

Hyper-Link Serializer, genau, ja, das ist.

Johannes

Genau, damit die Links alle korrekt drin sind, damit du draufklicken kannst, das ist eigentlich einer der Grundsätze, dass du sozusagen den API-Root anklickst und da steht dann drin, was es alles gibt, und dann klickst du da drauf und da steht dann drin, hier gibt es die Objekte vom Typ so und so und dann klickst du da drauf und dann kommt ein Objekt vom Typ so und so.

Johannes

Dass alles, was es gibt, über einen Hyperlink erreichbar ist.

Johannes

Und wenn du jetzt so Get-Parameter einführst, die Filter haben oder so, dann sind die nicht über einen, dann sind die nirgendwo verlinkt.

Johannes

Die musst du kennen.

Johannes

Und das ist schlecht, weil die, weil, weil dann ist deine API nicht mehr durchsichtig, sondern die ist jetzt undurchsichtig geworden.

Johannes

Du findest das nicht in der API.

Dominik

Vielleicht über Options?

Dominik

Kann man sowas in die Options schreiben?

Johannes

In den Options-Headers, da kriegst du eigentlich die Header zurück und dann müsstest du dir wieder irgendwelche X-Header überlegen, die auch nicht standardkonform sind, die du auch, von denen du auch wissen musst, dass du quasi die Header gucken musst, um das zu finden.

Johannes

Das, was Django Rest Framework da macht, ist ja schon eine sehr gute Sache, ja, dass du die Dokumentation mit lieferst, kannst du die Dokumentation einschreiben.

Johannes

In einem Swagger-File weiß ich gar nicht, wie das abgebildet werden würde.

Johannes

Ich glaube, da gibt es auch eine Möglichkeit, Parameter zu definieren.

Johannes

Aber es ist eben nicht mehr in der API selber drin, sondern es geht über die API hinaus.

Johannes

Und das ist eigentlich nicht was, was man möchte.

Johannes

Es ist nicht erfahrbar.

Dominik

Gut, aber das ist ja schon wieder jetzt so das, wo es halt regnet, ne?

Dominik

Und du willst halt, jeder möchte irgendwelche Dinge filtern.

Johannes

Ja klar, und deshalb hat da jede REST API auch sowas.

Johannes

Aber es ist eben nicht offensichtlich.

Johannes

Wenn du die zum ersten Mal benutzt, dann weißt du nicht, dass es da ist.

Johannes

Und du findest eventuell erst, wenn du sie fünf Jahre lang benutzt hast.

Johannes

Und das ist eigentlich nicht gut.

Johannes

Und GraphQL ist jetzt wieder so ein kleines bisschen ein Schritt in Richtung Remote Procedure Call, wo du eben nicht sagst, gib mir folgendes Objekt, sondern es ist mehr so, führe bitte folgende Abfrage aus.

Dominik

Du hast halt eine Schritte von Objekten, die in einer Kette von Sindskette liegen.

Jochen

Du hast halt auch nicht eine URL für die unterschiedlichen Geschichten, sondern du hast halt eine URL, an die alles geht.

Jochen

Und es gibt nicht mehr Delete Pad Putsch Putsch.

Jochen

Der mächtigste allerdings.

Johannes

Aber auch sehr teuer.

Johannes

Sehr tun zwei, Payment Required.

Jochen

Funktioniert nicht immer.

Jochen

Genau.

Jochen

Es gibt eben diese ganzen Daten nicht, es gibt nur Post.

Jochen

Das war's.

Jochen

Und ja, das ist natürlich

Johannes

andere Vor- und Nachteile.

Jochen

Es hat halt andere Trade-Offs irgendwie.

Dominik

Okay, also ich kann damit dann tiefer reingucken und bekomme andere, deutlich fokussiertere Daten schneller oder wurden jetzt bei Kraft.

Johannes

Ja, eventuell schneller.

Johannes

Insbesondere kannst du es steuern.

Johannes

Du kannst sagen, ich habe jetzt in diesem Request brauche ich alle Objekte, die folgende Eigenschaften haben und dazu alle, die folgende Eigenschaften haben und davon aber nur das Attribut Name.

Johannes

Und anstatt, dass du dann halt in deiner Übersichtsliste, so wie es bei REST ist, erstmal alle abrufen musst, um den Namen anzuzeigen, führst du halt diese eine Abfrage aus und kriegst die Liste der Namen zurück, die du dann direkt anzeigen kannst.

Johannes

Also diese GraphQL-Channelstelle ist viel näher an so einem Datenbankinterface, jetzt ganz spezifisch für Graf-Datenbanken, als das REST ist.

Dominik

Also eine Grafatenbanken.

Dominik

Mehrt dann Sinn, wenn man sowas wie, ich versuche jetzt mal abstrakt zu visualisieren, wolkige Datenformen hat als tabellenförmige Datenformen.

Jochen

Ja, wenn du, wenn du, wenn du, wenn du verschachtelte Strukturen hast, also wenn du zum Beispiel eine Liste von Freunden von Freunden hast oder Kommentare, die auf Kommentare zeigen, die irgendwie in so einer Graphenstruktur halt irgendwie angeordnet sind, weil dann wird es halt mit SQL immer so ein bisschen ätzen, das geht auch, aber ist halt dann, da muss man sich dann was einfallen lassen.

Dominik

Also wenn ich in SQL jetzt denken würde, wenn ich zu viele Foring-Keys hätte in meinen einzelnen Daten.

Nee.

Jochen

Nee.

Johannes

Nee, rekursive, rekursive.

Jochen

Genau, wenn du einen Baum hast oder einen Graphen im Allgemeinen.

Dominik

Also dich auch in einer Kreis.

Jochen

Das ist gar nicht so einfach das andere.

Johannes

Was denn was denn deine Lieblingsgrafenstruktur in Datenbanken?

Jochen

Ich weiß, dass der Autor von Fein CMS, der Treebird, ich weiß nicht genau, was der was ich eine ganze Zeit gemacht habe, ist NZZ.

Jochen

Das geht eigentlich ganz gut.

Jochen

Aber es ist halt schon echt haarig.

Jochen

Also das ist schon so ja.

Johannes

Mit Hilfe Paths sind die Abfragen so bescheuert, das ist schon cool, aber die Abfragen sind so blöd, die will man nicht so.

Dominik

Ihr habt jetzt gerade wieder irgendwie Daten?

Dominik googelt.

Jochen

Ja, also die Frage ist halt, wie bildet man solche Strukturen eigentlich in relationalen Datenbanken ab und das ist halt nicht so einfach.

Jochen

Es gibt halt das, ja ist das grüne Buch von Juli Celko oder so, Trees and Hierarchies in SQL oder so.

Jochen

Das kann man sich halt durchlesen, da stehen die ganzen Methoden, die man da verwenden kann, drin.

Jochen

Aber tatsächlich, also das, was wir tun.

Die sind alle schlecht.

Die sind alle, ja.

Johannes

Und die sind alle schlecht, die sind alle blöd.

Johannes

Letztendlich, es ist einfach schwierig, Graf-Daten, also Vernetzungs-Vernetzwerke in eine Tabelle zu schreiben.

Johannes

Weil in der Tabelle hast du einfach inhärent kannst du keine Netzwerke reinschreiben.

Johannes

Und alles, was man da macht, ist ein Hack.

Johannes

Und die haben alle Vor- und Nachteile und die sind alle schlecht so.

Johannes

Und deshalb gibt es ja auch Graf-Datenbanken und eben andere NoSQL-Datenbanken, die dafür besser geeignet sind.

Jochen

Ja, und ein klassisches Anwendungsbeispiel für sowas, wo man das dann halt braucht und wo man Schwierigkeiten mit, ist halt sowas wie, ja, wenn ich jetzt wissen will, was sind denn jetzt alles meine Freunde vierten Grades oder so, dann wird halt, ist halt auf einer SQL-Datenbank, ist halt kacke.

Dominik

War das nicht irgendwie so eine Theorie, die sagte, dass man mit allen Freunden oder allen Leute, die in Fapswork gemacht haben,

sechsens in.

Jochen

Genau, Small World Theorem, ja.

Sechs?

Ja.

Johannes

Six Degrees of Separation heißt er.

Okay.

Johannes

Six Degrees of Kevin Bacon heißt es auch, glaube ich, aber das noch war was anderes.

Jochen

Ja, ja, ja, ja.

Johannes

Ja, aber also wie gesagt, GraphQL ist quasi so ein Schritt in Richtung RPC wieder, wo ich eben einen Endpoint habe, wo ich alles hinschicke und dann aber dafür eben vergleichsweise komplexe Abfragen ausführen kann.

Johannes

Ich kann da allerdings auch eben vergleichsweise komplexe Updates ausführen, dass ich eben sage, ich möchte gerne folgende Objekte holen und dann auch bearbeiten oder folgende Objekte holen und dann auch irgendeine Operation aus denen ausführen.

Johannes

Und das ist sehr, sehr mächtig.

Johannes

Aber es ist eben nicht mehr so erfahrbar.

Johannes

Es ist nicht so durchsichtig wie eine REST API, weil man eben wieder darauf zurückgeht, dass man die Dokumentation hat, dass man die Namen von den Funktionen wissen muss, dass man die Attribute von den Objekten wissen muss und ich kann nicht Deep Links drauf machen.

Johannes

Was bei einer API nicht ungeheuer schlimm ist, aber ja, es ist einfach mehr Wissen außenrum.

Jochen

Ja, der Client wird halt viel, ist halt viel, viel, muss halt viel fetter sein, sozusagen.

Jochen

Auch eine nette Geschichte, da kommt darauf an, welchen Client und welche Server und man so verwendet, aber man kann halt auch sowas machen wie Subscribe, dass man halt eine Query, die man eh stellen muss.

Jochen

Also man muss sie eh hinschreiben, weil man ja irgendwie die Daten holt und dann sagt man halt, wenn man daran interessiert ist, Updates davon reaktiv zu bekommen, dann sagt man halt einfach nur Subscribe und dann kriegt man per Websocket halt Änderungen an dem Query-Set, auf das man subscribed ist.

Jochen

Und dann kann man tatsächlich, wenn zwei Leute irgendwie den gleichen Kram editieren oder so, dann sieht man die Änderungen von einem anderen halt direkt oder so.

Jochen

Das ist halt, geht alles automatisch.

Voll gut.

Jochen

Ja, tolle Sachen.

Johannes

Ich habe vor einer Weile was gefunden, das heißt Graffiti mit pH.

Johannes

Graffiti.dev, das ist auch ein Link, der da rein muss, was mir sehr gut gefallen hat.

Johannes

Ich weiß noch nicht, wie ich damit zurechtkomme und ob das.

Johannes

Das ist so ein bisschen wie Ruby und Rails.

Johannes

Ruby und Rails hat ja früher die ganzen coolen Sachen gekonnt, die Django, wo Django so ein bisschen langweilig war.

Johannes

Und hier ist es jetzt wieder genauso.

Das ist so eine Ruby-Bibliothek, die so ein bisschen die Brücke schlägt zwischen REST und GraphQL.

Johannes

Das ist quasi REST mit ganz vielen Konventionen, sodass du daraus so eine Art GraphQL machst.

Johannes

Mit den Vorteilen von beiden Seiten.

Johannes

Du kannst coole Queries ausführen, aber hast trotzdem die ganzen guten Vorteile.

Jochen

Okay, interessant, mal angucken.

Johannes

Ja, aber alle Beispiele sind in Ruby und ich habe noch nicht gefunden, ob das auch in Python oder gar in Django geht und das wäre sehr schön.

Johannes

Diese Konzepte, die da drin sind, haben mir sehr gut gefallen, weil die halt sehr viel über Konventionen machen.

Johannes

Es ist quasi eine Rest-Trintstelle mit ganz vielen Konventionen.

Johannes

Und auch mit ganz vielen, wo dann eben Sachen über Datentypen laufen.

Johannes

Also hier wird dann so eine Ressource definiert, die ein Attribut hat, was ein Name ist, was ein String ist, der sortable ist, der filtrable ist.

Johannes

Und wenn du diese zwei Attribute hast, dann weißt du ja schon ganz viel darüber.

Johannes

Dann weißt du schon ganz viele Operationen, die du da machen kannst.

Johannes

Was dann eben wieder zurückgeht auf das, was der Dominik eben angesprochen hat.

Johannes

Man braucht halt sortieren und Filtern und irgendwie muss man das abbilden.

Johannes

Und warum nicht eine gängige Konvention machen und das dir Ressource mitgeben und sagen, okay, hier, da steht immer dieses, dass es sortierbar ist, ja oder nein, oder dass es beschreibbar ist, ja oder nein, dann reicht es doch aus, das zu wissen.

Johannes

Und das ist quasi so eine Formalisierung davon, dass du nur noch diese Attribute hast und dann ganz viel daraus automatisch rausfällt.

Johannes

Und das ist ein sehr schöner Ansatz, der vielleicht meiner Meinung nach auch sehr zukunftsweisend ist und auch noch nicht weit genug überall verfügbar ist.

Dominik

Das heißt, du fragst einfach die API und weißt direkt, wie man die benutzen kann, ohne dass du weiter.

Johannes

Du fragst quasi die API nach den Datentypen und aus den Datentypen ergeben sich dann Sachen.

Johannes

Die API gibt dir auch zu den Datentypen die Operationen zurück, aber wenn da eben zu einem Feld Sortable drin steht, dann brauchst ja gar nichts mehr dazu sagen.

Johannes

Weil das ist eine Standardsache, die jeder braucht und dann kannst du einfach sagen, okay, ich weiß jetzt, wie sortable, dass es auf diesem Feld sortable ist und ich weiß, wie Sortable auf diesem auf Feldern generell funktioniert oder auf Feldern vom Typ String funktioniert, dann kann ich da einfach diesen Sortable, diese Sortable Operation, diese Sortieroperation machen.

Johannes

Und das ist so ein bisschen das, als ich das zum ersten Mal gelesen habe, war das auch so ein Moment, wo ich mir dachte, ah, das ist genau das, was beiden fehlt.

Johannes

Das ist eigentlich die Vorteile von REST und die Vorteile von GraphQL zusammen.

Johannes

Leider habe ich es noch nicht realisieren können, weil es eben, wie gesagt, so, ja, Installation, da steht dann, wie man es bei Ruby installiert und dann, gut, schade.

Johannes

Also in meine Rails-Applikationen könnte ich das jetzt sehr leicht reintun.

Johannes

Leider habe ich davon keine.

Johannes

Ja, schade.

Dominik

Klingt also hätte jemand Lust, ein Open Source-Projekt anzufangen.

Lust schon.

Falls ich Sponsoren für dieses Unternehmen finde, die melden sich bitte bei hallo atpodcast.de wäre sehr daran interessiert, da einen Sponsor zu finden.

Ich würde auch meinen üblichen Stundensatz reduzieren, selbstverständlich für Open Source Work.

Johannes

Bisher habe ich keinen Sponsoren gefunden, der das bezahlen könnte.

Johannes

Meine Firma ist leider nicht reich genug, um so was Großes anzugehen.

Johannes

Aber jemand sollte das machen, absolut.

Ding schön.

Jochen

Ja, ansonsten, genau, ich weiß nicht, auch interessant, diese Formate, die man da übertragen kann.

Jochen

Dazu fällt mir gerade noch eine Geschichte ein.

Jochen

Es gibt da so einen Podcast, den ich auch immer höre, weil mich dieses im Prinzip dieses ganze, weil ich diese, die, na, diese, oh Gott, Hölzchenstöckchen, ich fange immer noch weiter vorne an.

Dominik

Wir kennen das schon Jochmig eigentlich

Jochen

eigentlich allerdings.

Jochen

Python Podcast ist ja sozusagen in Python Django selber gehostet.

Jochen

Und ja, ich bin nicht so richtig super zufrieden damit, wie also es funktioniert schon so, aber so eigentlich würde mich natürlich nicht interessieren, wenn man das richtig macht.

Jochen

Und da gibt es einen anderen Podcast, nämlich den Potlovers Podcast.

Jochen

Und genau, den höre ich dann, weil da reden Leute darüber, wie sie das halt, also Podlove ist halt das WordPress-Plugin.

Johannes

Das ist quasi ein Meta, ein Meta-Podcast, ein Podcast über

Podcast, ja.

Jochen

Ja, oder über Podcasts tatsächlich, genau.

Jochen

Und da dachte ich, ja, vielleicht dann, wenn ich das an, wenn ich da mal, also ich finde es auch tatsächlich, es ist ein super Ding und ich höre das und versuche mir dann die ganzen guten Ideen alle, versuche ich da zu stehlen und dann selber zu verwenden.

Jochen

Und letztens gab es dazu eine interessante Episode zu den, auch zu Podcast-Clients und zu Feedparsingen und sowas.

Jochen

Und also ich weiß jetzt gar nicht, möchte ich gar nicht da, es gab da einige Episoden schon, ich weiß jetzt nicht mehr genau welche, wo es darum ging, wie sollen denn die Formate und jetzt gibt es auch inzwischen Podcasts sind ja so relativ gehypte Geschichte auch und jetzt kommen Leute wieder auf die Idee, nachdem da seit zig Jahren, irgendwie über zehn Jahren lange nichts an den Standards passiert ist, oh, vielleicht können wir noch irgendwas an den Standards machen, weil vielleicht will man ja auch dann so ein paar Features ändern oder sich irgendwie abgrenzen oder keine

Jochen

Ahnung, cooler sein als die anderen.

Jochen

Und es gibt jetzt Podcastindex.org und so, wo halt, das sind auch Leute, die das schon ganz lange machen, sich halt wieder so überlegen, ob man da nicht noch irgendwelche neue, interessanten Dinge statisieren kann und so.

Jochen

Und da ging es dann halt auch immer darum, okay, die ursprünglichen Standards zu Podcasts oder zu Blogs, irgendwie, das ist halt alles XML, ne, RSS.

Dominik

RSS ist XML?

Ja.

Jochen

Genau.

Jochen

Und die Frage wäre halt, okay, und dann gab es irgendwie die Idee, oh, man könnte ja vielleicht auch JSON-Feeds nehmen.

Jochen

So heute macht man ja eigentlich keine XML mehr so richtig.

Jochen

Und wäre das nicht irgendwie besser?

Jochen

Und dann war so, hatte ich so den Eindruck, da waren Leute doch, fanden XML eigentlich ganz cool und dachten so, nee, JSON, bar, warum denn?

Jochen

Und lieber XML.

Jochen

Und zum Rest hat man dieses Problem ja auch, dass man die Daten irgendwie übertragen muss und da habe ich auch so das Gefühl, so XML spielt im Grunde keine Rolle mehr, so richtig.

Jochen

Und alle machen halt irgendwie JSON.

Jochen

Ich weiß, man könnte es auch als CSV machen, hat das jemand schon mal gemacht?

Dominik

Also ihr müsst aber kurz Grunde nennen, warum es überhaupt XML gut sein könnte.

Dominik

Ich habe das nämlich letztens irgendwann mal gehört, dass irgendwie meinte, oh, XML wäre doch eigentlich total unterschätzt.

Jochen

Ja, also weiß ich, also ich kann mir vorstellen, wie man auf die Idee kommt.

Jochen

Ich würde das wahrscheinlich nicht sagen.

Jochen

Also ich hatte eigentlich nie eine besonders hohe Meinung von XML und aber ich kann, ich kann in gewisser Weise verstehen, wie man aus einer theoretischen Perspektive sozusagen drauf kommt, dass das eine gute Idee wäre, weil viele der Probleme, die man sonst hat, wenn man das nicht macht, man ja vielleicht damit lösen könnte.

Jochen

Also zum Beispiel eben, wenn man jetzt das vergleicht mit sowas wie CSV, was früher, also wenn man mit CSV Probleme hat, dann könnte man denken, dass XML vielleicht eine, ja, also man könnte sich vorstellen, dass XML vielleicht eine gute Idee ist, wenn man jetzt schon mal vorher so.

Das ist immer eine gute Idee.

Da kann man alles machen.

Jochen

Ja, kann man.

Jochen

Tatsächlich, aber ja, also wenn man jetzt vorher, wenn man jetzt irgendwie sowas wie CSV hat und man hat jetzt da Probleme, weil irgendwie Leute schreiben da komische Sachen rein und Dinge gehen kaputt, wenn man sich denken so, mir reicht's, diese Barbaren, immer was die da für komische Sachen.

Jochen

Also tatsächlich, ich habe auch einige Zeit im Import-Export-Geschäft sozusagen von solchen Daten verbracht.

Jochen

Und da passieren halt die komischsten Sachen, dass halt irgendwie das Encoding wechselt von Zeile zu Zeile, dass IDs halt keine IDs sind, dass irgendwie das Escaping sehr kreativ anders ist und das hat halt damit zu tun, dass halt da Daten aggregiert werden aus unterschiedlichen Datenquellen, dass die dann irgendwie nochmal als Excel irgendjemandem auf dem Tisch landen und der editiert dann fröhlich drin rum, speichert es wieder als was anderes und schickt es dann nochmal raus oder so.

Jochen

Also da passieren dann wilde Sachen.

Jochen

Und da könnte man sich jetzt denken, oh super, nehme ich doch XML.

Jochen

Habe ich dieses Problem gelöst?

Johannes

Dann sind alle Probleme gelöst.

Jochen

Da sind alle Probleme gelöst, weil da habe ich ein Schema, da steht drin, was das ist.

Jochen

Und wenn da jemand dann Mist macht, dann geht das einfach gar nicht.

Dominik

Es schaut die Spezifikation quasi mit in der Datei.

Jochen

Ja, ein Schema.

In einer anderen Datei.

Jochen

In einer anderen Datei, die genau.

Jochen

Aber ja, tatsächlich ist es aber so, also ich würde sagen, eben, es klingt danach, als wäre das eine Lösung praktisch.

Jochen

Jetzt so aus diesem Tagesimport-Export-Geschäft mit vielen Dateien, die da reinkommen und rausgehen und unterschiedlichen Anforderungen und komplizierten und komischen Systemen dahinter und seltsamen Leuten und so, muss ich sagen, wir haben dann irgendwie, also XML und CSV gehabt und wir haben immer CSV empfohlen.

Jochen

Und XML hat zu vielen fiesen Problemen geführt, die ehrlich gesagt schlimmer waren als das, was wir mit CSV haben.

Johannes

Aber nicht die Encodings.

Johannes

Nicht die Encodings.

Jochen

Das Encoding war okay, ja.

Johannes

Encodings sind gut bei XML.

Jochen

Ja.

Jochen

Naja, gut, manchmal kriegt man auch so komische Byteorder-Marker vorne dran, die dann irgendwie auch Sachen kaputt machen.

Aber ja, tatsächlich, aber das Problem ist halt, wenn du, wenn du den Leuten halt sozusagen ein oder aus, das wäre sozusagen das Ding, was ich dazu mitgeben wollen würde, und die Anekdote dazu wäre halt, wenn man, wenn man es unmöglich macht, dass solche Fehler passieren, dass halt zum Beispiel das Encoding pro Zeile sich ändert oder so, dann kann es sein, dass das dazu fü

Jochen

hrt, dass die Fehler schlimmer werden und nicht besser.

Jochen

Nämlich, was dann halt tatsächlich passiert, was man dann beobachtet, was ist die Konsequenz, wenn man das unmöglich macht, dass solche Fehler passieren, nun ja, dann kriegt man halt Dateien, die zwar syntaktisch okay sind, aber die semantisch halt irgendwie nicht mehr funktionieren, wo dann zum Beispiel Teile einfach fehlen oder die leer sind.

Jochen

Die sind dann ein gültiges XML-Dokument, aber es ist halt irgendwie leer.

Jochen

Und dann ist halt die Frage, okay, was macht man denn?

Johannes

Ja, oder du hast es dann, oder hast dann die Fehler in den Daten drin.

Johannes

Ich meine, wir haben ja alle schon mal diese UTF8-Steuerzeichen in Latin One-Dingern drin gesehen.

Johannes

Und wenn das jemand reinkopiert, dann ist halt so.

Johannes

Und dann kannst du auch nicht mehr viel machen.

Jochen

Genau, und dann, das ist nämlich der Punkt, wo es dann eben, wenn dann Fehler passieren auf einer anderen Ebene oder halt so, dass der XML-Parser sagt, alles okay, aber es ist eigentlich gar nicht okay, dann kannst du nicht mehr viel tun.

Jochen

Bei einem CSV, wo das, da kann man immer noch was tun.

Jochen

Wenn da irgendwie eine Exception fliegt, dann kann man die immer noch fangen und kann sagen, okay, den Kunden kenne ich.

Jochen

Der kann sich nicht einigen, ob er da jetzt Death One oder UTF8 oder CP51, weiß ich nicht, das Windows-Dings da verwendet oder so.

Jochen

Ja, ja, ist schon okay, dann probieren wir die mal der Reihe nach durch und einer von den Codex wird schon funktionieren.

Jochen

Meistens funktioniert es auch.

Jochen

Und selbst wenn es nicht funktioniert, dann ist halt eine Zeile kaputt oder so.

Jochen

Was oft nicht so schlimm ist.

Jochen

Wenn einer von 10.000 Zeilen kaputt ist, na gut.

Jochen

Das sozusagen degraded gracefully, sozusagen irgendwie.

Naja, das ist eine sehr interessante Beschreibung von Graceful Decred.

Jochen

Es kommt vielleicht auch drauf an, welche Zeile das war.

Jochen

Aber im Endeffekt, da werden Leute nicht wütend oder rufen an, deswegen, oder so, wenn da eine Zeile nicht okay war.

Jochen

Wenn das XML leer war und man jetzt raten muss, was passiert ist, möchte der Kunde zum Beispiel alle seine Angebote löschen.

Jochen

Weil wenn man es definiert hat, wenn das ein leeres Ding ist, dann macht man dann.

Jochen

Oder offline schalten, dann kann man das tun.

Jochen

Das könnte Ärger geben.

Jochen

Oder man macht es nicht.

Jochen

Das könnte ja auch Ärger geben, weil vielleicht wollte er es ja tatsächlich machen.

Jochen

Also man muss halt irgendwie dann raten und das ist halt doof, weil jede dieser Entscheidungen, die man trifft, kann halt potenziell entweder bei einem selber zu irgendwie größeren Problemen und Geldverlust oder beim Kunden zu größeren Problemen und Geldverlust führen.

Jochen

Und das ist halt schlecht, weil das ist halt nicht so richtig gracefully.

Jochen

Und ja.

Johannes

Das ist so ein bisschen wie diese statistische interessante Anormalität.

Johannes

Als man die Helmpflicht für Motorräder eingeführt hat, ist die Zahl der Kopfverletzungen gestiegen.

Johannes

Und der Grund ist halt einfach, dass die Leute, die vorher gestorben sind, jetzt Kopfverletzungen haben.

Jochen

Ah, okay.

Johannes

Und so ein bisschen ist es da halt auch.

Johannes

Du schließt die einfachen Fehler aus.

Johannes

Und deshalb kommen jetzt halt die schlimmen Fehler.

Jochen

Ja, eine andere Möglichkeit wäre auch noch, dass die Leute, die vorher Fahrrad gefahren sind, jetzt dann halt irgendwie Auto fahren und dann die Wahrscheinlichkeit für Kopfverletzungen im Auto steigt oder sowas.

Johannes

Ja, genau, viele unabsehbare Konsequenzen.

Johannes

Unintended Consequences.

Dominik

Externe Effekte.

Jochen

Ja, insofern.

Dominik

Jetzt haben wir zu viel über XML geredet in der Restfolge, ehrlich gesagt.

Johannes

Ja, das ist ja nicht ausgeschlossen.

Johannes

Du kannst ja, wie auch Junker Rest Framework bietet ja den XML-System.

Dominik

Will das dann lesen, wer will das denn parsen, wer will das denn weiterverarbeiten, das ist doch alles total hässlich und dann.

Johannes

Ja, kann doch sein, dass du irgendeinen Client hast, der das halt gerne haben will.

Dominik

Für Entity und Attributes of Attributes of Attributes of Entities, bah.

Johannes

XML hat ja auch Vorteile.

Dominik

Zähle uns die doch bitte auf, Jonathan.

Johannes

Nein.

Johannes

Ich weiß, dass es welche hat, aber ich will sie jetzt nicht sagen, weil ich will niemanden dazu verführen.

Na gut.

Jochen

Ja, ein anderes Format, auf dem man auch noch gut rumhalten könnte, wäre JSON.

Jochen

Das ist, ich meine tatsächlich, ehrlich gesagt, es hat auch so diverse Hässlichkeiten und so.

Jochen

Aber JSON funktioniert eigentlich schon.

Jochen

Also das kann man eigentlich auch.

Jochen

Also man kann das schon nehmen.

Jochen

Es ist nicht so schlimm.

Ja.

Johannes

Ich bin mal ein großer Freund von Message Pack.

Jochen

Ja, ja, ich weiß.

Dominik

Was ist das Message Pack?

Johannes

Message Pack ist quasi binäres und gepacktes JSON.

Dominik

BJSON.

Dominik

Sagt man das so?

Johannes

Ja, BJSON ist nochmal was anderes.

Johannes

Und es gibt auch BSON, also B-S-O-N.

Johannes

Das Binary Serialized Object Notation oder sowas.

Johannes

Ist auch was anderes.

Johannes

Das ist das, was in Postgres drin ist.

Johannes

Und da gibt es noch HSON.

Johannes

Das weiß ich nicht, was es ist.

Johannes

Das ist auch in Postgres drin.

Jochen

Das ist, glaube ich, die ältere Variante, aber ja.

Johannes

Ja, kann sein.

Johannes

Ja, Message Pack ist quasi ein Drop-in-Replacement für JSON, nur schneller und kleiner.

Jochen

Das kann man, glaube ich, bei Django Rest Framework kann man das auch irgendwie mit dazu konfigurieren.

Johannes

Ja, klar, das ist halt auch so ein Standard, ah, die heißen nicht Serializer, sondern heißen irgendwie anders.

Johannes

Es muss man halt in der Konfiguration angeben als Klasse und die haben ja ihre Abfolge und wenn der Client nichts sagt, dann kriegt das halt in der richtigen.

Jochen

Ich glaube, die heißen irgendwie Renderer oder sowas.

Johannes

Ja, das kann sein.

Johannes

Früher war das tatsächlich, konnte man tatsächlich sehr schöne Dinge machen, weil halt Message Pack-Nachrichten kleiner sind als JSON-Nachrichten.

Johannes

Und in einem Mobile-Umfeld war das früher ein sehr wichtiger, sehr wichtiger Aspekt, dass man unter 65 Kilobyte bleibt, weil das eben ein Datenpaket war.

Johannes

Früher, damals, als es noch 3G gab oder 2G oder was auch immer.

Johannes

Und da war Message Pack richtig, war ein richtiger cooler Vorteil, weil du halt nichts machen musstest und trotzdem unter den 65k geblieben bist normalerweise.

Johannes

Und das war damals wichtiger.

Johannes

Heutzutage ist es wichtiger, dass es lesbar ist, deshalb blimmt man die bei JSON.

Jochen

Ja.

Jochen

Ja, oder andere Leute, die direkt komplett alle Daten, wenn man nicht viele Daten hat, was man auch ganz gut machen kann, ist, man zieht einfach alle Daten komplett.

Johannes

Ja.

Jochen

Weil man dann halt auch die Antenne nicht so, das ist ja auch sowas, ne?

Jochen

Stromverbrauch und die Antenne anschaltet.

Johannes

Ja, macht man auch nicht mehr so häufig.

Jochen

Ja, eigentlich ist es ja auch.

Johannes

Ich meine, jetzt haben wir sehr viel über REST gesprochen und über Alternativen.

Johannes

Im Grunde ist REST ja was ganz Simples.

Johannes

Es ist einfach nur die HTTP und HTML angewendet, äh, nicht HTML, HTTP angewendet auf APIs.

Johannes

Und ja, so sollte man das machen.

Johannes

So wäre es gut, wenn man das macht.

Johannes

Und das ist ja schon.

Jochen

Oh, eine Sache, die ich ganz interessant finde, die eventuell nochmal dazu führen könnte, dass es halt so ein bisschen Renaissance in die Richtung gibt, weil man, vielleicht kann man Teile von dem, was man jetzt mit GraphQL macht, auch dadurch erreichen, dass man Endpunkte miteinander kombiniert oder irgendwelche Aggregationsendpunkte macht.

Jochen

Und die dann halt per Async, also normalerweise sagen so, ja, viele Requests machen, nicht so cool, weil blockiert halt immer alle immer einen Worker im Applikationsserver, aber wenn man jetzt Async hat, dann ist es vielleicht auch egal.

Jochen

Und dann kann man sich sozusagen seine Ergebnissets auch so ein bisschen darüber zusammenbasteln und diese Dinger halt Endpunkte vielleicht so on the fly generieren oder weiß ich nicht.

Jochen

Naja.

Dominik

Ja, aber zu diesen, äh, da gibt es übrigens einen Artikel zu, wenn ich jetzt mal da Werbung machen.

Dominik

Darf auf deinem Blog, Jochen, über diese Async-Agggregations-API, hast du da einen kleinen Beitrag zugeschrieben.

Jochen

Achso, ne, da, da, da, das, ja, das ist aber sozusagen nur quasi, wenn man andere APIs abfragt.

Jochen

Das ist natürlich auch ein Anwendungsfall für iSync, genau, weil eben man dann halt nur auf den, die Zeit, die Latenz ist nur die Zeit, die der längst laufende Request braucht und nicht mehr, wenn man das synchron abfragt, halt alle aufsummiert.

Jochen

Und genau, aber es wäre ja auch sozusagen, wenn diese, wenn diese Dinge, die man fragt, interne andere API-Endpoints sind und man dann irgendwie noch eine Transformation drauf macht und das dann rausschickt.

Microservices.

Ja.

Dominik

Buzzword Bingo.

Johannes

Meine Consulting-Kosten haben sich eben verdoppelt.

Jochen

Ja, wobei Microservice-Integration würde ich ehrlich gesagt auch nicht unbedingt über REST oder HTTP machen.

Jochen

Oder macht ihr, ich weiß nicht, wie der das Neues macht.

Sondern über was?

Jochen

Wahrscheinlich über eine Message Queen.

Jochen

Einfach deswegen, weil du dann zum Beispiel Balbur umgebracht.

Jochen

Ja, und weil du bei HTTP hast du halt diesen Overhead immer der Verbindungen, die du aufmachen musst und den

Johannes

bist du ja mit Techniken weg.

Jochen

Ja, und intern musst du dann vielleicht auch nicht immer authentifizieren und sowas, aber ja.

Johannes

Ja, okay, wie auch immer.

Dominik

Darauf müssen wir auch nochmal sagen.

Johannes

Würdest du noch was anderes sagen, ja?

Jochen

Genau, also das wäre halt vielleicht ein Ding, wie man sozusagen damit umgehen könnte, dass man ansonsten eine Explosion von Endpunkten hat und ganz viele Abfragen machen muss, wenn man bei Rest im Vergleich zu UFGL.

Jochen

Aber ja.

Okay.

Keine Ahnung.

Ja, okay.

Dominik

Ich würde auch sagen, wir haben ziemlich viel bei Rest heute gesagt.

Dominik

Habt ihr noch irgendwas auf eurer Liste, was ihr noch losenwerden wollt heute?

Dominik

Weil sonst würde ich nämlich sagen, Punktmas.

Jochen

Nö, ich habe sonst auch nichts mehr.

Dominik

Ich fand es schön, viel wieder gelernt.

Dominik

Ich hoffe, ihr werdet uns weitergewogen, hört uns weiter.

Dominik

Schreibt uns unser Feedback, euer Lob, hast Kommentare, alles, was ihr loswerden wollt an hallo.peistenpodcast.de.

Dominik

Schön, dass ihr wieder eingeschaltet habt.

Dominik

Vielen Dank, dass ihr wieder alle dabei wart.

Dominik

Vielen Dank, Johannes.

Dominik

Und ja, hört uns das nächste Mal wieder.

Jochen

Alles klar.

Bis dann.

Jo, tschüss.

Dominik

Wir haben die Pics vergessen.

Dominik

Machen wir dann heute nicht.

Tö, töte.