結論から言うと
POSTとPUTはどちらもリソースの作成に使用できます。
しかし、一般的には以下のように使用されます。
- POST・・・リソースの追加
- PUT・・・リソースの更新
なぜこのようになるかというのはこれから解説していきます。
HTTP通信
そもそもHTTPメソッドを知らない方はPOST?PUT?と頭を抱えると思います。
まずは前提としてHTTP通信についてご説明します。
HTTP通信はクライアントとサーバー間での通信のことです。
クライアントとはブラウザを使っているユーザの画面上の処理のことで、クリックしたときの処理など画面上の目に見える動きのことです。
サーバーとはブラウザを開いたときに裏で動くWebサーバーの処理のことで、URLを検索したらそれに合った画面を返すといった画面に見えない処理のことです。
ブラウザで検索する場合の例
①クライアントであるユーザがブラウザでURLを入力します。そうするとクライアントからWebサーバーにURL等やユーザの情報が送信されます。このクライアントからサーバーへの通信を「HTTPリクエスト」と言います。
②WebサーバーがHTTPリクエストを受け取り、この場合は受けとったURLに対応した画面(HTML等)の情報を返します。このサーバーからクライアントへの通信を「HTTPレスポンス」と言います。
③クライアントであるブラウザがHTTPレスポンスで受け取った情報から画面を表示します。
これがHTTP通信と言います。皆さんが普段なんとなく行っているブラウザ検索は裏でこのような処理が行われています。
ちなみに他には、お問い合わせフォームを送信したときに入力内容がサーバーにHTTPリクエストとして送信され、サーバー側で入力した内容をデータベースに登録するといった処理があげられます。
HTTPメソッドとは
ではHTTP通信をご説明したところで本題のHTTPメソッドをご説明します。
HTTPメソッドとはその名の通りHTTP通信で使うメソッド(方法)のことであり、HTTPメソッドは厳密にいうとHTTPリクエストメソッドと言います。
わかりやすく言うと、HTTPリクエストメソッドとはクライアントからサーバーに送信しているHTTPリクエストの方法(メソッド)のことであり、いくつか種類があります。
この種類によってクライアントからサーバーにHTTPリクエストを送るときに、サーバー側での処理の種類を伝えているのです。
この中にPOST、PUTといったメソッドがあります。
ではHTTPメソッドの種類についてみていきます。
HTTPリクエストメソッドの種類
HTTPメソッドは厳密にはもっとありますが、その中でも有名なのをご紹介します。
GET
指定したリソースを取得する。
クライアントがサーバーからデータを取得するときに使う。
POST
指定したリソースを追加する。
クライアントがサーバーにデータを追加するときに使う。
PUT
指定したリソースを更新する、追加する。
クライアントがサーバーにデータを更新、追加するときに使う。
DELETE
指定したリソースを削除する。
クライアントがサーバーからデータを削除するときに使う。
CRUDでいうと
このデータを追加、更新、取得、削除のことをよくCRUDとまとめて言われます。
このCRUDは各種英語の頭文字をとっており、それぞれHTTPメソッドと対応付けされます。
- 作成(Create):POST
- 読み込み(Read):GET
- 更新(Update) :PUT
- 削除(Delete) DELETE
実際はサーバー側でデータベースからSQLを使って各種処理が実装されます。
POSTとPUTの違い
ここまででHTTPメソッドについて書いてきましたが、やっと本題のPOSTとPUTの違いをご説明します。
CRUDのところでも書きましたが一般的にPUTは更新に使われます。しかし実際はPOSTとPUTのどちらともデータを追加するときに使うことができます。
ではなぜ一般的にPUTが更新に使われるかというと、HTTPリクエストの情報(パラメータ)の渡し方に違いがあります。
HTTPリクエスト内にはヘッダとボディが用意されています。
その中で、どちらもボディに入るのですが、PUTの場合は目に見える形で送信されます。
例えばURLなどわかりやすいです。
URLはIDやカテゴリーなどのパラメータを含めることで、目に見える形でページが開かれます。これは更新ではなく参照になりますが、更新も同じで設計上URLにパラメータ含めるケースが多いです。
また送信できるパラメータのサイズがPUTの方が小さいため、PUTでたくさんのデータを送ろうとするとエラーになってしまい、バグの原因にもなります。
HTMLで実際に見てみる
HTMLのformタグの動きを見てみましょう。formタグはボタンクリックなどでフォームがサブミット(クリック)されたときにHTTPリクエストを送ります。
まずはformタグのメソッドにPOSTを指定した場合です。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<form method="POST">
テキスト1<input type="text" name="example1">
テキスト2<input type="text" name="example2">
テキスト3<input type="text" name="example3">
<input type="submit" value="送信">
</form>
</body>
</html>
このHTMLをブラウザに表示して、各テキストボックスを入力して送信ボタンを押してみてください。
送信ボタンを押してもURLが変わらないと思います。これはテキストボックスに入力されたものがパラメータで渡されるのですが、ボディにパラメータが入るので目に見えなくなっています。
※開発者ツールで見ようとすれば見えます。
ではformタグのmethodをGETにしてください。また同じようにHTMLをブラウザに表示して、各テキストボックスを入力して送信ボタンを押してみてください。
URLを確認するとこのようなパラメータが追加されるはずです。
&example1=foo&example2=bar&example3=hoge
これはGETにするとパラメータがURLに含まれる形で送信されるので目に見えるといったことがわかります。
PUTでも今回のGETと同様に扱います。
このパラメータのことをクエリパラメータやクエリストリングと言います。
なお、HTMLの実行方法が知りたい方はこちらの記事をご覧ください。
まとめ
まとめると、
- POSTはリソースの追加、PUTはリソースの更新に使用する。
- POSTとPUTの一番の違いはパラメータの扱い方である。
- POSTはパラメータがユーザに見えるが、PUTはパラメータがユーザに見えてしまう。
となります。
実際は「POSTは追加、PUTは更新」とだけ覚えておけばいいのですが、「PUTもリソースの追加に使えるらしいよ。」と気になった人のために少し整理してみました。
HTTP通信はネットワークが絡んでいて少し抵抗があるかもしれませんが、webアプリケーションではよく使うものなので理解しておいた方がいいと思います。特にサーバーサイドエンジニアの方は必須ですね。
今回の内容をもう少し詳しく知りたい方は『Webを支える技術』を読むのがおすすめです!
最後まで読んで頂きありがとうございました。