REST- Services GET/PUT/POST/DELETE

PollerJava

Top Contributor
Hallo,

mir ist gurndsätlich klar, wie man RESTful - Services schreibt:

Java:
  @RequestMapping(value = "{id}", method = RequestMethod.GET, produces = "application/json")
    public @ResponseBody User get(@PathVariable
    final String id)  {
      ...
    }

    @RequestMapping(value = "", method = { RequestMethod.POST }, produces = "application/json")
    public @ResponseBody User create(final @RequestBody User user) throws BusinessException {
        ...
    }

    @RequestMapping(value = "{id}", method = RequestMethod.PUT, consumes = "application/json", produces = "application/json")
    public @ResponseBody User update(@PathVariable String id, @RequestBody User user) throws BusinessException {
	...
    }

Mir ist nur nicht klar, wie man "getAllUsers" RESTful macht,
entweder so:
Java:
    @RequestMapping(value = "/getAll", method = RequestMethod.GET, produces = "application/json")
    public @ResponseBody List<User> getAll() throws BusinessException {
        ...
    }

oder so wie unten die oben angeführte Methode verwenden und indem ich id=null lasse und dies in dieser Methode unten überprüfe.
Code:
@RequestMapping(value = "{id}", method = RequestMethod.GET, produces = "application/json")
    public @ResponseBody User get(@PathVariable
    final String id)  {
        if (id == null) {
            // alle User zurückgeben
         }
      ...
    }

Ich wär dankbar für einen Tip in diese Richtung!
Danke!
Poller
 
Zuletzt bearbeitet:
Grundsätzlich beides möglich, nur müsstest du im zweiten Fall dann auch immer bei der Anfrage nach einem speziellen User eine List zurückgeben, auch wenn diese nur ein Element enthält ....
Die erste Variante finde ich sauberer, aber das ist in erster Linie Geschmackssache und nur eine Frage davon, wie die Schnittstelle definiert wurde.
 
Ich hätte dazu noch eine Frage.
Ein User arbeitet in einem Unternehmen und ein Unternehmen hat mehrere User/Angestellte.

Meine Frage wäre, wie man das in einem RestService abbildet?
Wenn User A (Chef von Unternehmen A) sich einloggt, soll er seine Mitarbeiter sehen, wenn User B (Chef von Unternehmen B) sich einloggt, dann soll er natürlich sein/andere Mitarbeiter sehen.

Macht man das so (mit userId):
Java:
@RequestMapping(value = "/{userId}/getAll", method = RequestMethod.GET, produces = "application/json")
    public @ResponseBody List<User> getAll() {

oder so (mit companyId)
Java:
@RequestMapping(value = "/{companyId}/getAll", method = RequestMethod.GET, produces = "application/json")
    public @ResponseBody List<User> getAll() {

oder soll man in der Methode getAll bestimmen (über den Login- Token), um welchen User es sich handelt.

Danke!
Poller
 
Kommt darauf an... 🙂

Daten von Mitarbeitern sind aber in der Regel vertraulich und sollten nur intern einsehbar sein. Und auch dort vermutlich nicht von jedem. Also z.B. entweder anhand der Principal-Informationen programmatisch prüfen, welche Werte zurückgegeben werden soll, oder (aber das ist dann statischer) über die User-Rolle prüfen. Bei deinen ersten beiden Vorschlägen muss ja sonst nur jemand die entsprechende ID kennen und hat dann plötzlich vollen Zugriff auf die Daten..
 
da hast du sicher recht, die Services sind aber eh zwei mal abgesichert:

1. mit einem token
2. mit https

Ich kenne die Vor und Nachteile dieser zwei Punkte.
Mir geht es eher um den RESTful- Ansatz - kann man das so machen oder wie würdet ihr das machen?
Danke!
 
Dann ist es wiederum nur eine Frage, wie die Schnittstelle definiert wurde.

RESTful ist nicht so streng standardisiert. Ich hab gerne optionale Parameter als GET-Paramter und nicht-optionale als Pfad-Parameter. Aber das ist eigentlich auch nur eine Frage des Geschmacks. Viel wichtiger finde ich, dass man es einheitlich handhabt.

In dem speziellen Fall hier würde ich es vermütlich so benennen:

/company/{companyid}/users (um alle User zu bekommen)
/company/{companyid}/user/{userid} (um einen speziellen user zu bekommen)
 
Eine kurze Nachfrage noch: wenn ich das so mache wie oben, würdest du diese Methoden dann in einer Klasse geben, die so ausschaut:

Java:
@RestController
@RequestMapping("/users")
public class UserRestService {

oder eher in diese:

Java:
@RestController
@RequestMapping("/institutions")
public class InstitutionRestService {
 

Zurück
Oben