はじめに
「ここにプログラマーはいるか?」
ABC 「いません」
「そうか、なら良い、ところでユーザー名の変更につかうメソッドは?」
A 「POST」
B 「PUT」
C 「PATCH」
「Aを連れていけ」
「うわぁああ」
みなさんは連れて行かれるようなプログラマーでしたでしょうか?
私はつい最近「POST」「PUT」「PATCH」をしっかり説明できないエンジニアでした
いままでなんとなくでこれらのメソッドを利用しており、たまたまとあることをきっかけにこのAPIはPOSTかPUTどちらが適切なのだろうかと考えて違いをはっきり理解しました
今回は案外多くの人がなんとなくで利用しているであろうメソッド3つの違いを紹介していきます
なぜPOST/PUT/PATCHはあいまになるのか
そもそもなぜPOST・PUT・PATCHが混ざってしまいあいまになっている人が多いのでしょうか?
- PUTとPATCHはどちらも更新で利用される
- 各メソッドの使用法がフレームワークやAPI設計の方針によって異なる場合がある(例えば、一部のAPIではPUTで部分更新を許可している)
- メソッドは学習初期からでてくるので曖昧なまま先に進みやすい
この3つがあげられると思っています。
POSTとPUTの違い
まずはわかりやすくPOSTとPUT(PATCH)の違いから説明していきます。
Zalando RESTful APIを読むとREST APIのことについてかなり網羅的に紹介されているので引用してくると
POSTはコレクションのエンドポイントにとっての意味は"URLによって識別されるリソースのコレクションにオブジェクトを追加してください"という意味
PUTは "URLが表すリソースを、このオブジェクトで既存のリソースと置き換えてください" という意味
これで理解できた人は次へ進んでくださいなのですが、個人的にはすこしイメージがつきづらかったので次はパスで説明します
たとえばPOSTを使うケースではパス設計が以下のようになります
# POST
/v1/users
PUTを使う場合は
# PUT
/v1/users/12345
つまり、POSTはユーザー自体を追加する時に使い、PUTはユーザー(12345)の持っている要素を更新する時(例えばnameなど)に使います
PUTとPATCHの違い
PATCHは "この変更リクエストに対応するURLで特定されるリソースを変更してください" という意味
つまりPATCHはリソースすべてを変更するリクエストであり、もしリソースが存在しない場合は新規作成になります
# PUT
curl -XPUT /v1/users/12345 -d '{ "age": 31 }'
PUTの場合は、ユーザー(ID: 12345)がいる前提でユーザーの年齢を31歳に更新します
# PATCH
curl -XPUT /v1/users/12345 -d '{ "name": "mina", "age": 31, "email": "hogefuga@a.c" }'
PATCHの場合は、ユーザー(ID: 12345)がいれば、更新がされます
たとえばユーザー(name: mina, age: 30, email: hogefuga@a.c)がいるなら、年齢だけが更新された可能用になります。すべての項目を更新しますが、結果的には年齢だけが更新されたようにみえます
もしユーザー(12345)が存在しなかった場合は新規にユーザーが追加されます(POSTのような感じです)
おわりに
案外長年エンジニアをやっている人でもちゃんと説明できない人が多く、私もこの記事を書くまではふわふわして説明しろと言われたら説明できませんでした
強いエンジニアになるには、こういう基本はしっかりと抑えておくことは必須です
ぜひともこの時期を読んだあなたは同僚に質問をしてみるとよいかもしれません
ここまで読んでいただけた方はいいねとストックよろしくお願いします。
@Sicut_study をフォローいただけるととてもうれしく思います。
また明日の記事でお会いしましょう!
JISOUのメンバー募集中!
プログラミングコーチングJISOUでは、新たなメンバーを募集しています。
実践的なカリキュラムで、あなたのエンジニアとしてのキャリアを最短で飛躍させましょう!
興味のある方は、ぜひホームページからお気軽にカウンセリングをお申し込みください!
▼▼▼