2017-07-20 10 views
0

REST経由でリソースを更新する場合、更新する値のみ、またはオブジェクト全体(現在の値と更新する値)を本文に含める必要がありますか?REST(PUT/POST)によるリソースの更新

ユーザーオブジェクトがこの

User (id, name, age, sex) 

のように見えると私はだけ彼の名前と年齢を更新したい場合は、私の要求は次のようになります。

PUT /users/1 

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

またはこのような:

PUT /users/1 

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

サーバー上でどのように見えるのですか。イデア?

@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); 
} 

または代わりに私がリクエストボディに含まれており、この

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

ような何かをされなかった変数を見つけることができ、これを達成するために、右/間違った方法はありますか、それがそうです一番簡単なことをやっているの?

答えて

3

PUT要求は冪等でなければならず、要求が置き換えられるエンティティの完全な表現をペイロードとして提供する必要があります。 (https://tools.ietf.org/html/rfc7231#section-4.3.4

PUT方法は、ターゲット・リソースの状態が が作成または表現によって定義された状態で交換することを要求する 要求メッセージペイロード内に封入します。

部分JSONオブジェクトPUT要求が考えるContent-Type: application/merge-patch+jsonPATCHhttps://tools.ietf.org/html/rfc7396

物事になります。 PUTを使用して、他のクライアントが行った変更を上書きする可能性があるので、複数のクライアントが同時にエンティティを更新している可能性があります。

この場合、要求元のクライアントがエンティティをフェッチし、変更を加えてPUT/PATCH要求を送信した時点でオブジェクトが更新されたかどうかを確認するように設定できます。例えば、事前条件は、最後に更新されたタイムスタンプ、ハッシュ(Etag)またはバージョン番号であり得る。または、最終的に一貫したシステムで一般的な「最終書き込み勝利」アプローチを使用することもできます。それはあなたのシステムと状況によって異なります。

サーバー側で、部分的な更新をサポートしている場合は、例のように、要求に含まれている一連のプロパティを特定し、提供されたものだけを設定します。

関連する問題