2017-07-20 6 views
0

Wenn beim Aktualisieren einer Ressource über REST nur die zu aktualisierenden Werte oder das gesamte Objekt (aktuelle Werte und zu aktualisierende Werte) in den body aufgenommen werden sollen?Aktualisieren einer Ressource durch REST (PUT/POST)

Wenn ein User-Objekt wie dieses

User (id, name, age, sex) 

aussieht und ich möchte nur seinen Namen und das Alter aktualisieren, sollten meine Anfrage wie folgt aussehen:

PUT /users/1 

{"name":"john","age":18} 

oder so:

PUT /users/1 

{"name":"john","age":18, "sex":"m"} 

Und wie sollte das auf dem Server aussehen Idee?

@RequestMapping(value = "/{userId}", method = PUT, consumes = MediaType.APPLICATION_JSON_VALUE) 
public ResponseEntity<String> updateUser(@PathVariable final int userId, @RequestBody User u){ 
    //fetch user by ID 
    user.setName(u.getName()) 
    user.setAge(u.getAge()) 
    user.setSex(u.getSex()) //this will be empty? 

    return new ResponseEntity<String>(gson.toJson(user), HttpStatus.OK); 
} 

Oder alternativ könnte ich herausfinden, welche Variablen wurden nicht in der Anfrage Körper aufgenommen und tun so etwas wie dieses

if(u.getName()!=null){ 
    user.setName(u.getName()) 
} 
if(u.getAge()!=null){ 
    user.setAge(u.getAge()) 
} 
if(u.getSex()!=null){ 
    user.setSex(u.getSex()) 
} 

Gibt es eine richtig/falsch Weg, dies zu erreichen, oder ist es ein Fall nur tun, was am einfachsten ist?

Antwort

3

PUT Anforderungen müssen idempotent sein und als Nutzlast eine vollständige Darstellung der Entität bereitstellen, die sie ersetzt. (https://tools.ietf.org/html/rfc7231#section-4.3.4)

Die PUT Verfahren fordern, dass der Zustand der Zielressource mit dem durch die Darstellung in der Anforderungsnachricht Nutzlast eingeschlossen definierten Zustand erstellt oder ersetzt werden.

Eine partielle JSON-Objekt PUT Anfrage wäre ein PATCH mit Content-Type: application/merge-patch+json (https://tools.ietf.org/html/rfc7396)

Dinge zu denken. Sie könnten mehrere Clients haben, die gleichzeitig eine Entität aktualisieren. Wenn ein PUT verwendet wird, können Änderungen, die andere Clients vorgenommen haben, überschrieben werden.

In diesem Fall können Sie eine setzen, um zu überprüfen, ob das Objekt zwischen dem Zeitpunkt aktualisiert wurde, an dem der anfordernde Client die Entität abgerufen, Änderungen vorgenommen und die PUT/PATCH-Anforderung gesendet hat. Zum Beispiel könnte die Vorbedingung ein zuletzt aktualisierter Zeitstempel, Hash (Etag) oder eine Versionsnummer sein; Oder Sie können einen "last write wins" -Ansatz verwenden, der in letztendlich konsistenten Systemen üblich ist. Alles hängt von Ihrem System und der Situation ab.

Auf der Serverseite würden Sie, wenn Sie Teilupdates unterstützen, wie in Ihrem Beispiel angegeben, die in der Anforderung enthaltenen Eigenschaften festlegen und nur die spezifischen angeben, die bereitgestellt wurden.

Verwandte Themen