REST APIのPUTとPATCHの違いについて

アイキャッチ画像

最近、バックエンドについて少しずつ学び始めていて、RESTやGraphQL、CRUDといった概念を扱った書籍を読んでいます。まだ自分で本格的なAPIを実装したことはないのですが、読み進める中で「なるほど!」と目が覚めるような気づきがありました。

それが、「PUTとPATCHの違い」についてです。

単語としては知っていたけれど、その本当の意味と影響をちゃんと理解できていなかったな、と実感しました。この記事では、その気づきを自分の学びの記録としてまとめてみます。

PUTとPATCHって何が違うの?

REST APIでは、リソースを更新するために PUT や PATCH を使うことがあります。

「どちらも更新するときに使うもの」という理解でしたが、書籍の中でははっきりと違いが説明されていました。

・PUT:リソース全体を「置き換える(Replace)」

・PATCH:リソースの一部を「修正する(Modify)」

こちらを読んだときに、「PUTで一部のデータだけ送ると意図しない挙動になる可能性がありそう」と気づきました。

PUTで部分だけ送ると、消える可能性がある?

例えば、以下のようなユーザー情報があるとします。

{

  “name”: “old_name”,

  “email”: “user@example.com”,

  “height”: 170

}

このとき、ユーザー名(name)だけを変更したいと考えて、PUTメソッドで次のようなリクエストを送ったらどうなるでしょう?

{

  “name”: “new_name”

}

このリクエストは、「リソース全体をこの内容に置き換えてください」という意味になります。

つまり、email や height は送っていないため、サーバー側の実装によっては null や空の状態に上書きされてしまう可能性がありそうだと感じました。

正しい使い方は?

PUTを使う場合は、変更したい項目だけでなく、現在の他の値も含めて全体を送るのが基本のようです。

{

  “name”: “new_name”,

  “email”: “user@example.com”,

  “height”: 170

}

このようにすれば、「全体を置き換える」というPUTの意味と一致しますし、意図しない上書きを防ぐことができます。

一方、PATCHが使える場合は話がシンプルになります。PATCHは部分更新のため、変更したい項目だけを送っても大丈夫です。

{

  “name”: “new_name”

}

このようなPATCHリクエストであれば、name だけが変更されて、他の値はそのまま維持されます。

PUTしかないAPIをどう扱う?

生成AIに本件を相談してみると、「PUTしか提供されていないAPIもPJによっては存在する」ような回答が得られました。その場合は、クライアント側としては以下のような対応が必要になるのかなと思っています。

・現在のリソース情報をGETで取得

・変更したい値を編集

・他の値も含めて全体をPUTで送信

この流れを通じて、「PUT=置き換え」であることを再確認できますし、今後APIを使うときの心構えにもなりました。

学びとして感じたこと

まだAPIを設計したり実装したりした経験はありませんが、こうして「PUTとPATCHの違い」のような一見小さなポイントに注目することで、設計や実装時の注意点が自然と理解できるようになってくるんだなと実感しました。

これまでなんとなく使っていたHTTPメソッドにも、それぞれ意味と前提があり、それを意識するだけで「この設計、意図どおりに動くのかな?」と考えられるようになるのかなと感じています。

まとめ:知識を持っていると、ハマりを未然に防げる

今回の気づきは、あくまで書籍を読んでいての学びですが、このような「設計において注意すべきこと」って、知らなければハマってしまう部分なんだろうと思います。

今後、フロントエンドやバックエンドの実装を進める中で、「PUTなのかPATCHなのか?」「APIの仕様はどこまで明確になっているか?」といった視点を持って取り組めるようになるといいなと思っています。

今はまだ学習中の立場ですが、だからこそ「なるほど!」と思った瞬間をこうして残しておくことが、将来的に大きな助けになる気がします。