HTTP PUT vs HTTP PATCH in a REST API

概要

このクイック記事では、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

コメントを残す

メールアドレスが公開されることはありません。