はじめに
ところで皆さんPUT
とPOST
ってどう使い分けていますか?
今回はHTTPリクエストを一通り使ってみるような流れにしてしまったので、PUT
を使って更新することにしましたが、この際はっきりさせておきたいと思います。
調べてみた
今回の先生
この本を参考にしました。
オライリー本ですので、かなりしっかりした内容です。WebAPIとはなんぞやという足元固めから、データやエンドポイントの設計まで基礎から実践まで一通り把握することができます。最近はネットを漁れば大抵のことがなんとかなるフシもありますが、やはり書籍から学ぶことにはまだまだ太刀打ちできないですね。
先生曰く、PUTとPOSTとは
Web API: The Good Parts曰く、PUT
とPOST
は意味合いが異なるとのこと。
リクエスト | 意味合い |
---|---|
PUT | 更新したいリソースのURIそのものを指定して、内容を書き換えるもの |
POST | 指定したURIに送信したデータを紐付けるもの |
Web API: The Good PartsではPOST
の説明に従属させるもの
という表記がありますが、私にはちょっと解りにくかった。なので、紐付ける
と解釈しました。
自分の考えと比べてみる
私はこれまで、新しくMongoDBにドキュメントを追加するときはPOST
、ドキュメントの更新にはPUT
を使ってきました。
リクエスト | 私めのイメージ |
---|---|
PUT | すでにあるドキュメントに新しい情報を置きに行くイメージ |
POST | コレクションにドキュメントを投稿するイメージ |
さほど深く考えずに言葉のイメージから選んでいたのですが、概ね先生と考えの方向性は合ってたと言えそうです。
POST
の方をちょっと補足すると、URIの示す先がコレクションであり、その中にドキュメントが詰め込まれているという意味で紐付けられていると言えます。
注意点
これもWeb API: The Good Partsで知ったのですが、クライアント側の環境や条件によっては、PUT
とPOST
のメソッドが使えない場合があるようです。
内々で使うAPIなら構わないかもしれないですが、不特定多数の人に使っていただく方針ならば、GET
とPOST
だけで扱えるようにしておくなど、考慮が必要そうです。
使っていただく人に負担を掛けない設計を心がけていきたいです。クライアント側の環境や条件はAPI提供側がコントロールできるものでもないですし。
まとめ
PUT
とPOST
の違いと使い分けの方針がわかってスッキリしました。
ずっとRDBを扱っていたので無茶を承知で無理やり対応付けてみると、SQLのUPDATE
文で示される処理はPOST
を使い、INSERT
文で示される処理はPUT
を使うということですね。
余談
……PATCH
もあるよ。
PUT
に比べると若干影が薄いですが、PUT
の局所版のようなものです。巨大なバイナリを持つドキュメントの一部に変更をかけるときに、PUT
を使うとデータ全部をやり取りして無駄が多くなります。一方、PATCH
は変更したい部分だけやり取りするので無駄が少なくなります。