押さえておきたいHTTPメソッドのPOSTとPUTの違い

プログラミング
スポンサーリンク

結論から言うと

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リクエスト内にはヘッダとボディが用意されています。ヘッダは送信するときに目に見える部分であり、ボディは見えない部分です。

POSTの場合はパラメータがボディに入ります。

PUTの場合はパラメータがヘッダに入ります。

これにより、PUTでリソースの追加しようとするとパラメータがすべて目に見えてしまいセキュリティ上良くないです。これが一番のPOSTとPUTの使い方の違いだと言えます。

また送信できるパラメータのサイズがPUTの方が小さいため、PUTでたくさんのデータを送ろうとするとエラーになってしまい、バグの原因にもなります。

HTMLで実際に見てみる

HTMLのformタグの動きを見てみましょう。formタグはボタンクリックなどでフォームがサブミット(クリック)されたときにHTMLリクエストを送ります。

まずは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をPUTにしてください。また同じようにHTMLをブラウザに表示して、各テキストボックスを入力して送信ボタンを押してみてください。

URLを確認するとこのようなパラメータが追加されるはずです。

&example1=foo&example2=bar&example3=hoge

これはPUTにするとヘッダにパラメータが入るので目に見えるといったことがわかります。

このパラメータのことをクエリパラメータやクエリストリングと言います。

なお、HTMLの実行方法が知りたい方はこちらの記事をご覧ください。

まとめ

まとめると、

  • POSTはリソースの追加、PUTはリソースの更新に使用する。
  • POSTとPUTの一番の違いはパラメータの扱い方である。
  • POSTはパラメータがユーザに見えるが、PUTはパラメータがユーザに見えてしまう。

となります。

実際は「POSTは追加、PUTは更新」とだけ覚えておけばいいのですが、「PUTもリソースの追加に使えるらしいよ。」と気になった人のために少し整理してみました。

HTTP通信はネットワークが絡んでいて少し抵抗があるかもしれませんが、webアプリケーションではよく使うものなので理解しておいた方がいいと思います。特にサーバーサイドエンジニアの方は必須ですね。

今回の内容をもう少し詳しく知りたい方は『Webを支える技術』を読むのがおすすめです!

最後まで読んで頂きありがとうございました。

スポンサーリンク
プログラミング
スポンサーリンク
この記事を書いた人
まさき

25歳の社会人3年目のシステムエンジニアです。
未経験からIT企業に入社して業務や、業務外でも学習することでプログラミングが書けるようになりました。
得意なのはHTML,CSS,JavaScript。最近はVue.jsとGASを勉強中です。
本を読むことが好きなのでIT技術書以外にもたくさん読みます。
好奇心旺盛でとりあえずやってみる精神です。
楽しいことが生きがいで、仕事も私生活も楽しくなるように日々奮闘中。

まさきをフォローする
シェアする
まさきのエンジニア図書館
タイトルとURLをコピーしました