1. 2022-09-26 REST

Beitrag: Peter Klose & Thomas Spindler

1.1. Grundproblem

Wir haben mehrere verschiedene Computer, die alle mit unterschiedlicher Hard- und Software arbeiten. Damit diese problemlos miteinander kommunizieren können, gibt es Protokolle. REST ist eines der vielen verschiedenen Protokollen, die dieses Problem lösen.

2022 09 26 rest architecture

1.2. REST

"HTML ist das Internet der Menschen, Rest ist das Internet für Maschinen"

Rest wir verwendet, um Daten zwischen zwei Systemen auszutauschen. Hierbei verwendet man die typische Client- / Serverkonfiguration

Der Client holt sich die Informationen, die dieser Benötigt vom Server, oder sagt dem Server, dass er Informationen löschen oder speichern soll.

1.2.1. Methoden von REST

Rest hat verschiedene Methoden, die sich an CRUD orientieren.

CRUD = Create, Read, Update, Delete
  • POST (erstellen und speichern)

  • GET (lesen)

  • PUT (update gesamte Ressource)

  • PATCH (nur einzelne Felder ändern)

  • DELETE (löschen)

Es gibt noch weitere Methoden, wie z.B OPTIONS.

1.2.2. URL

Um die richtigen Resource vom Server zu bekommen, wird eine URL verwendet.

URL = Unified Resource Locator

Wie der Name schon sagt, dient eine URL dazu, dass sie den Pfad der Resource angibt. Dies ist vergleichbar mit Dateipfaden.

Beispiele für URLs

Schema einer URL:

URI = scheme ":" ["//" authority] path ["?" query] ["#" fragment]

authority = [userinfo "@"] host [":" port]

Beispiele:

https://www.example.com/index.html

https://www.example.com/person?vname="hans"&nname="muster"

Beim zweitem Beispiel werden 2 weitere Parameter mitgegeben.
nname = hans
vname = muster
Diese sind einfache Variablen mit Werten.

1.2.3. JSON

REST verwendet als unterliegendes Protokoll HTTP. Die Daten an sich werden allerdings im JSON format transportiert.

Früher wurde oft XML für den Datentransfer verwendet (vor REST). XML hat allerdings einige Nachteile gegenüber dem neueren JSON. Aus diesem Grund verwendet REST JSON.

XML vs JSON

XML

<?xml version="1.0" encoding="UTF-8" ?>
<schueler>
    <vorname>Max</vorname>
    <nachname>Muster</nachname>
    <geburtsdatum>05.07.2002</geburtsdatum>
    <klasse>4BHITM</klasse>
</schueler>

Zeichen: 187

JSON

{
  "schueler": {
    "vorname": "Max",
    "nachname": "Muster",
    "geburtsdatum": "05.07.2022",
    "klasse": "4BHITM"
  }
}

Zeichen: 121

JSON ist hier effizienter, da es weniger Zeichen als XML hat.

Ebenfalls ist JSON meistens einfacher zu lesen als XML.

1.2.4. Endpoint

Ein Endpoint ist eine Schnittstelle für die Daten.

Jeder Endpoint hat eine URL und eine Methode, die dieser verwendet.

2022 09 26 rest examples

1.2.5. Server Architektur

Auf dem Server werden die Anfragen entgegengenommen und verarbeitet. Hierbei kann der Server weitere Verbindungen aufbauen (Datenbank, weitere REST requests, ..), oder Berechnungen durchführen.

Dieser ist mit folgender Architektur aufgebaut:

2022 09 26 server logic

Bei klassischen Anwendungen, (die wir vor allem in den letzten Jahren programmiert haben, hatte sich die Anwendung direkt mit der Datenbank verbunden. Dies ist allerdings aus Sicherheitsgründen schlecht. Ebenfalls sind Webapps einfacher, moderner und vernünftiger als z.B. Java FX.

Daher ist es ebenfalls besonders wichtig, die Daten, die der Client mit einem POST request übermittelt, am Server zu überprüfen, bevor diese gespeichert werden

2. 2022-10-03 REST, REST in Quarkus

Beitrag: Peter Klose & Thomas Spindler

2.1. Rest

Rest ist Zustandslos, das heißt, dass es grundsätzlich keine Sessions gibt. Dies bedeutet aber auch, dass Anmeldeinformationen, oder weitere Tokens und Cookies bei jeder Anfrage erneut gesendet werden müssen.

2.1.1. Rest Request

Ein Rest-Request ist, wenn der Client etwas vom Server anfordert. Dies muss den REST Methoden entsprechen.

Beispiel GET
2022 10 03 rest request
Beispiel POST
2022 10 03 rest post request

2.1.2. Rest Begriffe

  • Safety: Daten werden nicht verändert

  • Idempotence: Die Ressource behält auch nach mehrmaligen Aufruf den gleichen Zustand

2022 10 03 rest begriffe

2.2. RestfulAPI

  • JSON-B

  • JSON-P

  • application.properties

  • dev-console

2.3. JPA

  • Persistence

    • dauerhaft speichern

    • die Daten überleben den Prozess, der sie erstellt hat.

    • Bsp: File, DB, ev. Serialisierung (ist auch File)

  • transient

    • flüchtig

    • die Daten werden mit dem Prozess, der sie erstellt hat, gelöscht

    • zB Variablen im Programm

2.3.1. Quarkus Profiles

  • Quarkus hat per default drei Profile:

    1. dev

    2. prod

    3. test

  • Die Profile haben den Vorteil verschiedene Konfigurationen bei unterschiedlichen Anwendungsfällen zur Verfügung zu stellen. Z.B. wird eine eigene Datenbank zum Testen verwendet

  • Man erkennt das jeweilige Profil in der application.properties durch den Prefix %prod, %test, %dev

  • dev

    • ist development modus

    • automatisches Hot Reloading, wenn Code geändert wird

  • test

    • wird zum Testen verwendet

    • meist wird eine eigene Testdatenbank gestartet

  • prod

    • Ist optimierter (z.B. startet schneller)

    • hat dafür keine dev-Console, keinen Swagger (nicht automatisch) usw.

2.3.2. Was muss man tun, um eine Entity-Klasse zu persistieren?

Dependencies in pom.xml eintragen
  • JDBC-Treiber der Datenbank

  • der OR-Mapper (Object Relational Mapper, ORM)

    • in Quarkus wird standardmäßig Hibernate verwendet.

DB-Credentials in application.properties eintragen
quarkus.datasource.username=postgres
quarkus.datasource.password=postgres
quarkus.datasource.db-kind=postgresql
quarkus.hibernate-orm.database.generation=drop-and-create
quarkus.datasource.jdbc.url=jdbc:postgresql://localhost:5432/db
Datenbank starten
docker run --rm=true \
           --name postgres-payment \
           -e POSTGRES_USER=postgres \
           -e POSTGRES_PASSWORD=postgres \
           -e POSTGRES_DB=db \
           -v ${PWD}/db-postgres/db:/var/lib/postgresql/data \
           -p 5432:5432 \
           postgres:13.3-alpine
Erstellen einer Entity-Klasse
@Entity (1)
@Table(name = "MY_PERSON")
public class Person {

    @Id (2)
    @GeneratedValue(strategy = GenerationType.IDENTITY)  (3)
    @Column(name = "P_ID")
    private Long id;

    @Column(name = "P_FIRST_NAME")
    private String firstName;

    @Column(name="P_LAST_NAME")
    private String lastName;

    // constructors omitted for brevity

    // getter and setter omitted for brevity
}
1 Annotation @Entity wird benötigt
2 Eine Id wird benötigt → @Id
3 Hier wird ein Autowert-Feld in der DB erstellt <.>
Zugriff auf die DB über den Entity Manager
Injizieren des EntityManagers
@Inject
EntityManager em;
Verwenden einer Transaktion für schreibende Zugriffe
  • Lesende Zugriffe benötigen keine Transaktion

@Transactional
void foo() {

    // Speichern in DB
    em.persist(new Person("Mickey", "Mouse"));

    // Holen aus DB
    Person p = em.find(Person.class, 1L);
    System.out.println(p.getFirstName());
}

3. 2022-10-17 Tabellenbeziehungen in JPA

  • transient

  • persistent

3.1. Modi von Datenbanken

  • Network: Datenbank und Java Programm laufen in getrennten JVMs

  • Embedded: Datenbank und Java Programm laufen in derselben JVM

  • InMemory:

    • Die Datenbank läuft im Hauptspeicher

    • besonders gut geeignet für Testen, da sehr schnell

3.2. Beziehungen zwischen Entities

Beziehung Beschreibung Bsp

Assoziation

zwei unterschiedliche Entites haben eine Beziehung

ein Auto hat ein Kennzeichen (oder mehrere im Zeitablauf)

Aggregation

Ein Objekt besteht aus anderen Objekten

zB Auto hat 4 Räder

Komposition

Ein Object besteht aus anderen Objekten. Diese können nicht zerstörungsfrei zerlegt werden.

Ein Haus hat mehrere Etagen

Vererbung

Ein Objekt erbt von einem anderen dessen Eigenschaften

Ein Pkw ist ein Kfz und erbt dess Attribute

Realisierung

(Implementierung)

Serializable - Interface

3.3. Mikroprojekte

Mikroprojekt-Einteilung
Name Thema

Thaller David

Gebäudeverwaltung (wo sind welche Geräte installiert zB Chromecasts)

Klose Peter

Linienbusunternehmen inkl. Fahrplan

Schatzberger Oliver

Supermarkt

Eder Moritz

Teehändler

Hager Sebastian

Friedhofsverwaltung

Al Sabagh Abdulrahman

Gärtnerei

Reiter Lydia

Tanzverein

Spindler Thomas

Rezeptseite

Horner Paul

Hotel

Weinhäupl Valentin

Fussballverein

Lummerstorfer Lukas

Tennisverein

Just Elias

Stadtrundfahrten

Angerer Mona

Too good to go - App - Clone

3.4. Aufgabe 1 - Mikroprojekt

  • Erstellen eines Quarkus-Projekts

    • Das Quarkus Projekt ist in einem Ordner backend.

    • Es gibt einen Ordner asciidocs entsprechend dem Repo

    • Später wird noch ein frontend-Projekt hinzugefügt

  • git

    • Es sind genügend aussagekräftige Commits zu erstellen

    • Beim Entwickeln ist jeweils in einem feature-Branch zu entwickeln und dann in den main-Branch zu mergen.

  • Es sind Tests zu verwenden

    • Dabei sind primäre assertj-core und assertj-db zu verwenden.

  • Es ist ein Datenmodell zu erstellen (max. 5 Tabellen)

    • als plantuml-Diagramm in der Dokumentation angeben

    • dann melden → Korrektur

4. 2022-11-07

4.1. Context & Dependency Injection - CDI

  • Es gibt 3 Arten um Objekte zu erhalten:

    • mit new und Constructor

    • mittels einer Fabrik-Methode

    • dependency injection → ein übergeordneter Container hält Objekte vor (in einem Pool). Mit der Annotation @Inject werden diese Objekte einer Refernzvariablen zugewiesen

4.2. DevServices mit Testcontainers

4.3. Logging

  • Logging-Levels

    • INFO

    • DEBUG

    • TRACE

    • ERROR

  • rolierendes Logging

    • Bsp

      • Es gibt 3 Logfiles

      • Die Logs werden in ein File geschrieben. Ist dieses File 10kB groß, wird in das nächste File geschrieben. Anschließend in das dritte File.

      • Erreicht auch das dritte File die Größe von 10kB, dann wird das erste File gelöscht und neu beschrieben.

persistieren mit jpa

4.4. Übung: Erstellen eines Endpoints für die CRUD-Funktionalität einer Entität

5. 2022-11-14

5.1. Strategie zum Erzeugen von Id’s

5.1.1. TABLE

  • Es wird eine Tabelle erstellt.

  • Diese Tabelle hat nur eine Spalte ID und eine Zeile

  • Der Wert ID wird immer inkrementiert

  • Alle Tables holen sich den nächsten Wert aus dieser Table

  • Variante:

    • Die Tabelle hat 2 Spalten: TABLE und ID

    • ZB TABLE Person hat die ID 500

    • zB TABLE Rechnung hat die ID 2378

    • Dadurch können die Tables jeweils mit einer durchgehenden Folge von Zahlen versehen werden

5.1.2. IDENTITY

Spaltentyp AUTOWERT → die Spalte zählt automatisch hoch. Muss im INSERT nicht angeführt werden

5.1.3. SEQUENCE

  • Es wird ein Sequence Objekt erstellt

  • Der aktuelle Wert der Sequence wird automatisch in die Id-spalte eingetragen

6. 2022-11-21

6.1. Aufgabe Microproject

  • Erstellen eines Datenmodells mit 3- max. 5 Entitäten.

  • Erstellen von Rest-Endpoints mit CRUD-Funktionalität

  • Ggf. Verwendung von Data Transfer Objects

  • Erstellen von Integrations- und Systemtests

  • Erstellen von Queries

6.2. Aggregate Pattern

aggregate pattern

7. 2023-01-23

7.1. Verbesserung ITP Test

2023 01 23 itp test cld correction

7.2. MOB Programming

Es ist ein System zu implementieren, welches uns ermöglicht Autos und Personen zu speichern. Ein Auto soll dabei nur einer Person zugeordnet werden. Eine Person kann mehrere Autos besitzen.

  • Daten von: Mockaroo

  • Quarkus Projekt:

    • Hibernate ORM with Panach

    • RESTEasy Classic Jackson

    • RESTEasy Classic Qute

    • JDBC Driver - PostgreSQL

    • SmallRye OpenAPI

    • SmallRye GraphQL

  • Datenbank Postgres

8. 2023-01-31

9. 2023-02-06

9.1. Übung Keycloak

  • in einem Docker-Container wird ein Keycloak gehostet

  • Die Konfiguration soll in einem config-File in einem bind mount - Volume enthalten (Welche Möglichkeiten gibt es?)

npm install @angular/cli

npx ng new demo (1)
1 npx …​ das Kommando wir lokal

10. 2023-06-05

10.1. Übung MQTT-Client

  • Erstellen Sie einen MQTT-Client mit Quarkus mit folgender Funktionalität

    • In einer Datenbank sind Werte nach Kategorien gespeichert (Schreiben Sie hierzu einen Data Faker)

      • Verwenden Sie hierbei optimistisches Locking

    • In einer Tabelle ist gespeichert, welche Kategorien auf den mqtt-Server gesendet werden

    • Mittels REST-Request können Kategorien aktiviert oder deaktiviert werden, dh sie werden an den mqtt-Server gesendet oder nicht

    • Bitte verwenden Sie folgende topic-Struktur

      /labs/2223/4bhitm/lab07/nachname
lab07 cld
Figure 2. CLD
lab07 erd
Figure 3. ERD