# Rest Api und komplexe Objekte



## DrPils (27. Dez 2021)

Moin,

Was ist denn best Practice bei Rest Apis mit komplexen Objekten?

Angenommen ich habe folgende Struktur:


```
class Cinema {
    int id;
    String name;
    Person manager;
    Set<MovieShowing> movieShowings;
}

class Person {
    int id;
    String name;
    LocalDate dayOfBirth;
}

class MovieShowing {
    int id;
    Movie movie;
    LocalDateTime begin;
}

class Movie {
    int id;
    String name;
    int duration;
}
```

Wie wuerde jetzt im besten Falle das JSON Objekt der Rest API aussehen?

Erste alternative wäre ja 1:1 die Struktur übernehmen.


```
{
  "id": 1,
  "name": "Super Kino",
  "manager": {
    "id": 1,
    "name": "Walter",
    "dayOfBirth": "2000-10-10"
  },
  "movieShowings": [
    {
      "id": 1,
      "begin": "2022-01-01T18:45:00",
      "movie": {
        "id": 1,
        "name": "Krieg der Sterne",
        "duration": 121
      }
    },
    {
      "id": 2,
      "begin": "2022-01-01T18:45:00",
      "movie": {
        "id": 2,
        "name": "Das Imperium schlaegt zurueck",
        "duration": 124
      }
    }
  ]
}
```

Zweite Alternative ist es nur die IDs der felder zu verwenden.

```
{
  "id": 1,
  "name": "Super Kino",
  "manager": 1,
  "movieShowings": [1, 2]
}
```

Dritte alternative wäre es mit Links zu arbeiten.


```
{
  "id": 1,
  "name": "Super Kino",
  "links": {
    "self": {
      "href": "https://api.example.org/cinemas/1"
    },
    "manager": {
      "href": "https://api.example.org/managers/1"
    },
    "showings": {
      "href": "https://api.example.org/cinemas/1/showings"
    }
  }
}
```

Dann gibt es noch eine vierte Alternative, welche eine Mischung aus den letzten zwei ist. Statt den ids aus der zweiten Alternative nehme ich wichtige Informationen wie zb den Titel oder Namen und fuer details biete ich die links aus Alternative 3 an.

```
{
  "id": 1,
  "name": "Super Kino",
  "manager" : "Walter",
  "showings" : ["Krieg der Sterne", "Das Imperium schlaegt zurueck"],
  "links": {
    "self": {
      "href": "https://api.example.org/cinemas/1"
    },
    "manager": {
      "href": "https://api.example.org/managers/1"
    },
    "showings": {
      "href": "https://api.example.org/cinemas/1/showings"
    }
  }
}
```

Die letzte gefällt mir bis am besten. Die Daten sind relativ kompakt und durch die links ist die Navigation durch die api sehr einfach. 

Aber wie sieht das in einer optimalen Rest Api aus? Was ist mit POST Requests, unterscheiden sich da die Json Struktur von  der im GET Request?


----------



## Oneixee5 (27. Dez 2021)

Es fehlen noch einige Informationen um konkret zu antworten, z.B.: Datenmenge
@see https://restfulapi.net/rest-api-design-tutorial-with-example/
Die Vorgehensweisen mit der URL dürften am langsamsten und ressourcenintensiven sein, da immer wieder Anfragen an den Server erfolgen müssen und diese immer wieder vom Server einzeln beantwortet werden. Es spricht erst mal nichts dagegen. dass man einzelne Objekte abrufen kann. Wenn der Client aber sowieso eine große Datenmenge benötigt, kann es effektiver sein die Daten entsprechend in einem Rutsch zu laden.
Ich mache mir in meinen Projekten eigentlich gar nicht so viele Gedanken dazu wie das JSON aussehen könnte. Ich überlege mir wie die Anforderungen an meine Objekte sind und diese aufgebaut sein müssen, die Serialisierung und Deserialisierung erledigt i.d.R. das Framework.


----------



## thecain (27. Dez 2021)

Vielleicht ist HATEOAS etwas für dich.


----------



## DrPils (27. Dez 2021)

Oneixee5 hat gesagt.:


> Es fehlen noch einige Informationen um konkret zu antworten, z.B.: Datenmenge
> @see https://restfulapi.net/rest-api-design-tutorial-with-example/
> Die Vorgehensweisen mit der URL dürften am langsamsten und ressourcenintensiven sein, da immer wieder Anfragen an den Server erfolgen müssen und diese immer wieder vom Server einzeln beantwortet werden. Es spricht erst mal nichts dagegen. dass man einzelne Objekte abrufen kann. Wenn der Client aber sowieso eine große Datenmenge benötigt, kann es effektiver sein die Daten entsprechend in einem Rutsch zu laden.
> Ich mache mir in meinen Projekten eigentlich gar nicht so viele Gedanken dazu wie das JSON aussehen könnte. Ich überlege mir wie die Anforderungen an meine Objekte sind und diese aufgebaut sein müssen, die Serialisierung und Deserialisierung erledigt i.d.R. das Framework.


Ja der Client bin ich 
Ich schreibe mir gerade eine Rest API zur Übung und möchte ein gutes Rest Design umsetzen.


thecain hat gesagt.:


> Vielleicht ist HATEOAS etwas für dich.


Ja Hateoas ist mir bekannt. Finde es auch gut, ich sah da nur dass Problem dass beim Post request irgendwelche links im Body erwartet werden. Aber so wie ich es jetzt verstanden habe, können die Objekte beim Post durchaus eine andere Struktur haben als die von Get requests


----------

