既存のMongoDBドキュメントを更新するにはPUTとPOSTのどちらが良いか

WebAPI
HTTPメソッドのPUTとPOSTの使い分け

はじめに

ところで皆さんPUTPOSTってどう使い分けていますか?
今回はHTTPリクエストを一通り使ってみるような流れにしてしまったので、PUTを使って更新することにしましたが、この際はっきりさせておきたいと思います。

調べてみた

今回の先生

この本を参考にしました。

オライリー本ですので、かなりしっかりした内容です。WebAPIとはなんぞやという足元固めから、データやエンドポイントの設計まで基礎から実践まで一通り把握することができます。最近はネットを漁れば大抵のことがなんとかなるフシもありますが、やはり書籍から学ぶことにはまだまだ太刀打ちできないですね。

先生曰く、PUTとPOSTとは

Web API: The Good Parts曰く、PUTPOSTは意味合いが異なるとのこと。

リクエスト意味合い
PUT更新したいリソースのURIそのものを指定して、内容を書き換えるもの
POST指定したURIに送信したデータを紐付けるもの

Web API: The Good PartsではPOSTの説明に従属させるものという表記がありますが、私にはちょっと解りにくかった。なので、紐付けると解釈しました。

自分の考えと比べてみる

私はこれまで、新しくMongoDBにドキュメントを追加するときはPOST、ドキュメントの更新にはPUTを使ってきました。

リクエスト私めのイメージ
PUTすでにあるドキュメントに新しい情報を置きに行くイメージ
POSTコレクションにドキュメントを投稿するイメージ

さほど深く考えずに言葉のイメージから選んでいたのですが、概ね先生と考えの方向性は合ってたと言えそうです。

POSTの方をちょっと補足すると、URIの示す先がコレクションであり、その中にドキュメントが詰め込まれているという意味で紐付けられていると言えます。

注意点

これもWeb API: The Good Partsで知ったのですが、クライアント側の環境や条件によっては、PUTPOSTのメソッドが使えない場合があるようです。

内々で使うAPIなら構わないかもしれないですが、不特定多数の人に使っていただく方針ならば、GETPOSTだけで扱えるようにしておくなど、考慮が必要そうです。
使っていただく人に負担を掛けない設計を心がけていきたいです。クライアント側の環境や条件はAPI提供側がコントロールできるものでもないですし。

まとめ

PUTPOSTの違いと使い分けの方針がわかってスッキリしました。
ずっとRDBを扱っていたので無茶を承知で無理やり対応付けてみると、SQLのUPDATE文で示される処理はPOSTを使い、INSERT文で示される処理はPUTを使うということですね。

余談

……PATCHもあるよ。

PUTに比べると若干影が薄いですが、PUTの局所版のようなものです。巨大なバイナリを持つドキュメントの一部に変更をかけるときに、PUTを使うとデータ全部をやり取りして無駄が多くなります。一方、PATCHは変更したい部分だけやり取りするので無駄が少なくなります。