More than 1 year has passed since last update.

新年度が始まりスーツ集団をよく見かけます。

昔、新人エンジニアが悲しい感じだったのを思い出したので。新人エンジニアに向けて。

自身もそこまで変わらないのだけれども。

formを習い、GETとPOST の違いにて今一要領を得ない説明をされた人たちに向けて少しでもプラスになればと書いてみます。

一部putやdelete等のよくわからない言葉が出てきますが、寛容な心でスルーしてください。


HTTP通信とWEBの基本

WEBにおいて基本的にサーバとのやりとりはHTTPというプロトコルを用います。

ブラウザからサーバへの要求することをリクエストといいます。

サーバからブラウザへ応答することをレスポンスといいます。

WEBの世界での基本的なやりとりはリクエスト/レスポンス(R/R)で成立しています。

ex.検索

ブラウザはサーバに該当するサイトを教えてくださいと要求します(リクエスト)

サーバは要求に対して、色々な処理をして、結果を返答します(レスポンス)

レスポンスを元にブラウザは検索結果を表示します。


そもそもGET,POSTってなんなの

ブラウザとサーバがやり取りする際HTTP通信を使うという話をしましたが、

HTTP通信には、いくつかの仕様が取り決められています。

GET, POSTというのは、仕様で取り決められたHTTPメソッドというものの一部です。

この他にもPUTやPATCH,HEAD,DELETE等もあります。

あなたはブラウザからサーバへリクエストする際に、HTTPメソッドを選んで通信することができます。

その選択肢の中にGET, POSTというものはあります。

ブラウザでURLを入力したりするときはあなたは無意識にGETメソッドを使っています。


実際何が違うんだよ


リクエストの送り方が違う

サーバへのリクエストの送り方が違う、と言う話です。

GETはURLに付加してリクエストします


  • GET: /foo/bar?p=........&u=.........

POSTはBodyに含めてリクエストします。


  • POST: /foo/bar

  • param:p:...........,u.........

GETはURLに直接付加するので目でパラメータを見ることができます。

POSTはBodyに含めるので目で見ることはできません。

後はバイナリで送れるのとか、サイズ制限があるのとか、GETとPOSTでリクエストする際の仕様が異なっています。

恐らく、最も分かりやすい違いだと思います。

※GETは目に見えるけど、POSTは見えないから安全と言う人がたまにいますが、これは間違いです。目に見えてないだけです。通信を盗聴されればどちらにも差はありません。


ブックマークできる

以下のコメントを@Zuishin さんからいただきました。追記いたします、ご指摘ありがとうございます。


何がちがうかの最たるものである「ブックマークできるかどうか」について触れておいた方が良いのではないでしょうか?


ご存じだとは思いますが、ブックマークとはURLを登録する機能のことです。

GETを用いた場合はパラメータがURLに付加されるため、ブックマークすることができます。

POSTを用いた場合は、パラメータがBodyに含まれてしまうため、ブックマークができません。

例えば、formに名前を入力して検索結果を/foo/barで表示させるアプリを考えます。


  1. formで値を入力してsubmitします。(name: hoge)

  2. submitすると/foo/barというURLへ遷移します。

  3. GETだと/foo/bar?name=hoge, POSTだと/foo/barというURLで検索結果が表示されます。

GETだと/foo/bar?name=hogeというURLをブックマークできるので、name=hogeで検索したときの検索結果をブックマークできます。

POSTだとURLは/foo/barなのでname=hogeで検索したときの検索結果をブックマークすることができません。


持つべき性質が違う

HTTPメソッドごとに持つべき性質が違います。

ここでは詳しく説明しませんが、


  • GETは冪等かつ安全です。

  • POSTは冪等でないかつ安全でないです。

よくわからないかもしれませんが、違います。

※RESTなどを学ぶにあたっては大切な違いではあります。

※宗教論とのコメントを頂きました。ITの世界では色々な思想が渦巻いています。


使用用途が違う

持つべき性質が違うと話しましたが、性質が違うのであれば、使用用途も変わってきます。

GETはなにかを取得するときに使うべきものです。

POSTはなにかを新しく登録するときに使うものです。

削除や変更はというと、それぞれDELETEやPUT(PATCH)で行うべきです。


PUTやDELETEなんてきいたことないよ

なぜ、GET,POSTの話は出てくるのに、PUT,DELETE は耳にしなかったのでしょうか? 

これはとても単純な話です。

HTMLのformタグには、GET とPOST しか存在しないのです。

Webサービスを作る上でまずHTMLを触り始めた人にとって馴染みのないものであるのは当然です。

今は他にもあるんだなー程度に流してください


でも先輩はなんでもPOSTでやってたよ

現実はそんなものです。

POSTだけで作られたものなど世にはたくさんあるのです。

そしてこれが、恐らく初心者が違いを理解するのに苦労する理由だと思います。

本当はGETでやるべきこともPOSTでできてしまうのです。

やろうと思えばすべての処理をPOSTで作れてしまうのです。

先輩はそうやって作っているのです。

この辺りは思想的な話もあるので、何とも言えない部分です。


最後に

最近、POSTとGETを今一理解できない半分くらいは世の中が悪いのかなと思っています。

習うより慣れましょう。

間違っているところがあればご指摘ください。