概要
このクイック記事では、HTTP PUT と PATCH 動詞間の違いと 2 つの操作のセマンティクスについて説明します。
Spring を使用して、これら 2 種類の操作をサポートする 2 つの REST エンドポイントを実装し、その違いと正しい使用方法について理解を深めます。
When to Use Put and When Patch?
シンプルで少し単純な文から始めます。
クライアントが既存のリソースを完全に交換したいとき、PUT を使用できます。
たとえば、Resource の単一のフィールドを更新する場合、完全な Resource 表現を送信することは面倒で、多くの不要な帯域幅を使用する可能性があります。 PUT はべき等です。PATCH はべき等であることができますが、そうする必要はありません。 PUT はべき乗ですが、PATCH はべき乗である必要はありません。したがって、実装する操作のセマンティクスに応じて、この特性に基づいてどちらかを選択することもできます。
PUT および PATCH ロジックの実装
複数のフィールドを持つ HeavyResource を更新するための REST API を実装することにしましょう。
さて、そのアドレス フィールドがクライアントによって頻繁に更新されるとします。 この場合、すべてのフィールドを含む HeavyResource オブジェクト全体を送信する必要はありませんが、PATCH メソッドを使用してアドレス フィールドのみを更新する機能は必要です。
public class HeavyResourceAddressOnly { private Integer id; private String address; // ...}
次に、PATCH メソッドを活用して部分的な更新を送信できます。
@PatchMapping("/heavyresource/{id}")public ResponseEntity<?> partialUpdateName( @RequestBody HeavyResourceAddressOnly partialUpdate, @PathVariable("id") String id) { heavyResourceRepository.save(partialUpdate, id); return ResponseEntity.ok("resource address updated");}
このより詳細な DTO により、更新が必要なフィールドのみを送信でき、全体の HeavyResource を送信するオーバーヘッドが発生しません。
これらの部分的な更新操作が多数ある場合、それぞれのアウトに対してカスタム DTO を作成するのを省略して、マップのみを使用することもできます。 まず、PUT メソッドによる完全なリソースの更新をテストしたいと思います:
mockMvc.perform(put("/heavyresource/1") .contentType(MediaType.APPLICATION_JSON_VALUE) .content(objectMapper.writeValueAsString( new HeavyResource(1, "Tom", "Jackson", 12, "heaven street"))) ).andExpect(status().isOk());
部分的な更新の実行は PATCH メソッドを使用して実現します:
mockMvc.perform(patch("/heavyrecource/1") .contentType(MediaType.APPLICATION_JSON_VALUE) .content(objectMapper.writeValueAsString( new HeavyResourceAddressOnly(1, "5th avenue"))) ).andExpect(status().isOk());
より一般的なアプローチに対するテストも書くことができます。
HashMap<String, Object> updates = new HashMap<>();updates.put("address", "5th avenue");mockMvc.perform(patch("/heavyresource/1") .contentType(MediaType.APPLICATION_JSON_VALUE) .content(objectMapper.writeValueAsString(updates)) ).andExpect(status().isOk());
Handling Partial Requests With Null Values
PATCHメソッドの実装を書く場合、HeavyResourceAddressOnlyのaddressフィールドの値としてnullを取得した場合の処理方法を契約書に明記する必要があります。
{ "id" : 1, "address" : null}
クライアントが次の要求を送信したとします。
NULL を処理するための戦略を 1 つ選び、すべての PATCH メソッドの実装でそれにこだわるべきです。
結論
このクイック チュートリアルでは、HTTP PATCH と PUT のメソッドの違いを理解することに焦点を当てました。
PUT メソッドで Resource を更新し、PATCH で部分的に更新するシンプルな Spring REST コントローラーを実装しました。
これらのすべての例とコード スニペットの実装は GitHub プロジェクトで見つけることができます – これは Maven プロジェクトですので、そのままインポートして実行するのは簡単でしょう。
Learn Spring コースで Spring 5 と Spring Boot 2 を始めましょう :
>> CHECK OUT THE COURSE