Datenbank mit REST API

mihe7

Top Contributor
Zu a) von @KonradN und weil ich das in #42 nicht gezeigt habe: wir hätten in dem Fall das DTO als Body des Put-Requests. Heißt, der Aufrufer übermittelt ein JSON in der Form
JSON:
{
    "id": 4711,
    "name": "Daniel Düsentrieb"
}
Das wird dann automatisch in ein UserDTO konvertiert, das die Methode als Parameter erwartet. Bei ein, zwei Felder macht das aber nicht unbedingt Sinn.

Und die NPE ist eine typische "EntwicklerIstZuBlödException" - das sollte dir bewusst sein!
LOL. Man könnte die Abkürzung natürlich auch umdeuten: NPE = NotProfessionalException.
 

matze86

Bekanntes Mitglied
Ok ich habe es geändert. Nur hat die Methode nicht wirklich Sinn.
Weil wenn ich bei den Argumenten noch den ort angebe, dann tut der ort ja auch überschrieben werden.
Aber ich denke mal, das DTO ist meist nur für die Ausgabe gedacht, das der Anwender nicht alles sieht.

orElse() habe ich mit mit orElseThrow() verwechselt.
 
Zuletzt bearbeitet:

KonradN

Super-Moderator
Mitarbeiter
Weil wenn ich bei den Argumenten noch den ort angebe, dann tut der ort ja auch überschrieben werden.
Generell kann man sich das natürlich so überlegen, wie man das braucht.

Wenn es nur um ein Update geht, dann kann man ein DTO bauen, dass nur Referenzen enthält (Also bei Value Typen die entsprechende Wrapper Klasse). Dann kann man etwas nur dann aktualisieren, wenn es gesetzt wurde. Damit entfällt aber dann das Löschen von Werten - Aber statt null ist es ja denkbar, dass man den leeren String setzt oder so.

Also dann wäre da sowas wie:
if (dto.getName() != null) entity.setName(dto.getName());

Und auch ganz wichtig: Wenn Du ein REST Service haben willst, dann setzt Du da keine einzelnen Parameter sondern es wird ein DTO als Objekt übergeben - wie @mihe7 gesagt hat,
 

KonradN

Super-Moderator
Mitarbeiter
Bezüglich dem JSON marshaling - da ist dieses Vorgehen relativ sauber, denn null Werte werden in der Regel einfach weggelassen. Wenn Du also nur id und name gesetzt hast, dann finden sich im JSON die anderen Werte nicht und man hat etwas wie
Code:
{
    id: 1234,
    name: "Some Name"
}
 

matze86

Bekanntes Mitglied
Also mache ich es mit JSON, lasse die Parameter weg und übergebe nur das DTO Objekt.
Das ganze soll später von einen anderen Java-Programm abgerufen werden können.
 

KonradN

Super-Moderator
Mitarbeiter
Also mache ich es mit JSON, lasse die Parameter weg und übergebe nur das DTO Objekt.
Das ganze soll später von einen anderen Java-Programm abgerufen werden können.
Jein - Du selbst machst nichts mit JSON. Das passiert automatisch. Du hast einen Controller. In dem hast Du ein Mapping. Da baut also Spring Boot dann entsprechend alles für Dich auf. Dabei ist es Dir egal, wie die Daten ankommen. Spring Boot erlaubt JSON aber prinzipiell auch XML.

Das muss Dich als Entwickler nicht interessieren. Du erwartest einen Parameter und der ist vom Typ her dein DTO Objekt.
 

matze86

Bekanntes Mitglied
Genau das meinte ich. Mit JSON meinte ich damit beim Test über Postman, da kann man JSON wählen.

Macht sich das dann gut beim Anwenderprogramm mit Java, das ich über JSON arbeite?
 

KonradN

Super-Moderator
Mitarbeiter
Genau das meinte ich. Mit JSON meinte ich damit beim Test über Postman, da kann man JSON wählen.

Macht sich das dann gut beim Anwenderprogramm mit Java, das ich über JSON arbeite?
Ja, bei Postman arbeitest Du dann mit JSON.

Aber im Java Client wirst Du hoffentlich nicht direkt mit JSON arbeiten sondern auch mit den DTO Klassen. Die Libraries, die Spring Boot nutzt, kann auch ein Java Client nutzen. Dazu gibt es ja so Libraries wie RESTeasy und Co.
 

matze86

Bekanntes Mitglied
Aber im Java Client wirst Du hoffentlich nicht direkt mit JSON arbeiten sondern auch mit den DTO Klassen. Die Libraries, die Spring Boot nutzt, kann auch ein Java Client nutzen. Dazu gibt es ja so Libraries wie RESTeasy und Co.
Das wusste ich nicht, ich dachte man "direkt" drauf zugreifen und sich das Object zurückgeben lassen etc.

Also muss ich später beim Client auch spring Boot aufsetzen, mit ein DTO-Objekt der mit der entfernten Rest-API kommuniziert?
 

matze86

Bekanntes Mitglied
wir hätten in dem Fall das DTO als Body des Put-Requests. Heißt, der Aufrufer übermittelt ein JSON in der Form
JSON:
{
    "id": 4711,
    "name": "Daniel Düsentrieb"
}
Das wird dann automatisch in ein UserDTO konvertiert, das die Methode als Parameter erwartet.
Macht das mit auch bei PutMapping Sinn oder sollte man da die Variablen, die geändert werden sollten, als Parameter angeben?
Ich habe Name, Ort und Geburtsdatum und möchte aber nur den Ort ändern, da habe ich den Ort als Parameter übergeben.
Hoffe das ist so richtig.
 

KonradN

Super-Moderator
Mitarbeiter
Also generell funktioniert es, oder? Also ist es kein klares falsch.

Aber ich selbst achte immer etwas auf die Methoden und was diese bedeuten. Und bei einer REST API kenne ich es in erster Linie so, dass Entities übergeben werden - an eine Ressource.

Du kannst also eine Entity mit id und Ort an die Ressource User geben um da dann etwas zu ändern. Dann ist nur die Frage: Welche Methode nimmt man da?

Da kann man z.B. schauen, was bei Mozilla dazu gesagt wird: https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods
Und da ist es eher kein PUT, da Du ja nichts ersetzt (oder neu erstellst). Da ist dann eher ein POST Request das Mittel der Wahl (Wenn ich entscheiden müsste).
 

matze86

Bekanntes Mitglied
Das heißt also, ich übergebe (wie beim erstellen eines Objektes) eine UserDTO Entity, mit nur dem ort, die ID wird ja übergeben.
In der Methode erstelle ich ein User-Objekt, mit den ganzen Daten des Objektes mit der ID (Name, ort, geburtsdatum...).
Dann ersetze ich nur die Variablen die in der der UserDTO Entity mitgeteilt wurden (im dem Fall nur der ort), das andere bleibt.
 

Oneixee5

Top Contributor
Macht das mit auch bei PutMapping Sinn oder sollte man da die Variablen, die geändert werden sollten, als Parameter angeben?
Ich habe Name, Ort und Geburtsdatum und möchte aber nur den Ort ändern, da habe ich den Ort als Parameter übergeben.
Hoffe das ist so richtig.
Die Methode PUT dient zum Ändern eines Objektes. Es ist sinnvoll immer das ganze Objekt zu übergeben. So kann man in dem selben Endpunkt auch mehrere Dinge ändern und braucht keine separaten Endpunkte, z.B.: zum ändern des Namen und zum ändern des Ortes. Als Rückgabe des Endpunktes sollte wieder das gesamte neue Objekt übergeben werden. Im Client wird dann das bestehende Objekt durch die Rückgabe ersetzt.
Man muss dabei bedenken, Webanwendungen haben nicht nur einen Nutzer. Ein andere Nutzer könnte zwischenzeitlich den Vornamen geändert haben (sofern das nicht anderweitig ausgeschlossen wurde). Nachdem das gesamte Objekt zurückgegeben wurde kann auch der neue Vorname im Client angezeigt werden.
Die Datenmenge ist dabei zweitrangig und bei deinem DTO sowieso unbedeutend. Wenn man optimieren möchte könnte man die Objekte gezippt übertragen. Nur bei sehr großen Datenmengen würde ich anfangen die Objekte zu zerlegen.
 

KonradN

Super-Moderator
Mitarbeiter
Die Methode PUT dient zum Ändern eines Objektes.
Ach ja - der Moment, wenn einem klar wird, dass man etwas falsches geschrieben hat ... Meine Ausführungen in #64 waren bezüglich POST und PUT natürlich falsch - und ich habe mich da auf eine blöde Grundlage gestellt, die wenig optimal ist.

Daher nutze ich diesen Post als Chance, dies etwas zu korrigieren:

Also erstes die Frage: Wo kann man dies den gut beschrieben finden. Und da ist dann vermutlich die RFC mit am günstigsten:
https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-p2-semantics-16#section-4.3.3

4.3.3 behandelt POST,
4.3.4 dann PUT. Und dann wird schnell deutlich, dass ich in #64 irgendwie neben mir war :)

In 4.3.4 findet sich dann auch ein Abschnitt, der den Unterschied deutlich beschreibt:
The fundamental difference between the POST and PUT methods is
highlighted by the different intent for the enclosed representation.
The target resource in a POST request is intended to handle the
enclosed representation according to the resource's own semantics,
whereasç Hence, the intent of PUT
is idempotent and visible to intermediaries, even though the exact
effect is only known by the origin server.

Und das "the enclosed representation in a PUT request is defined as replacing the state of the target resource." beschfreibt ja auch genau das, was Du willst. Du hast eine target Resource (den User) und willst da einen state (den Ort) ändern.

Sorry, wenn ich da bei dem Beitrag eben Verwirrung gestiftet haben sollte.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
torresbig MySQL hibernate - could not resolve entity class ... (Datenbank Anfänger) Datenbankprogrammierung 19
M Meine Datenbank lässt sich mit meiner Methode nicht ändern Datenbankprogrammierung 1
I SaaS Applikation: pro Kunde eine Datenbank / Schema oder eine DB für alle Kunden? Datenbankprogrammierung 76
T SQL-Statement Datenbank nach SQL Statement schließen? Datenbankprogrammierung 7
M Datenbank Zugraff nach Umwandlung in .jar-Datei nicht mehr möglich Datenbankprogrammierung 4
Auf MySql Datenbank zugreifen funktioniert nicht Datenbankprogrammierung 8
MongoDB-Datenbank in Androidstudio einbinden Datenbankprogrammierung 1
thor_norsk Datenbank: Apache Derby Datenbankprogrammierung 6
B SQlite Datenbank, trotz Statements wurden nicht alle Zeilen erzeugt? Datenbankprogrammierung 35
M Entfernte Datenbank Datenbankprogrammierung 11
T Datenbank: Tabelle erstellen bei Web-Applikation Datenbankprogrammierung 4
D SQLite Datenbank in Android Studio (Java) durchsuchen Datenbankprogrammierung 3
M MySQL Datenbank in Array Datenbankprogrammierung 2
S Den letzten Eintrag aus Datenbank ziehen (Oracle SQL Dev.) Datenbankprogrammierung 14
N Datenbank abfragen nach bestimmten Wort Datenbankprogrammierung 7
Beginner22 Zugriff auf Datenbank aus Java über mariadb Datenbankprogrammierung 3
ma095 value NULL- Datenbank Postgresql Spring - intellij community Datenbankprogrammierung 0
raptorrs Plötzlich keine Verbindung zur Datenbank mehr möglich Datenbankprogrammierung 14
Davee SQLite SQLite Datenbank lässt sich nicht auf anderen PCs öffnen Datenbankprogrammierung 8
P Datenbank Tool - besser als oracle SQL Developer gesucht mit effizinte Verbindungsverwaltung Datenbankprogrammierung 2
X JPA (EclipseLink) und Oracle Datenbank Datenbankprogrammierung 2
T Datenbank auf einer Webseite aus einer Exceltabelle erstellen Datenbankprogrammierung 5
L SQL Datenbank Datenbankprogrammierung 7
L SQL Datenbank INSERT INTO Datenbankprogrammierung 6
L SQL Datenbank Tabelle insert Datenbankprogrammierung 7
L SQL Datenbank Tabelle erstellen Datenbankprogrammierung 6
nonickatall MySQL Auf neue Datensätze in einer Datenbank reagieren Datenbankprogrammierung 5
W MYSQL Datenbank Login Android Datenbankprogrammierung 3
anton1 Online Datenbank Datenbankprogrammierung 7
krgewb H2-Datenbank öffnen Datenbankprogrammierung 8
J Datenbank abfragen Datenbankprogrammierung 6
P Verbindung zu einer Access Datenbank per Eclipse oder Intellij Datenbankprogrammierung 0
O SQL Abfragen mit Mini Datenbank Datenbankprogrammierung 12
Z Datenbank Choicebox wird nicht befüllt Datenbankprogrammierung 15
S Suche In SQL Datenbank mit array Datenbankprogrammierung 6
P Enum in der Datenbank Datenbankprogrammierung 1
Z SQL- Datenbank 1.PK zu 2.FK Datenbankprogrammierung 3
E netbeans - jsp Daten in Datenbank hinzufügen Datenbankprogrammierung 2
bueseb84 Spring Boot : Update Mysql Datenbank Datenbankprogrammierung 1
Avalon Attribute werden mit Unterstrich in eine MySQL Datenbank eingetragen Datenbankprogrammierung 10
MiMa wo Datenbank verbinden/trennen? Datenbankprogrammierung 1
H MySQL Verbindung Datenbank und Eclipse (Java) Datenbankprogrammierung 5
DeltaPilot12 Datenbank connect Funktion Datenbankprogrammierung 7
J Oracle Datenbank-Tabelle per Combobox (oder ähnliches) auswählen Datenbankprogrammierung 3
N SQL Datenbank Spalte in Java Array Datenbankprogrammierung 2
J JAR-Datei und Datenbank Datenbankprogrammierung 8
Bluedaishi Datenbank Abfrage Datenbankprogrammierung 36
Kirby.exe Zeile aus der Datenbank holen wenn ein match besteht Datenbankprogrammierung 7
Kirby.exe Es werden keine Einträge in der Datenbank gemacht Datenbankprogrammierung 23
C Datenbank anlegen und über eine Website mit Daten füllen? Datenbankprogrammierung 25
J Welche Kriterien haben Einfluss auf die Geschwindigkeit einer Datenbank ? Datenbankprogrammierung 4
B Frage zu Datenbank Design bei Events (ZenDesk) Datenbankprogrammierung 1
M SQLite Datenbank mit SQLite Datenbankprogrammierung 7
C String in Datenbank einfügen Datenbankprogrammierung 11
C Keinen Zugrift auf Datenbank Datenbankprogrammierung 2
C Datenbank zugreifen Datenbankprogrammierung 10
L Auf Strato Datenbank zugreifen Datenbankprogrammierung 7
H Fehler bei getConnection zu MySQL Datenbank Datenbankprogrammierung 18
G Datenbank Statement Datenbankprogrammierung 22
M Datenbank editierbach machen in JTable Datenbankprogrammierung 13
S Datenbank MySQL und Java Datenbankprogrammierung 8
M H2 Verbindung zur Datenbank komplett schließen Datenbankprogrammierung 11
J Aufbau meiner Datenbank/Tabelle - Verbessern? So lassen? Datenbankprogrammierung 39
J Nur CRUD über Datenbank Klasse, oder auch mehr ? Datenbankprogrammierung 2
Dimax MySQL Maximale Datenlänge für eine Spalte einer Datenbank in java ermitteln Datenbankprogrammierung 15
L Appabsturz mit Datenbank Datenbankprogrammierung 4
J Zahlungseingänge von mehreren Kunden wie am besten abbilden in der Datenbank ? Datenbankprogrammierung 8
L Datenbank sichern Datenbankprogrammierung 8
S Daten von SQLite Datenbank nutzen Datenbankprogrammierung 5
J Datenbank VPS Server Datenbankprogrammierung 3
H MySQL MySQL - Keine Verbindung zur Datenbank?! Datenbankprogrammierung 4
NIckbrick MySQL Befehle aus Datenbank auslesen Datenbankprogrammierung 21
S Datenbank/Java true/false Datenbankprogrammierung 8
J JUNIT und CRUD-Datenbank Datenbankprogrammierung 4
F Datenbank/Datenabgleich/Wiederholungsabfrage Datenbankprogrammierung 12
@SupressWarnings() Eure bevorzugte Datenbank-Library Datenbankprogrammierung 9
C datenbank verbindung config Datenbankprogrammierung 23
L MySQL Android zu externer MySQL Datenbank verbinden Datenbankprogrammierung 5
M Datenbank vor unerlaubtem Zugriff durch Benutzer schützen Datenbankprogrammierung 3
U MySQL Aus Servlet in Datenbank schreiben Datenbankprogrammierung 4
H Datenbank Export mit Java Datenbankprogrammierung 3
P Daten in eine mySQL Datenbank einfügen Datenbankprogrammierung 4
S SQL-Statement Datenbank Zeitbereich durchsuchen Datenbankprogrammierung 2
L Messenger App - Wie am besten auf Datenbank zugreifen? Datenbankprogrammierung 4
H MySQL Datenbank auf Xampp nimmt keine Mediumblob an. Datenbankprogrammierung 0
D Datenbank Abfrage Datenbankprogrammierung 7
H MySQL Benutzer Login System mit Datenbank Informationen (Abfrage zu User ist auf DB gesichert) Datenbankprogrammierung 42
L Oracle Datenbank über Java aufrufen Datenbankprogrammierung 29
DaCrazyJavaExpert Derby/JavaDB Unfindbarer Fehler im Datenbank-Code Datenbankprogrammierung 87
DaCrazyJavaExpert Derby/JavaDB Wert einer Variable in der Datenbank direkt auf 1 setzten. Datenbankprogrammierung 71
W MySQL Ausgabe von Datenbank in Java-App Datenbankprogrammierung 6
M portable Datenbank Datenbankprogrammierung 2
S Name aus der Datenbank bekommen Datenbankprogrammierung 2
K Eclipse: JBoss Hibernate Tool: Kein Zugriff auf Datenbank Datenbankprogrammierung 5
MaxG. Datenbank werte vergleichen Datenbankprogrammierung 5
MaxG. Access Datenbank Datenbankprogrammierung 48
@SupressWarnings() HSQLDB Datenbank für mein Dorfbauspiel "Time of Kings" Datenbankprogrammierung 6
K SQLite Datenbank in App integrieren: Vor Auslesen schützbar? Datenbankprogrammierung 6
K Java Datenbank auslesen Datenbankprogrammierung 8
M MySQL Anbindung und Abfrage an die Datenbank Datenbankprogrammierung 2

Ähnliche Java Themen

Neue Themen


Oben